btree_gist
fournit des classes d'opérateur
GiST qui codent un comportement équivalent à celui du B-tree pour les
types de données
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
et tous les types enum
.
En règle générale, ces classes d'opérateur ne sont pas plus perfomantes que les méthodes d'indexage standard équivalentes du B-tree. Et il leur manque une fonctionnalité majeure : la possibilité d'assurer l'unicité. Néanmoins, elles fournissent d'autres fonctionnalités qui ne sont pas disponibles avec un index B-tree, comme décrit ci-dessous. De plus, ces classes d'opérateur sont utiles quand un index GiST multi-colonnes est nécessaire, quand certaines colonnes sont d'un type de données seulement indexable avec GiST. Enfin, ces classes d'opérateur sont utiles pour tester GiST et comme base de développement pour d'autres classes d'opérateur GiST.
En plus des opérateurs de recherche B-tree typiques, btree_gist
fournit aussi un support pour <>
(« non
égale »). C'est utile en combinaison avec une
contrainte d'exclusion, comme
décrit ci-dessous.
De plus, pour les types de données disposant d'une métrique naturelle pour la
distance, btree_gist
définit un opérateur de distance,
<->
, et fournit un support par index GiST pour les
recherches du type voisin-le-plus-proche en utilisant cet opérateur. Les
opérateurs de distance sont fournis pour
int2
, int4
, int8
, float4
,
float8
, timestamp with time zone
,
timestamp without time zone
,
time without time zone
, date
, interval
,
oid
et money
.
Exemple simple d'utilisation de btree_gist
au lieu
d'un index btree
:
CREATE TABLE test (a int4); -- création de l'index CREATE INDEX testidx ON test USING GIST (a); -- requête SELECT * FROM test WHERE a < 10; -- nearest-neighbor search: find the ten entries closest to "42" SELECT *, a <-> 42 AS dist FROM test ORDER BY a <-> 42 LIMIT 10;
Utiliser une contrainte d'exclusion pour imposer qu'une cage dans un zoo ne contienne qu'un seul type d'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 (<teodor@stack.net>
), Oleg Bartunov
(<oleg@sai.msu.su>
), Janko Richter
(<jankorichter@yahoo.de>
) et Paul Jungwirth
(<pj@illuminatedcomputing.com>
). Voir le site sur GiST
pour plus d'informations.