Çokgen Sorgusunda Nokta için GIST Dizini ile Performans Kazancı


10

İki tablo var: konumları (id, region_id, the_geom) ve bölgeler (id, the_geom). Her bir konum noktası için bulunduğu bölgeyi belirlemek istiyorum:

UPDATE locations SET region_id = 
 (SELECT id FROM regions 
  WHERE ST_Within(locations.the_geom,regions.the_geom)
 );

Konum noktalarında bir GIST endeksi oluşturmak mantıklı mı? Bölge çokgenleri üzerinde bir indeks oluşturacağım ama puanlardan emin değilim. Sorguyu hızlandırabilir mi?

Yanıtlar:


14

Kısa cevap: GÜNCELLEME sorgusu Bu tür sayılı biz her satır güncelliyoruz locations( "Dizi Scan") ve üzerinde GiST indeksi the_geomiçinde regionssınır satırları yardım etmeye yeterli olduğu ST_Withingelen çifti yukarı doğru satıra koşulu regions.


Daha uzun cevap: Bunu çözmenin sihri, açıklama sorgusundan aldıklarınızı karşılaştırmaktır . PgAdmin III'te, bir sorgu düzenleyicisinin üst kısmında "Sorguyu açıkla" düğmesi vardır veya pgsql'de, sorgunuza "açıkla" ön ekini eklemeniz yeterlidir:

postgis=# explain UPDATE locations SET region_id =
postgis-#  (SELECT id FROM regions
postgis(#   WHERE ST_Within(locations.the_geom, regions.the_geom)
postgis(#  );
                                         QUERY PLAN
--------------------------------------------------------------------------------------------
 Seq Scan on locations  (cost=0.00..8755.54 rows=1000 width=110)
   SubPlan 1
     ->  Index Scan using regions_gist_the_geom on regions  (cost=0.00..8.52 rows=1 width=4)
           Index Cond: ($0 && the_geom)
           Filter: _st_within($0, the_geom)
(5 rows)

Burada öksürülen her şeyi anlamanız gerekmez. Burada görülecek en önemli şey iç kısımdadır (Alt Plan 1) "Dizin" (= işleri önemli ölçüde hızlandırabilecek bir indeks kullanır) ve "Seq Scan" (= sekans tarama, yani her birinin kontrol edilmesi) içinde olup olmadığını görmek için satır, ki bu daha yavaş olabilir). Bir GiST dizini eklerseniz / silerseniz locations, bu açıklama sorgusunun çıktısı tamamen aynıdır, bu nedenle sorgu performansı aynı olmalıdır.

Ancak, aptalca bir şey yaparsanız ve GiST dizininizden kaldırılırsa, regionsyukarıdakiyle aynı sorgudan farklı bir sorgu planı görürsünüz:

                             QUERY PLAN
---------------------------------------------------------------------
 Seq Scan on locations  (cost=0.00..74288.00 rows=1000 width=110)
   SubPlan 1
     ->  Seq Scan on regions  (cost=0.00..74.05 rows=1 width=4)
           Filter: (($0 && the_geom) AND _st_within($0, the_geom))
(4 rows)

İki açıklama sorgusu arasında görülmesi gereken en önemli şey, maksimum maliyet tahminleridir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.