คำตอบสั้น ๆ :เลขที่กับชนิดของแบบสอบถาม UPDATE นี้เรากำลังปรับปรุงแต่ละแถวในlocations
( "ลำดับสแกน") และดัชนีส่วนสำคัญในการthe_geom
ในการregions
เป็นที่เพียงพอในการช่วยให้แถวขีด จำกัด สำหรับสภาพคู่ขึ้นแถวที่ถูกต้องจากST_Within
regions
คำตอบอีกต่อไป:มายากลเพื่อหานี้คือการเปรียบเทียบสิ่งที่คุณได้รับจากอธิบายแบบสอบถาม จาก pgAdmin III มีปุ่ม "อธิบายแบบสอบถาม" ที่ด้านบนของตัวแก้ไขแบบสอบถามหรือจาก pgsql เพียงนำหน้าข้อความค้นหาของคุณด้วย "อธิบาย":
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)
คุณไม่จำเป็นต้องเข้าใจทุกสิ่งที่เกิดขึ้นที่นี่ สิ่งสำคัญที่จะเห็นที่นี่อยู่ในส่วนภายใน (SubPlan 1) ซึ่งระบุว่า "ดัชนี" (= ใช้ดัชนีซึ่งสามารถเร่งความเร็วของสิ่งต่าง ๆ ได้อย่างมาก) ไม่ใช่ "Seq Scan" (= สแกนตามลำดับเช่นตรวจสอบแต่ละครั้ง แถวเพื่อดูว่าอยู่ภายในหรือไม่ซึ่งอาจช้ากว่า) หากคุณเพิ่ม / ลบดัชนี GiST locations
ผลลัพธ์ของคำอธิบายการสืบค้นนี้จะเหมือนกันทุกประการดังนั้นประสิทธิภาพการสืบค้นควรจะเหมือนกัน
อย่างไรก็ตามหากคุณทำอะไรโง่ ๆ และลบดัชนี GiST ของคุณออกregions
คุณจะเห็นแผนการสืบค้นที่แตกต่างจากการสืบค้นเดียวกันข้างต้น:
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)
สิ่งสำคัญที่จะเห็นระหว่างทั้งสองคำอธิบายคือการประมาณค่าใช้จ่ายสูงสุด .. เปรียบเทียบ 74.05 ตรงนี้กับ 8.52 ก่อนดังนั้นคุณคาดว่าแบบสอบถามนี้จะช้ากว่า