Thời gian kiểm tra
Bạn không thấy đánh giá của các chức năng riêng lẻ trên mỗi hàng trong EXPLAIN
đầu ra.
Kiểm tra với EXPLAIN ANALYZE
để có được thời gian truy vấn thực tế để so sánh hiệu quả tổng thể. Chạy một vài lần để loại trừ các tạo tác bộ nhớ đệm. Đối với các truy vấn đơn giản như thế này, bạn sẽ nhận được các con số đáng tin cậy hơn cho tổng thời gian chạy với:
EXPLAIN (ANALYZE, TIMING OFF) SELECT ...
Yêu cầu Postgres 9.2+ . Theo tài liệu :
Ngăn đánh giá lặp lại
Thông thường, các biểu thức trong một truy vấn con được đánh giá một lần . Nhưng Postgres có thể thu gọn các truy vấn con tầm thường nếu nó cho rằng điều đó sẽ nhanh hơn.
Để đưa ra rào cản tối ưu hóa, bạn có thể sử dụng CTE
thay vì truy vấn con. Điều này đảm bảo mà Postgres tính toán ST_SnapToGrid(geom, 50)
một lần duy nhất:
WITH cte AS (
SELECT ST_SnapToGrid(geom, 50) AS geom1
FROM points
)
SELECT COUNT(*) AS n
, ST_X(geom1) AS x
, ST_Y(geom1) AS y
FROM cte
GROUP BY geom1; -- see below
Tuy nhiên, điều này có thể chậm hơn hơn một truy vấn con do chi phí nhiều hơn cho một CTE. Cuộc gọi chức năng có lẽ rất rẻ. Nói chung, Postgres biết rõ hơn cách tối ưu hóa kế hoạch truy vấn. Chỉ đưa ra rào cản tối ưu hóa như vậy nếu bạn biết rõ hơn.
Đơn giản hóa
Tôi đã thay đổi tên của điểm được tính trong truy vấn con / CTE thành geom1
để làm rõ nó khác với geom
ban đầu . Điều đó giúp làm rõ quan trọng hơn điều ở đây:
GROUP BY geom1
thay vì:
GROUP BY x, y
Điều đó rõ ràng là rẻ hơn - và có thể có ảnh hưởng đến việc liệu lệnh gọi hàm có được lặp lại hay không. Vì vậy, đây có lẽ là nhanh nhất:
SELECT COUNT(*) AS n
, ST_X(ST_SnapToGrid(geom, 50)) AS x
, ST_y(ST_SnapToGrid(geom, 50)) AS y
FROM points
GROUP BY ST_SnapToGrid(geom, 50); -- same here!
Hoặc có thể thế này:
SELECT COUNT(*) AS n
, ST_X(geom1) AS x
, ST_y(geom1) AS y
FROM (
SELECT ST_SnapToGrid(geom, 50) AS geom1
FROM points
) AS tmp
GROUP BY geom1;
Kiểm tra cả ba với EXPLAIN ANALYZE
hoặc EXPLAIN (ANALYZE, TIMING OFF)
và xem cho chính mình. Kiểm tra>> đoán.