ประสิทธิภาพที่เพิ่มขึ้นจากดัชนี GIST สำหรับจุดในรูปหลายเหลี่ยมแบบสอบถาม


10

ฉันมีสองตาราง: สถานที่ตั้ง (id, region_id, the_geom) และภูมิภาค (id, the_geom) สำหรับจุดที่ตั้งแต่ละแห่งฉันต้องการระบุภูมิภาคที่อยู่ใน:

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

มันสมเหตุสมผลหรือไม่ที่จะสร้างดัชนี GIST ที่จุดตำแหน่ง? ฉันจะสร้างดัชนีในรูปหลายเหลี่ยมภูมิภาค แต่ฉันไม่แน่ใจเกี่ยวกับประเด็นนี้ มันจะเพิ่มความเร็วของแบบสอบถามหรือไม่

คำตอบ:


14

คำตอบสั้น ๆ :เลขที่กับชนิดของแบบสอบถาม UPDATE นี้เรากำลังปรับปรุงแต่ละแถวในlocations( "ลำดับสแกน") และดัชนีส่วนสำคัญในการthe_geomในการregionsเป็นที่เพียงพอในการช่วยให้แถวขีด จำกัด สำหรับสภาพคู่ขึ้นแถวที่ถูกต้องจากST_Withinregions


คำตอบอีกต่อไป:มายากลเพื่อหานี้คือการเปรียบเทียบสิ่งที่คุณได้รับจากอธิบายแบบสอบถาม จาก 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 ก่อนดังนั้นคุณคาดว่าแบบสอบถามนี้จะช้ากว่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.