Buat Indeks Spasial di PostGIS pada seluruh Skema


9

Saya telah memuat sejumlah shapefile menggunakan SPIT (plugin QGIS) ke database PostGIS saya. Lapisan-lapisan ini tidak memiliki Indeks Spasial yang dibuat saat memuat. Saya bertanya-tanya apakah ada cara untuk membuat Indeks Spasial untuk setiap lapisan dalam skema tanpa menulis kueri untuk setiap lapisan. Saya bukan penulis naskah PostGIS yang baik, jadi bantuan apa pun akan sangat dihargai.

Terima kasih

Jawaban:


8

Jika Anda ingin membuat indeks pada kolom geometri, Anda dapat mencoba fungsi plpgsql yang baru saja saya ketuk:

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;

Saya belum mencobanya dengan marah di database saya, tetapi tampaknya melakukan pekerjaan.

Untuk menggunakannya, jalankan saja SELECTpernyataan seperti ini:

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

Untuk membuat indeks pada semua kolom geometri, Anda dapat menggunakannya seperti ini:

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

Setelah itu, jalankan VACUUM ANALYZEuntuk merapikan semuanya.


Terima kasih banyak, ini terlihat hebat. Saya telah menjalankan ini, tetapi tampaknya ada masalah, ingatlah, ini mungkin karena kurangnya kemampuan saya dalam menulis. Tetapi ketika saya menjalankan pernyataan SELECT saya mendapatkan kesalahan berikut: ERROR: fungsi batchindex (tidak diketahui, karakter bervariasi, karakter bervariasi) tidak ada LINE 1: pilih BatchIndex ('publik', f_table_name, f_geometry_column) ... Saya tidak yakin jika saya menambahkan sesuatu untuk mendapatkan batch, atau jika ini hanya tempat untuk sesuatu yang berbeda. Permintaan CREATE dijalankan tanpa masalah, tetapi tidak ada indeks yang dihasilkan.
Ryan Garnett

Hmm ... Saya tidak yakin apa yang terjadi di sana. Fakta bahwa ia berpikir parameter pertama yang Anda lewati adalah tipe unknowndaripada character varyingmematikan lonceng alarm, tapi saya tidak bisa melihat di mana ia memiliki masalah. Saya akan memikirkannya, sedangkan guru PostgreSQL di luar sana suka mencobanya? :)
MerseyViking

2

Jawaban teratas tidak akan berfungsi jika Anda memiliki tampilan dengan geometri. Mengubah pernyataan 'JIKA' untuk memeriksa bahwa Anda tidak mencoba membangun indeks pada tampilan memecahkan masalah itu. Jika Anda ingin menggunakan tampilan dengan geometri, ganti baris ini:

IF i_exists = 0

dengan ini:

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

1

katakanlah meja Anda 'bangunan', Anda dapat mengindeks menggunakan GIST

CREATE INDEX building_gindx ON building USING GIST (geom);

Apakah itu yang Anda cari?


Terima kasih Naresh, tidak, saya sedang mencari cara untuk membuat indeks untuk semua tabel dalam skema, dalam sistem batch.
Ryan Garnett
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.