¿Encuentra tablas PostGIS a las que les faltan índices?

10

Recientemente estuve mirando alrededor pg_stat_user_tablesy me sorprendió ver un gran número de escaneos secuenciales en algunas de mis tablas espaciales. Efectivamente, a estas tablas les faltaban índices espaciales.

¿Cómo puedo encontrar todas las tablas con una columna de geometría no indexada?

dbaston
fuente
Gracias por la referencia a pg_stat_user_tables. Es alentador que alguien de su conocimiento admita tales errores. A los jóvenes en el trabajo a los que asesoro, siempre les digo: si no hay un candidato natural para una clave primaria, agregue una columna en serie. Siempre defina el SRID y el tipo de geometría. Siempre agregue un índice espacial. Debido a que los escaneos de secuencia pueden funcionar con un millón de filas, pero llega un punto ..... Haz lo que digo, en lugar de lo que hice: D.
John Powell

Respuestas:

9

Las tablas con índices espaciales faltantes se pueden encontrar consultando las tablas del 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;
dbaston
fuente
¿Podría ser aún mejor como WHERE t.typname IN ('geometry', 'geography') AND t.typtype='b'? Ver trac.osgeo.org/gdal/ticket/6896 .
user30184
@ user30184 ¿Puedes explicar la t.typtype = 'b'parte de eso?
dbaston
1
En realidad es una pieza inútil. El cambio de código en GDAL fue para tratar una situación rara cuando la base de datos estándar PostgreSQL tiene una tabla llamada "geometría". Eso también tiene una entrada en pg_type pero con typtype = 'c'. Sin embargo, si tiene instalado PostGIS, no es posible terminar con tal situación. create table "geometry" (foo text);daERROR: 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

He creado una función que puede crear automáticamente todos los índices que faltan. Un parámetro "simular" permite obtener la lista de los índices espaciales faltantes, pero no realiza CREATE INDEX

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

Para obtener la lista de índices faltantes, ejecute:

SELECT * FROM create_missing_spatial_indexes(True)

Para crear los índices necesarios, ejecute:

SELECT * FROM create_missing_spatial_indexes()

o

SELECT * FROM create_missing_spatial_indexes(False)
usuario779641
fuente
¡Trabajado como un encanto! Gran herramienta
RyanKDalton