PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Kueri berdasarkan koordinat terlalu lama - opsi untuk dioptimalkan?

Anda akan jauh lebih baik menggunakan indeks spasial yang menggunakan R-tree (pada dasarnya indeks dua dimensi, yang beroperasi dengan membagi ruang ke dalam kotak), dan akan berkinerja jauh lebih baik daripada lebih besar dari, kurang dari perbandingan pada dua lat terpisah , nilai lon pada jenis kueri ini. Anda harus membuat tipe geometri terlebih dahulu, yang kemudian Anda indeks dan gunakan dalam kueri Anda alih-alih pasangan lintang/bujur terpisah yang sedang Anda gunakan.

Berikut ini akan membuat tipe geometri, mengisinya, dan menambahkan indeks ke dalamnya, memastikan bahwa itu adalah titik dan dalam lat/lon, yang dikenal sebagai 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);

Kemudian Anda dapat menjalankan kueri berikut untuk mendapatkan acara Anda, yang akan menggunakan perpotongan spasial, yang seharusnya menggunakan indeks spasial Anda:

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;

Anda membuat kotak pembatas untuk persimpangan Anda dengan menggunakan ST_MakeBOX2D dengan dua set titik, yang akan berada di sudut diagonal kotak pembatas, sehingga pasangan SW dan NE atau NW dan SE, keduanya akan berfungsi.

Ketika Anda menjalankan jelaskan ini, Anda akan menemukan bahwa indeks spasial disertakan. Ini akan berkinerja jauh lebih baik daripada dua indeks terpisah pada kolom lon dan lat, karena Anda hanya menekan satu indeks, dioptimalkan untuk pencarian spasial, daripada dua B-tree. Saya menyadari bahwa ini mewakili cara lain untuk melakukannya dan tidak menjawab pertanyaan awal Anda, kecuali secara tidak langsung.

EDIT: Mike T telah membuat poin yang sangat baik bahwa untuk pencarian kotak pembatas di 4326, lebih tepat dan lebih cepat menggunakan tipe data geometri dan operator &&karena SRID akan tetap diabaikan, misalnya,

 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. Kesalahan PostgreSQL 9.0:kolom t.tgisconstraint tidak ada

  2. Mengubah bidang Enum menggunakan Alembic

  3. Hapus CTE tidak dilakukan sampai pernyataan berikut selesai

  4. mengapa menulis dalam tabel mencegah vacuums di lain?

  5. SqlAlchemy (Postgres + Flask ):Bagaimana cara menjumlahkan banyak kolom?