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

Ryan Garnett
sumber

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.

MerseyViking
sumber
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')
Josh Brooks
sumber
1

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

CREATE INDEX building_gindx ON building USING GIST (geom);

Apakah itu yang Anda cari?

Naresh
sumber
Terima kasih Naresh, tidak, saya sedang mencari cara untuk membuat indeks untuk semua tabel dalam skema, dalam sistem batch.
Ryan Garnett