Trouver des tables PostGIS qui manquent d'index?

10

Récemment, je regardais autour de moi et j'ai été pg_stat_user_tablessurpris de voir un grand nombre de balayages séquentiels sur certaines de mes tables spatiales. Effectivement, ces tableaux manquaient d'index spatiaux.

Comment puis-je trouver toutes les tables avec une colonne de géométrie non indexée?

dbaston
la source
Merci pour la référence à pg_stat_user_tables. Il est encourageant de constater que quelqu'un de votre connaissance admet de telles erreurs. Aux jeunes au travail que je conseille, je dis toujours: s'il n'y a pas de candidat naturel pour une clé primaire, ajoutez une colonne série. Définissez toujours le SRID et le type de géométrie. Ajoutez toujours un index spatial. Parce que les analyses de séquence peuvent fonctionner avec un million de lignes, mais il arrive un point ..... Faites ce que je dis, plutôt que ce que j'ai fait: D.
John Powell

Réponses:

9

Les tables avec des index spatiaux manquants peuvent être trouvées en interrogeant les tables système:

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
la source
Serait-ce encore mieux WHERE t.typname IN ('geometry', 'geography') AND t.typtype='b'? Voir trac.osgeo.org/gdal/ticket/6896 .
user30184
@ user30184 Pouvez-vous expliquer le t.typtype = 'b'morceau de cela?
dbaston
1
C'est en fait une pièce inutile. Le changement de code dans GDAL était pour faire face à une situation rare où la base de données PostgreSQL standard a une table nommée "géométrie". Cela a également une entrée dans pg_type mais avec typtype = 'c'. Cependant, si vous avez installé PostGIS, il n'est pas possible de mettre fin à une telle situation. create table "geometry" (foo text);donneERROR: 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

J'ai créé une fonction qui peut créer automatiquement tous les index manquants. Un paramètre "simuler" permet d'obtenir la liste des index spatiaux manquants, mais n'effectue pas CREATE INDEX

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

Pour obtenir la liste des index manquants, exécutez:

SELECT * FROM create_missing_spatial_indexes(True)

Pour créer les index nécessaires, exécutez:

SELECT * FROM create_missing_spatial_indexes()

ou

SELECT * FROM create_missing_spatial_indexes(False)
user779641
la source
A fonctionné comme un charme! Excellent outil.
RyanKDalton