F.24. intarray
ÐодÑÐ»Ñ intarray пÑедоÑÑавлÑÐµÑ ÑÑд полезнÑÑ
ÑÑнкÑий и опеÑаÑоÑов Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¼Ð°ÑÑивами ÑелÑÑ
ÑиÑел без NULL. Также он поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿Ð¾Ð¸Ñк по индекÑÑ Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ
из ÑÑиÑ
опеÑаÑоÑов.
ÐÑе ÑÑи опеÑаÑии вÑдаÑÑ Ð¾ÑибкÑ, еÑли в пеÑедаваемом маÑÑиве оказÑваÑÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ NULL.
Ðногие из ÑÑÐ¸Ñ Ð¾Ð¿ÐµÑаÑий имеÑÑ ÑмÑÑл ÑолÑко Ñ Ð¾Ð´Ð½Ð¾Ð¼ÐµÑнÑми маÑÑивами. ХоÑÑ Ð¸Ð¼ можно пеÑедаÑÑ Ð²Ñ Ð¾Ð´Ð½Ð¾Ð¹ маÑÑив и болÑÑей ÑазмеÑноÑÑи, знаÑÐµÐ½Ð¸Ñ Ð±ÑдÑÑ ÑÑиÑÑваÑÑÑÑ Ð¸Ð· него как из линейного маÑÑива в поÑÑдке Ñ ÑанениÑ.
ÐаннÑй модÑÐ»Ñ ÑÑиÑаеÑÑÑ Â«Ð´Ð¾Ð²ÐµÑеннÑм», Ñо еÑÑÑ ÐµÐ³Ð¾ могÑÑ ÑÑÑанавливаÑÑ Ð¾Ð±ÑÑнÑе полÑзоваÑели, имеÑÑие пÑаво CREATE в ÑекÑÑей базе даннÑÑ
.
F.24.1. ФÑнкÑии и опеÑаÑоÑÑ intarray
РеализованнÑе в модÑле intarray ÑÑнкÑии пеÑеÑиÑÐ»ÐµÐ½Ñ Ð² ТаблиÑе F.14, а опеÑаÑоÑÑ â в ТаблиÑе F.15.
ТаблиÑа F.14. ФÑнкÑии intarray
ТаблиÑа F.15. ÐпеÑаÑоÑÑ intarray
ÐпеÑаÑÐ¾Ñ ÐпиÑание |
|---|
ÐаÑÑÐ¸Ð²Ñ Ð¿ÐµÑеÑекаÑÑÑÑ (Ñ Ð½Ð¸Ñ ÐµÑÑÑ Ð¼Ð¸Ð½Ð¸Ð¼Ñм один обÑий ÑлеменÑ)? |
ÐевÑй маÑÑив ÑодеÑÐ¶Ð¸Ñ Ð¿ÑавÑй? |
ÐевÑй маÑÑив ÑодеÑжиÑÑÑ Ð² пÑавом? |
ÐÑдаÑÑ ÑиÑло ÑлеменÑов в маÑÑиве. |
ÐÑдаÑÑ Ð¸Ð½Ð´ÐµÐºÑ Ð¿ÐµÑвого ÑлеменÑа, Ñавного пÑÐ°Ð²Ð¾Ð¼Ñ Ð°ÑгÑменÑÑ, или 0, еÑли Ñакого ÑлеменÑа неÑ. (Ðналог ÑÑнкÑии |
ÐобавлÑÐµÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð² ÐºÐ¾Ð½ÐµÑ Ð¼Ð°ÑÑива. |
СоединÑÐµÑ Ð´Ð²Ð° маÑÑива. |
УдалÑÐµÑ Ð¸Ð· маÑÑива ÑлеменÑÑ, ÑавнÑе пÑÐ°Ð²Ð¾Ð¼Ñ Ð°ÑгÑменÑÑ. |
УдалÑÐµÑ Ð¸Ð· левого маÑÑива ÑлеменÑÑ Ð¿Ñавого маÑÑива. |
ÐÑÑиÑлÑÐµÑ Ð¾Ð±Ñединение аÑгÑменÑов. |
ÐÑÑиÑлÑÐµÑ Ð¾Ð±Ñединение аÑгÑменÑов. |
ÐÑÑиÑлÑÐµÑ Ð¿ÐµÑеÑеÑение аÑгÑменÑов. |
ÐаÑÑив ÑдовлеÑвоÑÑÐµÑ Ð·Ð°Ð¿ÑоÑÑ? (Ñм. ниже) |
ÐаÑÑив ÑдовлеÑвоÑÑÐµÑ Ð·Ð°Ð¿ÑоÑÑ? (коммÑÑиÑÑÑÑий опеÑаÑÐ¾Ñ Ðº |
(Ðо веÑÑии PostgreSQL 8.2 опеÑаÑоÑÑ Ð²ÐºÐ»ÑÑÐµÐ½Ð¸Ñ @> и <@ обознаÑалиÑÑ ÑооÑвеÑÑÑвенно как @ и ~. ÐÑи имена по-пÑÐµÐ¶Ð½ÐµÐ¼Ñ Ð´ÐµÐ¹ÑÑвÑÑÑ, но ÑÑиÑаÑÑÑÑ ÑÑÑаÑевÑими и в конÑе конÑов бÑдÑÑ ÑпÑаздненÑ. ÐамеÑÑÑе, ÑÑо ÑÑаÑÑе имена пÑоизоÑли из ÑоглаÑениÑ, коÑоÑÐ¾Ð¼Ñ ÑанÑÑе Ñледовали клÑÑевÑе геомеÑÑиÑеÑкие ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
!)
ÐпеÑаÑоÑÑ &&, @> и <@ ÑавнознаÑÐ½Ñ Ð²ÑÑÑоеннÑм опеÑаÑоÑам Postgres Pro Ñ Ñеми же именами, за иÑклÑÑением Ñого, ÑÑо они ÑабоÑаÑÑ ÑолÑко Ñ ÑелоÑиÑленнÑми маÑÑивами, не ÑодеÑжаÑими NULL, Ñогда как вÑÑÑоеннÑе опеÑаÑоÑÑ ÑабоÑаÑÑ Ñ Ð¼Ð°ÑÑивами лÑбÑÑ
Ñипов. ÐлагодаÑÑ ÑÑÐ¾Ð¼Ñ Ð¾Ð³ÑаниÑениÑ, в болÑÑинÑÑве ÑлÑÑаев они ÑабоÑаÑÑ Ð±ÑÑÑÑее, Ñем вÑÑÑоеннÑе опеÑаÑоÑÑ.
ÐпеÑаÑоÑÑ @@ и ~~ пÑовеÑÑÑÑ, ÑдовлеÑвоÑÑÐµÑ Ð»Ð¸ маÑÑив запÑоÑÑ, пÑедÑÑавлÑÐµÐ¼Ð¾Ð¼Ñ Ð² виде знаÑÐµÐ½Ð¸Ñ ÑпеÑиализиÑованного Ñипа даннÑÑ
query_int. ÐапÑÐ¾Ñ ÑодеÑÐ¶Ð¸Ñ ÑелоÑиÑленнÑе знаÑениÑ, ÑÑавниваемÑе Ñ ÑлеменÑами маÑÑива, возможно Ñ Ð¸ÑполÑзованием опеÑаÑоÑов & (AND), | (OR) и ! (NOT). ÐÑи необÑ
одимоÑÑи могÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ñкобки. ÐапÑимеÑ, запÑоÑÑ 1&(2|3) ÑдовлеÑвоÑÑÑÑ Ð·Ð°Ð¿ÑоÑÑ, коÑоÑÑе ÑодеÑÐ¶Ð°Ñ 1 и Ñакже ÑодеÑÐ¶Ð°Ñ 2 или 3.
F.24.2. ÐоддеÑжка индекÑов
ÐодÑÐ»Ñ intarray поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¸Ð½Ð´ÐµÐºÑÑ Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑоÑов &&, @>, <@ и @@, а Ñакже обÑÑнÑÑ Ð¿ÑовеÑÐºÑ ÑавенÑÑва маÑÑивов.
ÐодÑÐ»Ñ Ð¿ÑедоÑÑавлÑÐµÑ Ð´Ð²Ð° паÑамеÑÑизованнÑÑ
клаÑÑа опеÑаÑоÑов GiST: gist__int_ops (иÑполÑзÑеÑÑÑ Ð¿Ð¾ ÑмолÑаниÑ), подÑ
одÑÑий Ð´Ð»Ñ Ð¼Ð°Ð»ÐµÐ½ÑкиÑ
и ÑÑедниÑ
по ÑазмеÑÑ Ð½Ð°Ð±Ð¾Ñов даннÑÑ
, и gist__intbig_ops, пÑименÑÑÑий ÑигнаÑÑÑÑ Ð±Ð¾Ð»ÑÑего ÑазмеÑа и подÑ
одÑÑий Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑаÑии болÑÑиÑ
набоÑов даннÑÑ
(Ñо еÑÑÑ ÑÑолбÑов, ÑодеÑжаÑиÑ
много ÑазлиÑнÑÑ
знаÑений маÑÑива). Ð ÑÑой ÑеализаÑии иÑполÑзÑеÑÑÑ ÑÑÑÑкÑÑÑа даннÑÑ
RD-деÑева Ñо вÑÑÑоеннÑм ÑжаÑием Ñ Ð¿Ð¾ÑеÑÑми.
ÐлаÑÑ gist__int_ops аппÑокÑимиÑÑÐµÑ Ð½Ð°Ð±Ð¾Ñ ÑелÑÑ
ÑиÑел в виде маÑÑива диапазонов. Рего необÑзаÑелÑном ÑелоÑиÑленном паÑамеÑÑе numranges можно задаÑÑ Ð¼Ð°ÐºÑималÑное ÑиÑло диапазонов в одном клÑÑе индекÑа. ÐаÑамеÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинимаÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¾Ñ 1 до 253, по ÑмолÑÐ°Ð½Ð¸Ñ Ð¾Ð½ Ñавен 100. ÐÑи ÑвелиÑении ÑиÑла маÑÑивов, ÑоÑÑавлÑÑÑиÑ
клÑÑ Ð¸Ð½Ð´ÐµÐºÑа GiST, поиÑк ÑабоÑÐ°ÐµÑ ÑоÑнее (ÑканиÑÑеÑÑÑ Ð¼ÐµÐ½ÑÑÐ°Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð² индекÑе и менÑÑе ÑÑÑÐ°Ð½Ð¸Ñ ÐºÑÑи), но Ñам Ð¸Ð½Ð´ÐµÐºÑ ÑÑановиÑÑÑ Ð±Ð¾Ð»ÑÑе.
ÐлаÑÑ gist__intbig_ops аппÑокÑимиÑÑÐµÑ Ð½Ð°Ð±Ð¾Ñ ÑелÑÑ
ÑиÑел в виде ÑигнаÑÑÑÑ Ð±Ð¸Ñовой каÑÑÑ. Рего необÑзаÑелÑном ÑелоÑиÑленном паÑамеÑÑе siglen можно задаÑÑ ÑÐ°Ð·Ð¼ÐµÑ ÑигнаÑÑÑÑ Ð² байÑаÑ
. ÐаÑамеÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинимаÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¾Ñ 1 до 2024, по ÑмолÑÐ°Ð½Ð¸Ñ Ð¾Ð½ Ñавен 16. ÐÑи ÑвелиÑении ÑазмеÑа ÑигнаÑÑÑÑ Ð¿Ð¾Ð¸Ñк ÑабоÑÐ°ÐµÑ ÑоÑнее (ÑканиÑÑеÑÑÑ Ð¼ÐµÐ½ÑÑÐ°Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð² индекÑе и менÑÑе ÑÑÑÐ°Ð½Ð¸Ñ ÐºÑÑи), но Ñам Ð¸Ð½Ð´ÐµÐºÑ ÑÑановиÑÑÑ Ð±Ð¾Ð»ÑÑе.
ÐÑÑÑ Ñакже неÑÑандаÑÑнÑй клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов GIN, gin__int_ops, поддеÑживаÑÑий Ñе же опеÑаÑоÑÑ.
ÐÑÐ±Ð¾Ñ Ð¼ÐµÐ¶Ð´Ñ Ð¸Ð½Ð´ÐµÐºÑами GiST и GIN завиÑÐ¸Ñ Ð¾Ñ Ð¾ÑноÑиÑелÑнÑÑ Ñ Ð°ÑакÑеÑиÑÑик пÑоизводиÑелÑноÑÑи GiST и GIN, коÑоÑÑе здеÑÑ Ð½Ðµ ÑаÑÑмаÑÑиваÑÑÑÑ.
F.24.3. ÐÑимеÑ
-- ÑообÑение Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑноÑиÑÑÑÑ Ðº одной или неÑколÑким «ÑекÑиÑм»
CREATE TABLE message (mid INT PRIMARY KEY, sections INT[], ...);
-- ÑоздаÑÑ ÑпеÑиализиÑованнÑй Ð¸Ð½Ð´ÐµÐºÑ Ñ Ð´Ð»Ð¸Ð½Ð¾Ð¹ ÑигнаÑÑÑÑ 32 байÑа
CREATE INDEX message_rdtree_idx ON message USING GIST (sections gist__intbig_ops (siglen = 32));
-- вÑвеÑÑи ÑообÑÐµÐ½Ð¸Ñ Ð¸Ð· ÑекÑий 1 или 2 â опеÑаÑÐ¾Ñ Ð¿ÐµÑеÑеÑениÑ
SELECT message.mid FROM message WHERE message.sections && '{1,2}';
-- вÑвеÑÑи ÑообÑÐµÐ½Ð¸Ñ Ð¸Ð· ÑекÑий 1 и 2 â опеÑаÑÐ¾Ñ Ð²ÐºÐ»ÑÑениÑ
SELECT message.mid FROM message WHERE message.sections @> '{1,2}';
-- ÑÐ¾Ñ Ð¶Ðµ ÑезÑлÑÑаÑ, но Ñ Ð¾Ð¿ÐµÑаÑоÑом запÑоÑа
SELECT message.mid FROM message WHERE message.sections @@ '1&2'::query_int;F.24.4. ÐвÑоÑÑ
РазÑабоÑÐºÑ Ð¾ÑÑÑеÑÑвили ФÑÐ´Ð¾Ñ Ð¡Ð¸Ð³Ð°ÐµÐ² (<[email protected]>) и Ðлег ÐаÑÑÑнов (<[email protected]>). ÐополниÑелÑнÑе ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ найÑи на ÑÑÑаниÑе http://www.sai.msu.su/~megera/postgres/gist/. ÐндÑей ÐкÑÑбÑÑÑкий пÑоделал оÑлиÑнÑÑ ÑабоÑÑ, добавив новÑе ÑÑнкÑии и опеÑаÑоÑÑ.