กำลังค้นหาตาราง PostGIS ที่ไม่มีดัชนีหรือไม่


10

เมื่อเร็ว ๆ นี้ฉันได้มองไปรอบ ๆpg_stat_user_tablesและรู้สึกประหลาดใจที่ได้เห็นการสแกนตามลำดับจำนวนมากในตารางอวกาศของฉัน แน่นอนตารางเหล่านี้ขาดดัชนีเชิงพื้นที่

ฉันจะค้นหาตารางทั้งหมดที่มีคอลัมน์รูปทรงเรขาคณิตที่ไม่ได้จัดทำดัชนีได้อย่างไร


ขอบคุณสำหรับการอ้างอิงถึง pg_stat_user_tables เป็นเรื่องที่น่ายินดีที่บางคนในความรู้ของคุณยอมรับความผิดพลาดดังกล่าว สำหรับคนหนุ่มสาวที่ทำงานที่ฉันเป็นที่ปรึกษาฉันมักจะพูดว่า: หากไม่มีผู้สมัครที่เป็นธรรมชาติสำหรับคีย์หลักให้เพิ่มคอลัมน์อนุกรม กำหนด SRID และประเภทรูปทรงเรขาคณิตเสมอ เพิ่มดัชนีอวกาศเสมอ เนื่องจากการสแกนตามลำดับอาจทำงานได้กับหนึ่งล้านแถว แต่มีจุดที่ ..... ทำตามที่ฉันพูดมากกว่าที่ฉันทำ: D
John Powell

คำตอบ:


9

ตารางที่มีดัชนีอวกาศหายไปสามารถพบได้โดยการสอบถามตารางระบบ:

SELECT g.* 
FROM 
  (SELECT 
     n.nspname, 
     c.relname, 
     c.oid AS relid, 
     a.attname, 
     a.attnum 
   FROM pg_attribute a 
   INNER JOIN pg_class c ON (a.attrelid=c.oid)
   INNER JOIN pg_type t ON (a.atttypid=t.oid)
   INNER JOIN pg_namespace n ON (c.relnamespace=n.oid) 
   WHERE t.typname='geometry' 
   AND   c.relkind='r'
 ) g 
LEFT JOIN pg_index i ON (g.relid = i.indrelid AND g.attnum = ANY(i.indkey)) 
WHERE i IS NULL;

มันจะดีขึ้นWHERE t.typname IN ('geometry', 'geography') AND t.typtype='b'หรือไม่ ดูtrac.osgeo.org/gdal/ticket/6896
user30184

@ user30184 คุณช่วยอธิบายt.typtype = 'b'ชิ้นส่วนนั้นได้ไหม?
dbaston

1
มันเป็นชิ้นส่วนที่ไร้ประโยชน์จริงๆ การเปลี่ยนรหัสใน GDAL นั้นใช้สำหรับจัดการกับสถานการณ์ที่ไม่ค่อยเกิดขึ้นเมื่อฐานข้อมูล PostgreSQL มาตรฐานมีตารางชื่อ "เรขาคณิต" ที่มีรายการใน pg_type แต่มี typtype = 'c' อย่างไรก็ตามหากคุณติดตั้ง PostGIS ไว้จะไม่สามารถยุติสถานการณ์ดังกล่าวได้ create table "geometry" (foo text);ให้ERROR: type "geometry" already exists HINT: A relation has an associated type of the same name, so you must use a name that doesn't conflict with any existing type.
user30184

6

ฉันได้สร้างฟังก์ชั่นที่สามารถสร้างดัชนีที่ขาดหายไปโดยอัตโนมัติทั้งหมดได้ พารามิเตอร์ "จำลอง" อนุญาตให้รับรายการดัชนีอวกาศที่หายไป แต่ดำเนินการไม่ใช่ CREATE INDEX

ดูhttps://gist.github.com/mdouchin/cfa0e37058bcf102ed490bc59d762042

ในการรับรายการดัชนีที่หายไปให้เรียกใช้:

SELECT * FROM create_missing_spatial_indexes(True)

ในการสร้างดัชนีที่ต้องการให้รัน:

SELECT * FROM create_missing_spatial_indexes()

หรือ

SELECT * FROM create_missing_spatial_indexes(False)

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