Saya mencoba menggunakan fungsi baru Postgis 2.0 <-> (Geometry Distance Centroid) untuk menghitung, untuk setiap baris tabel saya (cosn1), jarak ke poligon terdekat dari kelas yang sama.
Saya mencoba menggunakan kode berikut:
WITH index_query AS (
SELECT g1.gid As ref_gid, ST_Distance(g1.the_geom,g2.the_geom) As ENN
FROM "cosn1" As g1, "cosn1" As g2
WHERE g1.gid <> g2.gid AND g1.class = g2.class
ORDER BY g1.gid, g1.the_geom <-> g2.the_geom)
SELECT DISTINCT ON (ref_gid) ref_gid, ENN
FROM index_query
ORDER BY ref_gid, ENN;
Tapi kemudian saya menyadari peringatan itu:
Catatan: Indeks hanya menghasilkan jika salah satu geometri adalah konstanta (bukan dalam subquery / cte). mis. 'SRID = 3005; POINT (1011102 450541)' :: geometry alih-alih a.geom
Berarti Indeks tidak akan digunakan sama sekali, dan kueri akan memakan waktu yang hampir sama seperti sebelum menggunakan:
SELECT DISTINCT ON(g1.gid) g1.gid As ref_gid, ST_Distance(g1.the_geom,g2.the_geom) As ENN
FROM "cosn1" As g1, "cosn1" As g2
WHERE g1.gid <> g2.gid AND g1.class = g2.class
ORDER BY g1.gid, ST_Distance(g1.the_geom,g2.the_geom)
Adakah yang bisa menunjukkan solusi yang memungkinkan saya meningkatkan kinerja kueri?
Terima kasih banyak.
nearest-neighbor
postgis-2.0
Alexandre Neto
sumber
sumber
Jawaban:
Hum melakukan beberapa tes pada mesin saya terdengar seperti operator ini <-> tidak berfungsi dengan baik. Saya tidak yakin itu adalah bug tetapi melaporkan jarak nol pada geometri yang tidak tumpang tindih. Menarik bukan?
Nah bagaimana dengan optimasi query SQL tradisional yang adil? Karena hasil yang tidak terduga dengan operator <-> saya menggantinya dengan st_centroid. Mendapat hasil yang jauh lebih baik dalam kecepatan.
Semantik harapan dengan st_overlaps tetap sama. Setidaknya ini yang saya mengerti dari dokumentasi tentang <->
Dari docs on Postigs <->
Pada data pengujian saya dengan poligon ~ 5.5k, kecepatan dari ~ 1000 detik hingga ~ 5 detik tanpa pengindeksan spasial.
Pokoknya mengapa menggunakan DISTINCT ON untuk melakukan pengelompokan? Saya melihat beberapa orang menggunakannya tetapi tidak ada grup untuk menghilangkan duplikat?
Permintaan Anda dengan optimasi SQL standar tanpa kesalahan st_centroid diperkenalkan
Selamat liburan natal!
sumber