PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Sử dụng lại giá trị chọn được tính toán

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách so sánh hai mảng và chỉ chọn các phần tử không phù hợp Trong postgres

  2. Sắp xếp / đối chiếu / thứ tự không chính xác với khoảng trắng trong Postgresql 9.4

  3. Kết nối với PostgreSQL trong IRI Workbench

  4. Quản lý đóng băng trong PostgreSQL

  5. Cách đơn giản để thiết lập lại cơ sở dữ liệu Django PostgreSQL?