Crea un indice spaziale in PostGIS su un intero schema


9

Ho caricato un certo numero di shapefile usando SPIT (plugin QGIS) nel mio database PostGIS. A questi livelli non è stato creato un indice spaziale durante il caricamento. Mi chiedo se esiste un modo per creare un indice spaziale per ogni livello nello schema senza scrivere una query per ogni livello. Non sono un buon sceneggiatore di PostGIS, quindi qualsiasi aiuto sarebbe molto apprezzato.

Grazie

Risposte:


8

Se vuoi creare in batch indici su colonne geometriche, puoi provare questa funzione plpgsql che ho appena rovinato:

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;

Non l'ho provato con rabbia sul mio database, ma sembra fare il lavoro.

Per usarlo, basta eseguire SELECTun'istruzione come questa:

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

Per creare indici su tutte le colonne della geometria, puoi usarlo in questo modo:

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

Successivamente, esegui un VACUUM ANALYZEper riordinare tutto.


Grazie mille, sembra fantastico. Ho eseguito questo, ma sembra che ci sia un problema, intendiamoci, questo potrebbe essere dovuto alla mia mancanza di capacità di scripting. Ma quando eseguo le istruzioni SELECT ottengo il seguente errore: ERRORE: la funzione batchindex (sconosciuta, variazione di carattere, variazione di carattere) non esiste LINEA 1: seleziona BatchIndex ('public', f_table_name, f_geometry_column) ... Non sono sicuro se devo aggiungere qualcosa per ottenere il batch, o se questo è solo un segnaposto per qualcosa di diverso. La query CREATE è stata eseguita senza problemi, ma non sono stati generati indici.
Ryan Garnett,

Hmm ... Non sono sicuro di cosa stia succedendo lì allora. Il fatto che pensi che il primo parametro che stai passando sia di tipo unknownpiuttosto che character varyinginnesca campanelli d'allarme, ma non riesco a vedere dove ha un problema. Ci penserò su, nel frattempo qualche guru di PostgreSQL là fuori ha voglia di provarlo? :)
MerseyViking

2

La risposta migliore non funzionerà se hai viste con geometria. La modifica dell'istruzione "IF" per verificare che non si stia tentando di creare un indice su una vista risolve tale problema. Se desideri utilizzare le viste con la geometria, sostituisci questa linea:

IF i_exists = 0

con questo:

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

1

supponiamo che la tua tabella sia "in costruzione", puoi indicizzarla usando GIST

CREATE INDEX building_gindx ON building USING GIST (geom);

È quello che stai cercando?


Grazie Naresh, no, sto cercando un modo per creare indici per tutte le tabelle in uno schema, in un sistema batch.
Ryan Garnett,
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.