F.8. btree_gist — clases de operadores GiST con comportamiento de árbol B #

F.8.1. Ejemplo de uso
F.8.2. Autores

btree_gist proporciona clases de operadores de índices GiST que implementan un comportamiento equivalente al de un árbol B (B-tree) para los tipos de datos int2, int4, int8, float4, float8, numeric, timestamp with time zone, timestamp without time zone, time with time zone, time without time zone, date, interval, oid, money, char, varchar, text, bytea, bit, varbit, macaddr, macaddr8, inet, cidr, uuid, bool y todos los tipos enum.

En general, estas clases de operadores no superarán el rendimiento de los métodos de índice B-tree estándar equivalentes, y carecen de una característica principal del código B-tree estándar: la capacidad de imponer la unicidad. Sin embargo, proporcionan algunas otras características que no están disponibles con un índice B-tree, como se describe a continuación. Además, estas clases de operadores son útiles cuando se necesita un índice GiST multicolumna, en el que algunas de las columnas son de tipos de datos que solo son indexables con GiST pero otras columnas son solo tipos de datos simples. Por último, estas clases de operadores son útiles para realizar pruebas de GiST y como base para desarrollar otras clases de operadores GiST.

Además de los operadores de búsqueda típicos de B-tree, btree_gist también proporciona soporte de índice para <> («diferente de»). Esto puede ser útil en combinación con una restricción de exclusión, como se describe a continuación.

Además, para los tipos de datos para los que existe una métrica de distancia natural, btree_gist define un operador de distancia <-> y proporciona soporte de índice GiST para búsquedas del vecino más cercano utilizando este operador. Se proporcionan operadores de distancia para int2, int4, int8, float4, float8, timestamp with time zone, timestamp without time zone, time without time zone, date, interval, oid y money.

Por defecto, btree_gist construye el índice GiST con sortsupport en modo ordenado (sorted). Esto suele dar como resultado una velocidad de construcción del índice mucho más rápida. Aún es posible revertir a la estrategia de construcción con búfer utilizando el parámetro buffering al crear el índice.

Este módulo se considera de «confianza» (trusted), es decir, puede ser instalado por no superusuarios que tengan el privilegio CREATE en la base de datos actual.

F.8.1. Ejemplo de uso #

Ejemplo sencillo utilizando btree_gist en lugar de btree:

CREATE TABLE test (a int4);
-- crear índice
CREATE INDEX testidx ON test USING GIST (a);
-- consulta
SELECT * FROM test WHERE a < 10;
-- búsqueda de vecino más cercano: encuentra las diez entradas más cercanas a «42»
SELECT *, a <-> 42 AS dist FROM test ORDER BY a <-> 42 LIMIT 10;

Utiliza una restricción de exclusión para imponer la regla de que una jaula en un zoológico solo puede contener un tipo de animal:

=> CREATE TABLE zoo (
  cage   INTEGER,
  animal TEXT,
  EXCLUDE USING GIST (cage WITH =, animal WITH <>)
);

=> INSERT INTO zoo VALUES(123, 'zebra');
INSERT 0 1
=> INSERT INTO zoo VALUES(123, 'zebra');
INSERT 0 1
=> INSERT INTO zoo VALUES(123, 'lion');
ERROR:  conflicting key value violates exclusion constraint "zoo_cage_animal_excl"
DETAIL:  Key (cage, animal)=(123, lion) conflicts with existing key (cage, animal)=(123, zebra).
=> INSERT INTO zoo VALUES(124, 'lion');
INSERT 0 1

F.8.2. Autores #

Teodor Sigaev (), Oleg Bartunov (), Janko Richter () y Paul Jungwirth (). Consulta http://www.sai.msu.su/~megera/postgres/gist/ para obtener información adicional.