Localizando tabelas PostGIS com índices ausentes?

10

Recentemente, eu estava olhando em volta pg_stat_user_tablese fiquei surpreso ao ver um grande número de varreduras seqüenciais em algumas das minhas tabelas espaciais. Com certeza, essas tabelas estavam com falta de índices espaciais.

Como posso encontrar todas as tabelas com uma coluna de geometria não indexada?

dbaston
fonte
Obrigado pela referência a pg_stat_user_tables. É animador que alguém do seu conhecimento admita tais erros. Para os jovens que trabalho como mentor, sempre digo: Se não houver candidato natural para uma chave primária, adicione uma coluna serial. Sempre defina o SRID e o tipo de geometria. Sempre adicione um índice espacial. Como as varreduras de sequência podem funcionar com um milhão de linhas, mas chega um ponto ..... Faça o que eu digo, e não como eu fiz: D.
John Powell

Respostas:

9

Tabelas com índices espaciais ausentes podem ser encontradas consultando as tabelas do 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
fonte
Poderia ser ainda melhor como WHERE t.typname IN ('geometry', 'geography') AND t.typtype='b'? Veja trac.osgeo.org/gdal/ticket/6896 .
User30184
@ user30184 Você pode explicar a t.typtype = 'b'parte disso?
dbaston
1
Na verdade, é uma peça inútil. A mudança de código no GDAL foi para lidar com uma situação rara quando o banco de dados PostgreSQL padrão possui uma tabela chamada "geometria". Isso também tem uma entrada em pg_type, mas com typtype = 'c'. No entanto, se você tiver o PostGIS instalado, não será possível terminar com essa situação. 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

Eu criei uma função que pode criar automaticamente todos os índices ausentes. Um parâmetro "simular" permite obter a lista dos índices espaciais ausentes, mas não executa CREATE INDEX

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

Para obter a lista de índices ausentes, execute:

SELECT * FROM create_missing_spatial_indexes(True)

Para criar os índices necessários, execute:

SELECT * FROM create_missing_spatial_indexes()

ou

SELECT * FROM create_missing_spatial_indexes(False)
user779641
fonte
Trabalhou como um encanto! Ótima ferramenta.
RyanKDalton