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.
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
Teodor Sigaev (<[email protected]>),
Oleg Bartunov (<[email protected]>),
Janko Richter (<[email protected]>) y
Paul Jungwirth (<[email protected]>). Consulta
http://www.sai.msu.su/~megera/postgres/gist/
para obtener información adicional.