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

Truy vấn theo tọa độ mất quá nhiều thời gian - các tùy chọn để tối ưu hóa?

Bạn sẽ tốt hơn nhiều khi sử dụng chỉ mục không gian sử dụng cây R (về cơ bản là chỉ mục hai chiều, hoạt động bằng cách chia không gian thành các hộp) và sẽ hoạt động tốt hơn nhiều so với lớn hơn, ít hơn so với so sánh trên hai vĩ độ riêng biệt , giá trị lon trên loại truy vấn này. Trước tiên, bạn sẽ cần tạo một loại hình học, sau đó bạn lập chỉ mục và sử dụng trong truy vấn của mình thay vì các cặp vĩ độ / kinh độ riêng biệt mà bạn hiện đang sử dụng.

Phần sau sẽ tạo một loại hình học, điền nó và thêm chỉ mục vào nó, đảm bảo rằng nó là một điểm và ở vĩ độ / kinh độ, được gọi là EPSG:4326

alter table event add column geom geometry(POINT, 4326);
update event set geom=ST_SetSrid(ST_MakePoint(lon, lat), 4326);
create index ix_spatial_event_geom on event using gist(geom);

Sau đó, bạn có thể chạy truy vấn sau để nhận các sự kiện của mình, truy vấn này sẽ sử dụng các giao điểm không gian, sẽ sử dụng chỉ mục không gian của bạn:

Select * from events where ST_Intersects(ST_SetSRID(ST_MakeBox2D(ST_MakePoint(swLon, swLat), 
    ST_MakePoint(neLon, neLat)),4326), geom) 
order by relevancy desc limit 100;

Bạn tạo hộp giới hạn cho giao điểm của mình bằng cách sử dụng ST_MakeBOX2D với hai tập hợp điểm, sẽ nằm trên các góc chéo của hộp giới hạn, vì vậy SW và NE hoặc cặp NW và SE, cả hai sẽ hoạt động.

Khi bạn chạy giải thích về điều này, bạn sẽ thấy rằng chỉ mục không gian được bao gồm. Điều này sẽ hoạt động tốt hơn rất nhiều so với hai chỉ mục riêng biệt trên cột kinh độ và vĩ độ, vì bạn chỉ đánh một chỉ mục được lập chỉ mục, được tối ưu hóa cho tìm kiếm theo không gian, thay vì hai cây B. Tôi nhận thấy rằng điều này đại diện cho một cách làm khác và không trả lời câu hỏi ban đầu của bạn, ngoại trừ một cách gián tiếp.

CHỈNH SỬA: Mike T đã đưa ra một điểm rất hay rằng đối với các tìm kiếm hộp giới hạn trong 4326, sử dụng kiểu dữ liệu hình học và toán tử &&vì SRID sẽ bị bỏ qua, ví dụ:

 where ST_MakeBox2D(ST_MakePoint(swLon, swLat), ST_MakePoint(neLon, neLat)) && geom



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tôi có nên bao gồm các CHỌN trong một giao dịch không?

  2. psycopg2 COPY bằng cách sử dụng cursor.copy_from () bị đóng băng với đầu vào lớn

  3. Postgres:nhận số hàng tối thiểu và tối đa trong nhiều bảng quan hệ

  4. Postgres:cấp quyền truy cập cho một vai trò / người dùng cho các bảng trong tương lai được tạo bởi một vai trò / người dùng khác

  5. Docker container cho Postgres 9.1 không để lộ cổng 5432 cho máy chủ