Créer un index spatial dans PostGIS sur un schéma entier

9

J'ai chargé un certain nombre de fichiers de formes à l'aide de SPIT (plugin QGIS) dans ma base de données PostGIS. Ces couches n'avaient pas d'index spatial créé lors du chargement. Je me demande s'il existe un moyen de créer un index spatial pour chaque couche du schéma sans écrire de requête pour chaque couche. Je ne suis pas un bon scénariste PostGIS, donc toute aide serait grandement appréciée.

Merci

Ryan Garnett
la source

Réponses:

8

Si vous souhaitez créer des index par lots sur des colonnes de géométrie, vous pouvez essayer cette fonction plpgsql que je viens de créer:

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;

Je ne l'ai pas essayé en colère sur ma base de données, mais il semble faire l'affaire.

Pour l'utiliser, il suffit d'exécuter une SELECTinstruction comme celle-ci:

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

Pour créer des index sur toutes les colonnes de géométrie, vous pouvez l'utiliser comme ceci:

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

Ensuite, lancez un VACUUM ANALYZEpour tout ranger.

MerseyViking
la source
Merci beaucoup, ça a l'air super. Je l'ai exécuté, mais il semble y avoir un problème, rappelez-vous, cela pourrait être dû à mon manque de capacité de script. Mais lorsque j'exécute les instructions SELECT, j'obtiens l'erreur suivante: ERREUR: la fonction batchindex (inconnue, variant de caractère, variant de caractère) n'existe pas LIGNE 1: sélectionnez BatchIndex ('public', f_table_name, f_geometry_column) ... Je ne suis pas sûr si je dois ajouter quelque chose pour obtenir le lot, ou si c'est juste un espace réservé pour quelque chose de différent. La requête CREATE s'est déroulée sans problème, mais aucun index n'a été généré.
Ryan Garnett
Hmm ... Je ne suis pas sûr de ce qui se passe alors. Le fait qu'il pense que le premier paramètre que vous passez est de type unknownplutôt que character varyingde déclencher des sonneries d'alarme, mais je ne vois pas où il a un problème. Je vais y réfléchir, en attendant, tous les gourous de PostgreSQL ont envie de l'essayer? :)
MerseyViking
2

La meilleure réponse ne fonctionnera pas si vous avez des vues avec géométrie. La modification de l'instruction «IF» pour vérifier que vous n'essayez pas de créer un index sur une vue résout ce problème. Si vous souhaitez utiliser des vues avec géométrie, remplacez cette ligne:

IF i_exists = 0

avec ça:

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

dites que votre table est en train de "construire", vous pouvez indexer en utilisant GIST

CREATE INDEX building_gindx ON building USING GIST (geom);

C'est bien ce que vous cherchez?

Naresh
la source
Merci Naresh, non je cherche un moyen de créer des index pour toutes les tables dans un schéma, dans un système batch.
Ryan Garnett