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_geom
içinde regions
sınır satırları yardım etmeye yeterli olduğu ST_Within
gelen ç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, regions
yukarı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.