2 votos

¿Cómo crear un índice gist de tipo booleano?

Me gustaría crear un índice para la base de datos PostGIS en Postgresql.

Esta es mi tabla (simplificada):

CREATE EXTENSION postgis;
CREATE EXTENSION btree_gist;
CREATE TABLE table1 (id int, data boolean);
SELECT AddGeometryColumn('table1', 'geom', 900913, 'linestring', 2);

Cuando creo el índice:

CREATE INDEX index1 ON table1 USING gist(data, geom);

falló con un mensaje de error:

ERROR:  data type boolean has no default operator class for access method "gist"
HINT: You must specify an operator class for the index or define a default operator class for the data type.

El problema es que btree_gist no soporta boolean tipo. Sí funcionó con otros tipos como int .

Pero no puedo cambiar el tipo de boolean a int porque lo anterior está simplificado. En mi problema original, lo que quiero es un índice sobre la expresión y no puedo modificar la expresión (generada por el programa).

2voto

NilObject Puntos 7874

Incluso si estás usando un índice funcional no hay ninguna razón por la que no puedas construirlo, sólo tienes que envolver tu salida booleana en una función de casting:

CREATE INDEX funcindex ON foobar USING GIST (int4(foo>'bar'));

Ahora sólo tienes que asegurarte de que tu consulta utiliza la expresión exacta en tu índice:

SELECT * FROM funcindex WHERE int4(foo>'bar') = 0;

Así que para el ejemplo de tu pregunta (1 es verdadero, 0 es falso):

CREATE INDEX index1 ON table1 USING gist(int4(data), geom);
SELECT * FROM table1 WHERE int4(data) = 1 AND ST_Intersects(geom, ...)

(Nota al margen: es posible que los índices multi-clave no sean muy efectivos en GIST, asegúrate de hacer algunas pruebas reales de todas las alternativas de rendimiento antes de decidirte por ellas. He visto que funcionan tanto muy bien como no).

2voto

jlehenbauer Puntos 7749

Algunas cosas

  1. AddGeometeryColumn() es antiguo y no debería usarse más. Si está utilizando una versión más reciente (2.0+>) de PostGIS utilice ALTER TABLE en su lugar.

  2. De los documentos,

    Añade una columna de geometría a una tabla de atributos existente. El schema_name es el nombre del esquema de la tabla. El srid debe ser una referencia de valor entero a una entrada de la tabla SPATIAL_REF_SYS. El tipo debe ser una cadena correspondiente al tipo de geometría, por ejemplo, 'POLIGONO' o 'MULTILINEAL'. Se produce un error si el nombre del esquema no existe (o no es visible en la ruta de búsqueda actual) o si el SRID, el tipo de geometría o la dimensión especificados no son válidos.

  3. No tiene ningún sentido, afaik, almacenar un tipo GEOMETRY en bool. Los tipos de PostGIS son TOASTed. Un bool es un byte en línea en la página de la fila, nunca tostado. Incluso un ST_Point es de 32 bytes...

    SELECT * FROM pg_column_size( ST_POINT(0,0) );
    pg_column_size 
    ----------------
                 32

En otra lectura, no tiene ningún sentido tener un índice gist en un tipo bool. Si lo que se pretende es tener un parcial índice gist. Puedes crear uno así

CREATE TABLE foo AS
SELECT true AS bar, ST_MakePoint(0,0)::geometry AS geom;

CREATE INDEX ON foo USING gist( geom ) WHERE bar;

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X