Saya memiliki tabel PostgreSQL, dengan hampir 2 juta baris, dengan bidang panjang-lat coordinates
dalam formulir POINT(-73.4938 33.2405)
.
Andaikata ada indeks geospasial pada bidang itu, apa cara tercepat dan paling efisien untuk memilih semua baris dalam kotak pembatas yang berubah-ubah?
Kotak adalah seperti SW long-lat: -74.0042 40.7688
, NE long-lat: -73.8809 40.7984
.
postgis
performance
geography-data-type
Avishai
sumber
sumber
Jawaban:
Dengan asumsi batas kotak pembatas yang diberikan berada dalam sistem referensi spasial yang sama dengan koordinat yang tersimpan, dan Anda tahu operator spasial mana (berpotongan atau terkandung oleh) yang Anda butuhkan:
Atau, jika Anda lebih suka suara "mengandung" (bukan "berisi oleh")
WHERE
klausa harus dibalik:PS: Diberikan (oleh OP setelah penjelasan di atas) bahwa catatan adalah titik-titik sederhana, saya pikir perbedaan antara "berpotongan" dan "penahanan" menjadi sangat halus, hanya mempengaruhi titik-titik di tepi kotak pembatas.
sumber
What's the fastest ...?
: OP&&
dan@
tampaknya tidak berfungsi saat berpotongan dengan poligon Geometri. Dalam hal ini, gunakanST_Intersects(latlng_column,ST_GeomFromText('Polygon ((...))',4326))
atau sebagai alternatifST_Contains
sumber
Rupanya, saya tidak punya cukup poin untuk menambahkan komentar jadi saya menggunakan Jawaban ini hanya untuk mengatakan bahwa saya mencoba ST_MakeEnvelope vs matematika dibandingkan dengan "x> min_x dan x <max_x dan y> min_y dan y <max_y". ..pada rata-rata ST_MakeEnvelope mengambil 60 ms dan membandingkan matematika mengambil 155 ms pada permintaan bbox khusus saya.
Jadi pencarian spasial ST_MakeEnvelope harus lebih cepat daripada matematika dibandingkan!
sumber
INDEX
pada ST_MakeEnvelope dan (ST_XMax, ST_XMin, ST_YMax, ST_YMin) dan perbedaannya sangat mendukung matematika. Math membawaku kurang dari 20-an (INDEX + Query) sementara persimpangan Envelope mengambil lebih dari 2 menit (aku menyerah ketika mencapai 2 menit, hanya 40-an untuk pengindeksan Spasial)