Trovare tabelle PostGIS che mancano di indici?


10

Di recente mi sono guardato intorno pg_stat_user_tablese sono stato sorpreso di vedere un numero elevato di scansioni sequenziali su alcune delle mie tabelle spaziali. Abbastanza sicuro, queste tabelle mancavano di indici spaziali.

Come posso trovare tutte le tabelle con una colonna geometrica non indicizzata?


Grazie per il riferimento a pg_stat_user_tables. È incoraggiante che qualcuno delle tue conoscenze ammetta tali errori. Ai giovani al lavoro che faccio da mentore dico sempre: se non esiste un candidato naturale per una chiave primaria, aggiungi una colonna seriale. Definire sempre SRID e tipo di geometria. Aggiungi sempre un indice spaziale. Perché le scansioni di sequenze potrebbero funzionare con un milione di righe, ma arriva un punto ..... Fai come ho detto, piuttosto che come ho fatto: D.
John Powell,

Risposte:


9

Le tabelle con indici spaziali mancanti sono disponibili eseguendo una query sulle tabelle di sistema:

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;

Potrebbe essere anche meglio WHERE t.typname IN ('geometry', 'geography') AND t.typtype='b'? Vedi trac.osgeo.org/gdal/ticket/6896 .
user30184

@ user30184 Puoi spiegarci questo t.typtype = 'b'pezzo?
dbaston,

1
In realtà è un pezzo inutile. La modifica del codice in GDAL è stata per far fronte a una situazione rara in cui il database PostgreSQL standard ha una tabella denominata "geometria". Questo ha anche una voce in pg_type ma con typtype = 'c'. Tuttavia, se PostGIS è installato, non è possibile terminare tale situazione. 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

Ho creato una funzione che può creare automaticamente tutti gli indici mancanti. Un parametro "simula" consente di ottenere l'elenco degli indici spaziali mancanti, ma non esegue CREATE INDEX

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

Per ottenere l'elenco degli indici mancanti, eseguire:

SELECT * FROM create_missing_spatial_indexes(True)

Per creare gli indici necessari, eseguire:

SELECT * FROM create_missing_spatial_indexes()

o

SELECT * FROM create_missing_spatial_indexes(False)

Ha funzionato come un fascino! Ottimo strumento.
RyanKDalton,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.