F.8. btree_gist â клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов GiST Ñ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸ÐµÐ¼ B-деÑева #
ÐодÑÐ»Ñ 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, macaddr8, inet, cidr, uuid, bool и вÑеÑ
Ñипов enum.
ÐообÑе говоÑÑ, ÑÑи клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов не бÑдÑÑ ÑабоÑаÑÑ Ð±ÑÑÑÑее аналогиÑнÑÑ ÑÑандаÑÑнÑÑ Ð¼ÐµÑодов индекÑа-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.
Ðо ÑмолÑÐ°Ð½Ð¸Ñ btree_gist ÑÑÑÐ¾Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑ GiST Ñ Ð¸ÑполÑзованием ÑÑнкÑии sortsupport в оÑÑоÑÑиÑованном Ñежиме. ÐÑо, как пÑавило, позволÑÐµÑ ÑÑÑеÑÑвенно ÑÑкоÑиÑÑ Ð¿Ð¾ÑÑÑоение индекÑа. Тем не менее, можно веÑнÑÑÑÑÑ Ðº ÑÑÑаÑегии поÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ñ Ð±ÑÑеÑизаÑией, Ñказав паÑамеÑÑ buffering пÑи Ñоздании индекÑа.
ÐаннÑй модÑÐ»Ñ ÑÑиÑаеÑÑÑ Â«Ð´Ð¾Ð²ÐµÑеннÑм», Ñо еÑÑÑ ÐµÐ³Ð¾ могÑÑ ÑÑÑанавливаÑÑ Ð¾Ð±ÑÑнÑе полÑзоваÑели, имеÑÑие пÑаво CREATE в ÑекÑÑей базе даннÑÑ
.
F.8.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.8.2. ÐвÑоÑÑ #
ФÑÐ´Ð¾Ñ Ð¡Ð¸Ð³Ð°ÐµÐ² (<[email protected]>), Ðлег ÐаÑÑÑнов (<[email protected]>), Янко РиÑ
ÑÐµÑ (<[email protected]>) и Ðол ЮнгвиÑÑ (<[email protected]>). ÐодÑобноÑÑи можно найÑи на ÑÑÑаниÑе http://www.sai.msu.su/~megera/postgres/gist/.