F.5. btree_gist
ÐодÑÐ»Ñ btree_gist пÑедоÑÑавлÑÐµÑ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑелÑнÑе клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов GiST, ÑеализÑÑÑие поведение, подобное ÑомÑ, ÑÑо ÑеализÑÑÑ Ð¾Ð±ÑÑнÑе клаÑÑÑ B-деÑева, Ð´Ð»Ñ Ñипов даннÑÑ
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, inet и cidr.
ÐообÑе говоÑÑ, ÑÑи клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов не бÑдÑÑ ÑабоÑаÑÑ Ð±ÑÑÑÑее аналогиÑнÑÑ ÑÑандаÑÑнÑÑ Ð¼ÐµÑодов индекÑа-B-деÑева, и им не Ñ Ð²Ð°ÑÐ°ÐµÑ Ð¾Ð´Ð½Ð¾Ð¹ важной возможноÑÑи ÑÑандаÑÑной ÑеализаÑии B-деÑева: возможноÑÑи огÑаниÑиваÑÑ ÑникалÑноÑÑÑ. Ðднако они пÑедлагаÑÑ Ð½ÐµÑколÑко дÑÑÐ³Ð¸Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑей, опиÑаннÑÑ Ð½Ð¸Ð¶Ðµ. Также ÑÑи клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов полезнÑ, когда ÑÑебÑеÑÑÑ ÑоÑÑавной Ð¸Ð½Ð´ÐµÐºÑ GiST, в коÑоÑом некоÑоÑÑе ÑÑолбÑÑ Ð¸Ð¼ÐµÑÑ ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ , индекÑиÑÑемÑе ÑолÑко Ñ GiST, а дÑÑгие â пÑоÑÑÑе ÑипÑ. ÐаконеÑ, ÑÑи клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов можно пÑименÑÑÑ Ð´Ð»Ñ ÑеÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ GiST или взÑÑÑ Ð·Ð° оÑÐ½Ð¾Ð²Ñ Ð´Ð»Ñ ÑазÑабоÑки дÑÑÐ³Ð¸Ñ ÐºÐ»Ð°ÑÑов опеÑаÑоÑов GiST.
Ðомимо ÑипиÑнÑÑ
опеÑаÑоÑов поиÑка по B-деÑевÑ, btree_gist Ñакже поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¸ÑполÑзование индекÑа Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑии <> («не Ñавно»). ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ в ÑоÑеÑании Ñ Ð¾Ð³ÑаниÑением-иÑклÑÑением, как опиÑано ниже.
Также, Ð´Ð»Ñ Ñипов даннÑÑ
, имеÑÑиÑ
еÑÑеÑÑвеннÑÑ Ð¼ÐµÑÑÐ¸ÐºÑ ÑаÑÑÑоÑниÑ, btree_gist опÑеделÑÐµÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ ÑаÑÑÑоÑÐ½Ð¸Ñ <-> и поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¸ÑполÑзование индекÑов GiST Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка ближайÑиÑ
ÑоÑедей Ñ Ð¿Ñименением ÑÑого опеÑаÑоÑа. ÐпеÑаÑоÑÑ ÑаÑÑÑоÑÐ½Ð¸Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð´Ð»Ñ Ñипов int2, int4, int8, float4, float8, timestamp with time zone, timestamp without time zone, time without time zone, date, interval, oid и money.
F.5.1. ÐÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑзованиÑ
ÐÑоÑÑой пÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ btree_gist вмеÑÑо btree:
CREATE TABLE test (a int4); -- ÑоздаÑÑ Ð¸Ð½Ð´ÐµÐºÑ CREATE INDEX testidx ON test USING GIST (a); -- запÑÐ¾Ñ SELECT * FROM test WHERE a < 10; -- поиÑк ближайÑÐ¸Ñ ÑоÑедей: найÑи деÑÑÑÑ Ð·Ð°Ð¿Ð¸Ñей, ближайÑÐ¸Ñ Ðº "42" SELECT *, a <-> 42 AS dist FROM test ORDER BY a <-> 42 LIMIT 10;
Так можно иÑполÑзоваÑÑ Ð¾Ð³ÑаниÑение-иÑклÑÑение, ÑоÑÑоÑÑее в Ñом, ÑÑо в клеÑке в зоопаÑке могÑÑ ÑодеÑжаÑÑÑÑ Ð¶Ð¸Ð²Ð¾ÑнÑе ÑолÑко одного Ñипа:
=> 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.5.2. ÐвÑоÑÑ
ФÑÐ´Ð¾Ñ Ð¡Ð¸Ð³Ð°ÐµÐ² (<[email protected]>), Ðлег ÐаÑÑÑнов (<[email protected]>) и Янко РиÑ
ÑÐµÑ (<[email protected]>). ÐодÑобноÑÑи можно найÑи на ÑÑÑаниÑе http://www.sai.msu.su/~megera/postgres/gist/.