PostgreSQL / PostGIS ดัชนีเชิงพื้นที่ - ไม่เร่งความเร็ว


15

ฉันมีตารางเชิงพื้นที่ในฐานข้อมูล PostgreSQL / PostGIS ทุกแถวในนั้นหมายถึงรูปหลายเหลี่ยม มันเป็นรูปแบบดังต่อไปนี้:

+----+--------+
|gid |   way  |
+----+--------+
|241 | 01030..|

คอลัมน์รูปทรงเรขาคณิตคือ "วิธี" ซึ่งมีรูปทรงเรขาคณิตสำหรับรูปหลายเหลี่ยม ใน WKT คือ: POLYGON (('.... ')) ฉันกำลังทำแบบสอบถาม ST_Contains จำนวนมากในตารางนี้เพื่อทดสอบว่ามีรูปหลายเหลี่ยมสองอันอยู่ในกันและกันหรือไม่เช่น:

Select ST_Contains(a.way, b.way) From table AS a, table AS b Where a.gid = 15 And b.gid = 16

ฉันสงสัยว่าจะเพิ่มความเร็วข้อความค้นหานี้อย่างไรและเพิ่มดัชนีเชิงพื้นที่ในตาราง:

CREATE INDEX table_way_gist ON table USING gist(way);

แต่ที่จริงฉันไม่เห็นความเร็ว ฉันสร้างดัชนีหลังจากที่ฉันเติมตารางด้วยรูปหลายเหลี่ยมทั้งหมดก่อนที่ฉันจะทำแบบสอบถาม ST_Contains ควรเพิ่มดัชนีก่อนที่จะเติมตารางหรือไม่? มีข้อกำหนดพิเศษในตารางเพื่อทำงานกับดัชนีหรือไม่ เส้นโครง (srid) ของวิธีคอลัมน์เรขาคณิตตั้งค่าเป็น 900913

ฉันใช้: psql (PostgreSQL) 9.1.4 / POSTGIS = "1.5.3"

คำตอบ:


16

ดัชนีที่มีประสิทธิภาพมากที่สุดสำหรับการค้นหาที่แสดงในคำถามของคุณคือดัชนีแบบgidเนื่องจากเป็นคอลัมน์เดียวที่ปรากฏในที่ที่มีการแสดงออก:

 CREATE INDEX table_gid ON table (gid);

คุณสามารถวางดัชนีจิสต์ได้อย่างปลอดภัยเนื่องจากจะใช้พื้นที่และแทรก / อัพเดท / ลบช้า

คำอธิบายยาว ๆ

อย่างที่ฉันได้กล่าวไปแล้วว่าดัชนีที่มีประสิทธิภาพมากที่สุดในกรณีของคุณคือดัชนีบน gid เพราะจะทำให้เอ็นจิ้น db สามารถดึงแถวได้เร็วขึ้น (โดยการดึงข้อมูลมักเป็นส่วนที่ช้าที่สุดของกระบวนการ) หลังจากนั้นมันน่าจะคำนวณผลลัพธ์ของ

  ST_Contains(a.way, b.way)

espression โดยไม่ดูที่ดัชนี เหตุผลก็คือผู้วางแผนแบบสอบถามน่าจะประมาณว่าค่าใช้จ่ายเพิ่มเติมในการค้นหาดัชนีส่วนสำคัญในทั้งสองคอลัมน์เมื่อเทียบกับการค้นหาค่าa.wayและb.wayโดยตรงไม่คุ้มกับความพยายามเนื่องจากจำนวนแถวทั้งหมดที่ต้องค้นหา อาจมีขนาดเล็กมากโดยเฉพาะถ้าดัชนีไม่ซ้ำกัน

ตามกฎของหัวแม่มือโปรดจำไว้ว่านักวางแผนอาจสนับสนุนการสแกนตารางผ่านการสแกนดัชนีสำหรับชุดข้อมูลขนาดเล็ก (ขนาดของชุดข้อมูลถูกประเมินโดยการดูที่สถิติของตาราง)


นั่นทำให้ปัญหาชัดเจนขึ้นสำหรับฉัน ฉันจะลอง ดังนั้นถ้าฉันใส่แบบสอบถาม ST_Contains () ลงในส่วนคำสั่ง WHERE ดัชนีเชิงพื้นที่ควรเป็นประโยชน์จริงหรือ ฉันคิดว่าฉันต้องจัดระเบียบสคริปต์ของฉันใหม่เพื่อโทร ST_Contains ภายในส่วนคำสั่ง WHERE ในขณะนี้ฉันกำลังวนซ้ำรูปหลายเหลี่ยมทั้งหมดและทดสอบสองรูปแบบแยกกันเสมอ
MichiMichbeck

?? คุณกำลังจะตายที่ดัชนีเชิงพื้นที่ช้าลงสิ่งที่? นั่นเป็นเรื่องใหม่สำหรับฉันเพราะที่ที่ฉันทำงานเรามีดัชนีเชิงพื้นที่สำหรับทุก ๆ ตารางและฉันสงสัยว่ามันเป็นการปฏิบัติที่เลวร้ายหรือไม่
Luffydude

13

ดังที่unicolettiกล่าวว่าดัชนีส่วนสำคัญในคอลัมน์รูปทรงเรขาคณิตจะใช้ได้ก็ต่อเมื่อคุณใช้ ST_Contains () ในนิพจน์ WHERE

ตัวอย่างเช่นหากคุณต้องการทราบรูปหลายเหลี่ยมทั้งหมดที่มีซึ่งกันและกันคุณสามารถใช้สิ่งนี้:

SELECT a.gid, b.gid
FROM table AS a, table as b
WHERE a.gid != b.gid and ST_Contains(a.way, b.way)

ในกรณีนี้ขึ้นอยู่กับขนาดของตารางของคุณและความซับซ้อนของรูปทรงเรขาคณิตของคุณดัชนีส่วนสำคัญควรให้ความเร็วที่สำคัญเนื่องจาก ST_Contains จะเริ่มต้นด้วยการกรองรูปหลายเหลี่ยมโดยการเปรียบเทียบกล่องรูปหลายเหลี่ยมก่อนที่จะตรวจสอบรูปทรงเรขาคณิตที่สมบูรณ์ คุณสามารถดูคำอธิบายเล็ก ๆ ในOpenGeo กวดวิชา


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