Crear índice espacial en PostGIS en un esquema completo

9

He cargado varios archivos de forma usando SPIT (complemento QGIS) en mi base de datos PostGIS. Estas capas no tenían un índice espacial creado al cargar. Me pregunto si hay una manera de crear un índice espacial para cada capa en el esquema sin escribir una consulta para cada capa. No soy un buen escritor de guiones de PostGIS, por lo que cualquier ayuda sería muy apreciada.

Gracias

Ryan Garnett
fuente

Respuestas:

8

Si desea crear índices por lotes en columnas de geometría, puede probar esta función plpgsql que acabo de activar:

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;

No lo he probado con ira en mi base de datos, pero parece hacer el trabajo.

Para usarlo, solo ejecuta una SELECTdeclaración como esta:

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

Para crear índices en todas las columnas de geometría, puede usarlo así:

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

Luego, ejecute un VACUUM ANALYZEpara ordenar todo.

MerseyViking
fuente
Muchas gracias, esto se ve genial. He ejecutado esto, pero parece que hay un problema, tenga en cuenta que esto podría deberse a mi falta de capacidad de secuencias de comandos. Pero cuando ejecuto las instrucciones SELECT, aparece el siguiente error: ERROR: la función batchindex (desconocido, variable de caracteres, variable de caracteres) no existe LÍNEA 1: seleccione BatchIndex ('public', f_table_name, f_geometry_column) ... No estoy seguro si debo agregar algo para obtener el lote, o si esto es solo un marcador de posición para algo diferente. La consulta CREATE se ejecutó sin problemas, pero no se generaron índices.
Ryan Garnett
Hmm ... no estoy seguro de qué está pasando allí entonces. El hecho de que piense que el primer parámetro que está pasando es de tipo en unknownlugar de character varyingactivar alarmas, pero no puedo ver dónde tiene un problema. Pensaré un poco, mientras tanto, ¿a algún gurú de PostgreSQL le gustaría probarlo? :)
MerseyViking
2

La respuesta principal no funcionará si tiene vistas con geometría. Cambiar el enunciado 'IF' para verificar que no está intentando crear un índice en una vista resuelve ese problema. Si desea utilizar vistas con geometría, reemplace esta línea:

IF i_exists = 0

con este:

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

digamos que su tabla está 'construyendo', puede indexar usando GIST

CREATE INDEX building_gindx ON building USING GIST (geom);

¿Es esto lo que estás buscando?

Naresh
fuente
Gracias Naresh, no, estoy buscando una manera de crear índices para todas las tablas en un esquema, en un sistema por lotes.
Ryan Garnett