สร้างดัชนีเชิงพื้นที่ใน PostGIS บน Schema ทั้งหมด


9

ฉันโหลด Shapefiles จำนวนหนึ่งโดยใช้ SPIT (ปลั๊กอิน QGIS) ไปยังฐานข้อมูล PostGIS ของฉัน เลเยอร์เหล่านี้ไม่มีดัชนีเชิงพื้นที่ที่สร้างขึ้นเมื่อโหลด ฉันสงสัยว่ามีวิธีสร้างดัชนีเชิงพื้นที่สำหรับแต่ละชั้นในสคีมาโดยไม่ต้องเขียนแบบสอบถามสำหรับแต่ละชั้นหรือไม่ ฉันไม่ได้เป็นนักเขียนสคริปต์ PostGIS ที่ดีดังนั้นความช่วยเหลือใด ๆ จะได้รับการชื่นชมอย่างมาก

ขอบคุณ

คำตอบ:


8

ถ้าคุณต้องการแบตช์สร้างดัชนีในคอลัมน์รูปทรงเรขาคณิตคุณสามารถลองใช้ฟังก์ชั่น plpgsql ที่ฉันเพิ่งทำไปแล้ว:

CREATE OR REPLACE FUNCTION BatchIndex(sn text, tn text, cn text) RETURNS void AS $$
DECLARE i_exists integer;
DECLARE idxname text;
BEGIN
  idxname := 'idx_' || tn || '_' || cn;
  select into i_exists count(*) from pg_class where relname = idxname;

  IF i_exists = 0 THEN
    EXECUTE 'CREATE INDEX ' ||idxname || ' ON '
      || sn || '.' || tn
      || ' USING GIST(' || cn || ')';
  END IF;
END;
$$ LANGUAGE plpgsql;

ฉันไม่ได้ลองด้วยความโกรธในฐานข้อมูลของฉัน แต่ดูเหมือนว่าจะทำงาน

หากต้องการใช้งานให้เรียกใช้SELECTคำสั่งเช่นนี้:

select BatchIndex('public', f_table_name, f_geometry_column) from geometry_columns where f_table_schema = 'public';

หากต้องการสร้างดัชนีในคอลัมน์รูปทรงเรขาคณิตทั้งหมดคุณสามารถใช้ดัชนีดังนี้:

select BatchIndex(f_table_schema, f_table_name, f_geometry_column) from geometry_columns;

หลังจากนั้นให้เรียกใช้ a VACUUM ANALYZEเพื่อจัดระเบียบทุกอย่างให้เรียบร้อย


ขอบคุณมากนี่ดูดีมาก ฉันรันสิ่งนี้แล้ว แต่ดูเหมือนว่าจะมีปัญหาระวังคุณนี่อาจเป็นเพราะฉันขาดความสามารถในการเขียนสคริปต์ แต่เมื่อฉันเรียกใช้คำสั่ง SELECT ฉันได้รับข้อผิดพลาดต่อไปนี้: ข้อผิดพลาด: ฟังก์ชัน batchindex (ไม่ทราบ, การเปลี่ยนแปลงอักขระ, การเปลี่ยนแปลงตัวอักษร) ไม่มีอยู่บรรทัด 1: เลือก BatchIndex ('สาธารณะ', f_table_name, f_geometry_column) ... ถ้าฉันจะเพิ่มอะไรก็ได้เพื่อให้ได้แบทช์หรือถ้านี่เป็นเพียงที่ยึดสำหรับสิ่งที่แตกต่าง แบบสอบถาม CREATE ทำงานโดยไม่มีปัญหา แต่ไม่มีการสร้างดัชนี
Ryan Garnett

อืม ... ข้าไม่แน่ใจว่าจะเกิดอะไรขึ้น ความจริงที่ว่ามันคิดว่าพารามิเตอร์แรกที่คุณผ่านเป็นประเภทunknownมากกว่าcharacter varyingการตั้งค่าปิดสัญญาณเตือนภัย แต่ฉันไม่สามารถดูว่ามันมีปัญหาที่ไหน ฉันจะให้ความคิดบางอย่างในขณะที่ผู้เชี่ยวชาญด้าน PostgreSQL มีแฟนซีให้ไป? :)
MerseyViking

2

คำตอบยอดนิยมจะไม่ทำงานหากคุณมีมุมมองที่มีรูปทรงเรขาคณิต การเปลี่ยนคำสั่ง 'IF' เพื่อตรวจสอบว่าคุณไม่ได้พยายามสร้างดัชนีในมุมมองแก้ปัญหานั้น หากคุณต้องการใช้มุมมองกับเรขาคณิตให้แทนที่บรรทัดนี้:

IF i_exists = 0

ด้วยสิ่งนี้:

IF i_exists = 0 AND tn IN (SELECT table_name, table_type FROM information_schema.tables WHERE table_type = 'BASE TABLE')

1

สมมติว่าตารางของคุณคือ 'อาคาร' คุณสามารถสร้างดัชนีโดยใช้ GIST

CREATE INDEX building_gindx ON building USING GIST (geom);

นั่นคือสิ่งที่คุณกำลังมองหา?


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