Criar índice espacial no PostGIS em um esquema inteiro


9

Carreguei vários shapefiles usando o SPIT (plugin QGIS) no meu banco de dados PostGIS. Essas camadas não tinham um índice espacial criado durante o carregamento. Gostaria de saber se existe uma maneira de criar um índice espacial para cada camada no esquema sem escrever uma consulta para cada camada. Como não sou um bom escritor de scripts PostGIS, qualquer ajuda seria muito apreciada.

obrigado

Respostas:


8

Se você deseja criar em lote índices em colunas de geometria, tente esta função plpgsql que acabei de chamar:

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;

Eu não tentei com raiva no meu banco de dados, mas parece fazer o trabalho.

Para usá-lo, basta executar uma SELECTdeclaração como esta:

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

Para criar índices em todas as colunas geométricas, você pode usá-lo assim:

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

Depois, execute um VACUUM ANALYZEpara arrumar tudo.


Muito obrigado, isso parece ótimo. Eu executei isso, mas parece haver um problema, lembre-se, isso pode ser devido à minha falta de capacidade de script. Mas quando executo as instruções SELECT, recebo o seguinte erro: ERRO: a função batchindex (desconhecido, variação de caracteres, variação de caracteres) não existe LINHA 1: selecione BatchIndex ('public', f_table_name, f_geometry_column) ... Não tenho certeza se devo adicionar algo para obter o lote ou se esse é apenas um espaço reservado para algo diferente. A consulta CREATE foi executada sem problemas, mas nenhum índice foi gerado.
Ryan Garnett

Hmm ... não tenho certeza do que está acontecendo lá então. O fato de ele achar que o primeiro parâmetro que você está passando é do tipo, em unknownvez de character varyingacionar alarmes, mas não consigo ver onde há um problema. Vou pensar um pouco, enquanto algum guru do PostgreSQL gosta de tentar? :)
MerseyViking

2

A resposta superior não funcionará se você tiver vistas com geometria. Alterar a instrução 'SE' para verificar se você não está tentando criar um índice em uma exibição resolve esse problema. Se você deseja usar vistas com geometria, substitua esta linha:

IF i_exists = 0

com isso:

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

1

diga que sua tabela está "construindo", você pode indexar usando GIST

CREATE INDEX building_gindx ON building USING GIST (geom);

É isso que você está procurando?


Obrigado Naresh, não, estou procurando uma maneira de criar índices para todas as tabelas em um esquema, em um sistema em lote.
Ryan Garnett
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.