Menemukan tabel PostGIS yang tidak memiliki indeks?

10

Baru-baru ini saya melihat sekeliling pg_stat_user_tablesdan terkejut melihat sejumlah besar pemindaian berurutan pada beberapa tabel spasial saya. Benar saja, tabel-tabel ini tidak memiliki indeks spasial.

Bagaimana saya bisa menemukan semua tabel dengan kolom geometri yang tidak diindeks?

dbaston
sumber
Terima kasih atas referensi ke pg_stat_user_tables. Sungguh menggembirakan bahwa seseorang yang sepengetahuan Anda mengakui kesalahan seperti itu. Kepada anak muda di tempat kerja yang saya bimbing, saya selalu katakan: Jika tidak ada kandidat alami untuk kunci primer, tambahkan kolom serial. Selalu tentukan tipe SRID dan geometri. Selalu tambahkan indeks spasial. Karena pemindaian urutan mungkin bekerja dengan sejuta baris, tetapi, ada satu titik ..... Lakukan seperti yang saya katakan, bukan seperti yang saya lakukan: D.
John Powell

Jawaban:

9

Tabel dengan indeks spasial yang hilang dapat ditemukan dengan menanyakan tabel sistem:

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;
dbaston
sumber
Mungkinkah lebih baik WHERE t.typname IN ('geometry', 'geography') AND t.typtype='b'? Lihat trac.osgeo.org/gdal/ticket/6896 .
user30184
@ user30184 Bisakah Anda menjelaskan t.typtype = 'b'bagian itu?
dbaston
1
Ini sebenarnya adalah bagian yang tidak berguna. Perubahan kode dalam GDAL adalah untuk menghadapi situasi yang langka ketika database PostgreSQL standar memiliki tabel bernama "geometri". Itu juga memiliki entri dalam pg_type tetapi dengan typtype = 'c'. Namun, jika Anda telah menginstal PostGIS, tidak mungkin mengakhiri situasi seperti itu. create table "geometry" (foo text);memberikanERROR: 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

Saya telah membuat fungsi yang dapat secara otomatis membuat semua indeks yang hilang. Parameter "simulasikan" memungkinkan untuk mendapatkan daftar indeks spasial yang hilang, tetapi berkinerja tidak CREATE INDEX

Lihat https://gist.github.com/mdouchin/cfa0e37058bcf102ed490bc59d762042

Untuk mendapatkan daftar indeks yang hilang, jalankan:

SELECT * FROM create_missing_spatial_indexes(True)

Untuk membuat indeks yang diperlukan, jalankan:

SELECT * FROM create_missing_spatial_indexes()

atau

SELECT * FROM create_missing_spatial_indexes(False)
pengguna779641
sumber
Bekerja seperti pesona! Alat hebat.
RyanKDalton