36.16. ÐнÑеÑÑейÑÑ ÑаÑÑиÑений Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑов #
- 36.16.1. ÐеÑÐ¾Ð´Ñ Ð¸Ð½Ð´ÐµÐºÑов и клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов
- 36.16.2. СÑÑаÑегии меÑодов индекÑов
- 36.16.3. ÐпоÑнÑе пÑоÑедÑÑÑ Ð¼ÐµÑода индекÑа
- 36.16.4. ÐÑимеÑ
- 36.16.5. СемейÑÑва и клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов
- 36.16.6. СиÑÑемнÑе завиÑимоÑÑи Ð¾Ñ ÐºÐ»Ð°ÑÑов опеÑаÑоÑов
- 36.16.7. ÐпеÑаÑоÑÑ ÑпоÑÑдоÑиваниÑ
- 36.16.8. ÐÑобенноÑÑи клаÑÑов опеÑаÑоÑов
- 36.16.2. СÑÑаÑегии меÑодов индекÑов
ÐпиÑаннÑе до ÑÑого пÑоÑедÑÑÑ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñли опÑеделÑÑÑ Ð½Ð¾Ð²Ñе ÑипÑ, ÑÑнкÑии и опеÑаÑоÑÑ. Ðднако Ð¼Ñ ÐµÑÑ Ð½Ðµ можем опÑеделиÑÑ Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾ ÑÑолбÑÑ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ñипа даннÑÑ . ÐÐ»Ñ ÑÑого нам поÑÑебÑеÑÑÑ ÑоздаÑÑ ÐºÐ»Ð°ÑÑ Ð¾Ð¿ÐµÑаÑоÑов Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ñипа даннÑÑ . Ðалее в ÑÑом Ñазделе Ð¼Ñ Ð¿ÑодемонÑÑÑиÑÑем ÑÑÑ ÐºÐ¾Ð½ÑепÑÐ¸Ñ Ð½Ð° пÑимеÑе: Ð¼Ñ Ñоздадим новÑй клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов Ð´Ð»Ñ Ð¼ÐµÑода индекÑа-B-деÑева, в коÑоÑом бÑдÑÑ Ñ ÑаниÑÑÑÑ ÐºÐ¾Ð¼Ð¿Ð»ÐµÐºÑнÑе ÑиÑла и ÑоÑÑиÑоваÑÑÑÑ Ð¿Ð¾ возÑаÑÑÐ°Ð½Ð¸Ñ Ð°Ð±ÑолÑÑного знаÑениÑ.
ÐлаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов могÑÑ Ð¾Ð±ÑединÑÑÑÑÑ Ð² ÑемейÑÑва опеÑаÑоÑов, вÑÑажаÑÑие завиÑимоÑÑи Ð¼ÐµÐ¶Ð´Ñ ÑеманÑиÑеÑки ÑовмеÑÑимÑми клаÑÑами. Ðогда вводиÑÑÑ Ð¾Ð´Ð¸Ð½ Ñип даннÑÑ , доÑÑаÑоÑно клаÑÑа опеÑаÑоÑов, Ñак ÑÑо Ð¼Ñ Ð½Ð°ÑнÑм Ñ Ð½ÐµÐ³Ð¾, а к ÑемейÑÑвам опеÑаÑоÑов веÑнÑмÑÑ Ð¿Ð¾Ð·Ð¶Ðµ.
36.16.1. ÐеÑÐ¾Ð´Ñ Ð¸Ð½Ð´ÐµÐºÑов и клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов #
ÐлаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов ÑвÑзÑваÑÑÑÑ Ñ Ð¸Ð½Ð´ÐµÐºÑнÑми меÑодами доÑÑÑпа, напÑÐ¸Ð¼ÐµÑ B-деÑево или GIN. ÐолÑзоваÑелÑÑкий индекÑнÑй меÑод доÑÑÑпа можно опÑеделиÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE ACCESS METHOD. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº Ðлаве 61.
ÐÑоÑедÑÑÑ Ð¼ÐµÑода индекÑа непоÑÑедÑÑвенно ниÑего не знаÑÑ Ð¾ ÑипаÑ
даннÑÑ
, Ñ ÐºÐ¾ÑоÑÑми бÑÐ´ÐµÑ Ð¿ÑименÑÑÑÑÑ ÑÑÐ¾Ñ Ð¼ÐµÑод. ÐмеÑÑо ÑÑого, Ð½Ð°Ð±Ð¾Ñ Ð¾Ð¿ÐµÑаÑий, коÑоÑÑе нÑÐ¶Ð½Ñ Ð¼ÐµÑÐ¾Ð´Ñ Ð¸Ð½Ð´ÐµÐºÑа Ð´Ð»Ñ ÑабоÑÑ Ñ ÐºÐ¾Ð½ÐºÑеÑнÑм Ñипом даннÑÑ
, опÑеделÑеÑÑÑ ÐºÐ»Ð°ÑÑом опеÑаÑоÑов. ÐлаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов назÑваÑÑÑÑ Ñак поÑомÑ, ÑÑо они опÑеделÑÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво опеÑаÑоÑов в пÑедложении WHERE, коÑоÑÑе могÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ñ Ð¸Ð½Ð´ÐµÐºÑом (Ñ. е. могÑÑ Ð±ÑÑÑ ÑÐ²ÐµÐ´ÐµÐ½Ñ Ðº ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа). РклаÑÑе опеÑаÑоÑов могÑÑ Ñакже опÑеделÑÑÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе опоÑнÑе ÑÑнкÑии, необÑ
одимÑе Ð´Ð»Ñ Ð²Ð½ÑÑÑенниÑ
опеÑаÑий меÑода индекÑа, но они не ÑооÑвеÑÑÑвÑÑÑ Ð½Ð°Ð¿ÑÑмÑÑ ÐºÐ°ÐºÐ¸Ð¼-либо опеÑаÑоÑам пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WHERE, коÑоÑÑе могÑÑ Ð¾Ð±ÑабаÑÑваÑÑÑÑ Ñ Ð¸Ð½Ð´ÐµÐºÑом.
ÐÐ»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñипа даннÑÑ Ð¸ меÑода индекÑа можно опÑеделиÑÑ Ð½ÐµÑколÑко клаÑÑов опеÑаÑоÑов. ÐлагодаÑÑ ÑÑомÑ, Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñипа даннÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзоваÑÑ Ð½ÐµÑколÑко ÑеманÑиÑеÑки ÑазнÑÑ Ð²Ð°ÑианÑов индекÑиÑованиÑ. ÐапÑимеÑ, индекÑ-B-деÑево ÑÑебÑеÑ, ÑÑÐ¾Ð±Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñипа даннÑÑ , Ñ ÐºÐ¾ÑоÑÑм он ÑабоÑаеÑ, опÑеделÑлÑÑ Ð¿Ð¾ÑÑдок ÑоÑÑиÑовки. ÐÐ»Ñ Ñипа комплекÑнÑÑ ÑиÑел Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½ клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов B-деÑева, ÑоÑÑиÑÑÑÑий даннÑе по модÑÐ»Ñ ÐºÐ¾Ð¼Ð¿Ð»ÐµÐºÑного ÑиÑла, и еÑÑ Ð¾Ð´Ð¸Ð½, ÑоÑÑиÑÑÑÑий по веÑеÑÑвенной ÑаÑÑи, и Ñ. п. ÐбÑÑно пÑедполагаеÑÑÑ, ÑÑо один из клаÑÑов опеÑаÑоÑов бÑÐ´ÐµÑ Ð¿ÑименÑÑÑÑÑ ÑаÑе дÑÑÐ³Ð¸Ñ , и Ñогда он помеÑаеÑÑÑ ÐºÐ°Ðº клаÑÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ Ñипа и меÑода индекÑа.
Ðдно и Ñо же Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа опеÑаÑоÑов Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ ÑазнÑÑ
меÑодов индекÑа (напÑимеÑ, Ð´Ð»Ñ Ð¼ÐµÑодов индекÑа-B-деÑева или Ñ
еÑ-индекÑа пÑименÑÑÑÑÑ ÐºÐ»Ð°ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов int4_ops), но вÑе Ñакие клаÑÑÑ ÑвлÑÑÑÑÑ Ð½ÐµÐ·Ð°Ð²Ð¸ÑимÑми и Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾Ð¿ÑеделÑÑÑÑÑ Ð¾ÑделÑно.
36.16.2. СÑÑаÑегии меÑодов индекÑов #
ÐпеÑаÑоÑам, коÑоÑÑе ÑвÑзÑваÑÑÑÑ Ñ ÐºÐ»Ð°ÑÑом опеÑаÑоÑов, назнаÑаÑÑÑÑ Â«Ð½Ð¾Ð¼ÐµÑа ÑÑÑаÑегий», опÑеделÑÑÑие ÑÐ¾Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ опеÑаÑоÑа в конÑекÑÑе его клаÑÑа. ÐапÑимеÑ, в B-деÑеве должен бÑÑÑ ÑÑÑогий поÑÑдок клÑÑей Ñ Ð¾ÑноÑениÑми менÑÑе/болÑÑе, Ñак ÑÑо в данном конÑекÑÑе пÑедÑÑавлÑÑÑ Ð¸Ð½ÑеÑÐµÑ Ð¾Ð¿ÐµÑаÑоÑÑ Â«Ð¼ÐµÐ½ÑÑе» и «болÑÑе или Ñавно». Так как Postgres Pro позволÑÐµÑ Ð¿Ð¾Ð»ÑзоваÑелÑм опÑеделÑÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ Ð¿ÑоизволÑнÑм обÑазом, Postgres Pro не Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоÑÑо поÑмоÑÑеÑÑ Ð½Ð° Ð¸Ð¼Ñ Ð¾Ð¿ÐµÑаÑоÑа (< или >=) и ÑказаÑÑ, какое ÑÑавнение он вÑполнÑеÑ. ÐмеÑÑо ÑÑого Ð´Ð»Ñ Ð¼ÐµÑода индекÑа опÑеделÑеÑÑÑ Ð½Ð°Ð±Ð¾Ñ Â«ÑÑÑаÑегий», коÑоÑÑе можно ÑÑиÑаÑÑ Ð¾Ð±Ð¾Ð±ÑÑннÑми опеÑаÑоÑами. ÐаждÑй клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов ÑÑÑанавливаеÑ, какие ÑакÑиÑеÑкие опеÑаÑоÑÑ ÑооÑвеÑÑÑвÑÑÑ ÑÑÑаÑегиÑм Ð´Ð»Ñ Ð¾Ð¿ÑеделÑнного Ñипа даннÑÑ
и инÑеÑпÑеÑаÑии ÑеманÑики индекÑа.
ÐÐ»Ñ Ð¼ÐµÑода индекÑа-B-деÑева опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð¿ÑÑÑ ÑÑÑаÑегий, опиÑаннÑÑ Ð² ТаблиÑе 36.3.
ТаблиÑа 36.3. СÑÑаÑегии B-деÑева
| ÐпеÑаÑÐ¸Ñ | ÐÐ¾Ð¼ÐµÑ ÑÑÑаÑегии |
|---|---|
| менÑÑе | 1 |
| менÑÑе или Ñавно | 2 |
| Ñавно | 3 |
| болÑÑе или Ñавно | 4 |
| болÑÑе | 5 |
ÐндекÑÑ Ð¿Ð¾ Ñ ÐµÑÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ ÑолÑко ÑÑавнение на ÑавенÑÑво, Ñак ÑÑо они иÑполÑзÑÑÑ ÑолÑко Ð¾Ð´Ð½Ñ ÑÑÑаÑегиÑ, показаннÑÑ Ð² ТаблиÑе 36.4.
ТаблиÑа 36.4. СÑÑаÑегии Ñ ÐµÑа
| ÐпеÑаÑÐ¸Ñ | ÐÐ¾Ð¼ÐµÑ ÑÑÑаÑегии |
|---|---|
| Ñавно | 1 |
ÐндекÑÑ GiST более гибкие: Ð´Ð»Ñ Ð½Ð¸Ñ Ð²Ð¾Ð¾Ð±Ñе Ð½ÐµÑ ÑикÑиÑованного набоÑа ÑÑÑаÑегий. ÐмеÑÑо ÑÑого опоÑÐ½Ð°Ñ Ð¿ÑоÑедÑÑа «ÑоглаÑованноÑÑи» каждого конкÑеÑного клаÑÑа опеÑаÑоÑов GiST инÑеÑпÑеÑиÑÑÐµÑ Ð½Ð¾Ð¼ÐµÑа ÑÑÑаÑегий как ей Ñгодно. ÐапÑимеÑ, некоÑоÑÑе из вÑÑÑоеннÑÑ ÐºÐ»Ð°ÑÑов опеÑаÑоÑов Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑов GiST индекÑиÑÑÑÑ Ð´Ð²ÑмеÑнÑе геомеÑÑиÑеÑкие обÑекÑÑ, и ÑеализÑÑÑ ÑÑÑаÑегии «R-деÑева», показаннÑе в ТаблиÑе 36.5. ЧеÑÑÑе из Ð½Ð¸Ñ ÑвлÑÑÑÑÑ Ð¸ÑÑинно двÑмеÑнÑми пÑовеÑками (overlaps, same, contains, contained by); дÑÑгие ÑеÑÑÑе ÑÑиÑÑваÑÑ ÑолÑко оÑдинаÑÑ, а еÑÑ ÑеÑÑÑе пÑоводÑÑ Ð¶Ðµ пÑовеÑки ÑолÑко Ñ Ð°Ð±ÑÑиÑÑами.
ТаблиÑа 36.5. СÑÑаÑегии двÑмеÑного «R-деÑева» индекÑа GiST
| ÐпеÑаÑÐ¸Ñ | ÐÐ¾Ð¼ÐµÑ ÑÑÑаÑегии |
|---|---|
| ÑÑÑого Ñлева Ð¾Ñ | 1 |
| не пÑоÑÑиÑаеÑÑÑ Ð¿Ñавее | 2 |
| пеÑеÑекаеÑÑÑ Ñ | 3 |
| не пÑоÑÑиÑаеÑÑÑ Ð»ÐµÐ²ÐµÐµ | 4 |
| ÑÑÑого ÑпÑава Ð¾Ñ | 5 |
| Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñ | 6 |
| ÑодеÑÐ¶Ð¸Ñ | 7 |
| ÑодеÑжиÑÑÑ Ð² | 8 |
| не пÑоÑÑиÑаеÑÑÑ Ð²ÑÑе | 9 |
| ÑÑÑого ниже | 10 |
| ÑÑÑого вÑÑе | 11 |
| не пÑоÑÑиÑаеÑÑÑ Ð½Ð¸Ð¶Ðµ | 12 |
ÐндекÑÑ SP-GiST Ñакие же гибкие, как и индекÑÑ GiST: Ð´Ð»Ñ Ð½Ð¸Ñ Ð½Ðµ задаÑÑÑÑ ÑикÑиÑованнÑй Ð½Ð°Ð±Ð¾Ñ ÑÑÑаÑегий. ÐмеÑÑо ÑÑого опоÑнÑе пÑоÑедÑÑÑ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ клаÑÑа опеÑаÑоÑов инÑеÑпÑеÑиÑÑÑÑ Ð½Ð¾Ð¼ÐµÑа ÑÑÑаÑегий в ÑооÑвеÑÑÑвии Ñ Ð¾Ð¿Ñеделением клаÑÑа опеÑаÑоÑов. РкаÑеÑÑве пÑимеÑа, в ТаблиÑе 36.6 пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð½Ð¾Ð¼ÐµÑа ÑÑÑаÑегий, ÑÑÑановленнÑе Ð´Ð»Ñ Ð²ÑÑÑоеннÑÑ ÐºÐ»Ð°ÑÑов опеÑаÑоÑов Ð´Ð»Ñ ÑоÑек.
ТаблиÑа 36.6. СÑÑаÑегии SP-GiST Ð´Ð»Ñ ÑоÑек
| ÐпеÑаÑÐ¸Ñ | ÐÐ¾Ð¼ÐµÑ ÑÑÑаÑегии |
|---|---|
| ÑÑÑого Ñлева Ð¾Ñ | 1 |
| ÑÑÑого ÑпÑава Ð¾Ñ | 5 |
| Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñ | 6 |
| ÑодеÑжиÑÑÑ Ð² | 8 |
| ÑÑÑого ниже | 10 |
| ÑÑÑого вÑÑе | 11 |
ÐндекÑÑ GIN Ñакие же гибкие, как и индекÑÑ GiST и SP-GiST: Ð´Ð»Ñ Ð½Ð¸Ñ Ð½Ðµ задаÑÑÑÑ ÑикÑиÑованнÑй Ð½Ð°Ð±Ð¾Ñ ÑÑÑаÑегий. ÐмеÑÑо ÑÑого опоÑнÑе пÑоÑедÑÑÑ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ клаÑÑа опеÑаÑоÑов инÑеÑпÑеÑиÑÑÑÑ Ð½Ð¾Ð¼ÐµÑа ÑÑÑаÑегий в ÑооÑвеÑÑÑвии Ñ Ð¾Ð¿Ñеделением клаÑÑа опеÑаÑоÑов. РкаÑеÑÑве пÑимеÑа, в ТаблиÑе 36.7 пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð½Ð¾Ð¼ÐµÑа ÑÑÑаÑегий, ÑÑÑановленнÑе Ð´Ð»Ñ Ð²ÑÑÑоенного клаÑÑа опеÑаÑоÑов Ð´Ð»Ñ Ð¼Ð°ÑÑивов.
ТаблиÑа 36.7. СÑÑаÑегии GIN Ð´Ð»Ñ Ð¼Ð°ÑÑивов
| ÐпеÑаÑÐ¸Ñ | ÐÐ¾Ð¼ÐµÑ ÑÑÑаÑегии |
|---|---|
| пеÑеÑекаеÑÑÑ Ñ | 1 |
| ÑодеÑÐ¶Ð¸Ñ | 2 |
| ÑодеÑжиÑÑÑ Ð² | 3 |
| Ñавно | 4 |
ÐндекÑÑ BRIN Ñакие же гибкие, как и индекÑÑ GiST, SP-GiST и GIN: Ð´Ð»Ñ Ð½Ð¸Ñ
не задаÑÑÑÑ ÑикÑиÑованнÑй Ð½Ð°Ð±Ð¾Ñ ÑÑÑаÑегий. ÐмеÑÑо ÑÑого опоÑнÑе пÑоÑедÑÑÑ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ клаÑÑа опеÑаÑоÑов инÑеÑпÑеÑиÑÑÑÑ Ð½Ð¾Ð¼ÐµÑа ÑÑÑаÑегий в ÑооÑвеÑÑÑвии Ñ Ð¾Ð¿Ñеделением клаÑÑа опеÑаÑоÑов. РкаÑеÑÑве пÑимеÑа, в ТаблиÑе 36.8 пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð½Ð¾Ð¼ÐµÑа ÑÑÑаÑегий, иÑполÑзÑемÑе вÑÑÑоеннÑми клаÑÑами опеÑаÑоÑов Minmax.
ТаблиÑа 36.8. СÑÑаÑегии BRIN Minmax
| ÐпеÑаÑÐ¸Ñ | ÐÐ¾Ð¼ÐµÑ ÑÑÑаÑегии |
|---|---|
| менÑÑе | 1 |
| менÑÑе или Ñавно | 2 |
| Ñавно | 3 |
| болÑÑе или Ñавно | 4 |
| болÑÑе | 5 |
ÐамеÑÑÑе, ÑÑо вÑе вÑÑепеÑеÑиÑленнÑе опеÑаÑоÑÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ Ð±ÑÐ»ÐµÐ²Ñ Ð·Ð½Ð°ÑениÑ. Ðа пÑакÑике вÑе опеÑаÑоÑÑ, опÑеделÑннÑе как опеÑаÑоÑÑ Ð¿Ð¾Ð¸Ñка Ð´Ð»Ñ Ð¼ÐµÑода индекÑа, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ Ñип boolean, Ñак как они Ð´Ð¾Ð»Ð¶Ð½Ñ Ð½Ð°Ñ
одиÑÑÑÑ Ð½Ð° веÑÑ
нем ÑÑовне пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WHERE, ÑÑÐ¾Ð±Ñ Ð´Ð»Ñ Ð½Ð¸Ñ
пÑименÑлÑÑ Ð¸Ð½Ð´ÐµÐºÑ. (ÐекоÑоÑÑе меÑÐ¾Ð´Ñ Ð´Ð¾ÑÑÑпа по индекÑÑ Ñакже поддеÑживаÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ ÑпоÑÑдоÑиваниÑ, коÑоÑÑе обÑÑно не возвÑаÑаÑÑ Ð±ÑÐ»ÐµÐ²Ñ Ð·Ð½Ð°ÑениÑ; ÑÑо обÑÑждаеÑÑÑ Ð² ÐодÑазделе 36.16.7.)
36.16.3. ÐпоÑнÑе пÑоÑедÑÑÑ Ð¼ÐµÑода индекÑа #
СÑÑаÑегии обÑÑно не даÑÑ ÑиÑÑеме доÑÑаÑоÑно инÑоÑмаÑии, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð½ÑÑÑ, как иÑполÑзоваÑÑ Ð¸Ð½Ð´ÐµÐºÑ. Ðа пÑакÑике, ÑÑÐ¾Ð±Ñ Ð¼ÐµÑÐ¾Ð´Ñ Ð¸Ð½Ð´ÐµÐºÑа ÑабоÑали, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе опоÑнÑе пÑоÑедÑÑÑ. ÐапÑимеÑ, меÑод индекÑа-B-деÑева должен ÑмеÑÑ ÑÑавниваÑÑ Ð´Ð²Ð° клÑÑа и опÑеделÑÑÑ, болÑÑе, Ñавен или менÑÑе ли пеÑвÑй вÑоÑого. ÐналогиÑно, меÑод индекÑа по Ñ ÐµÑÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑмеÑÑ ÑÑавниваÑÑ Ñ ÐµÑ-ÐºÐ¾Ð´Ñ Ð·Ð½Ð°Ñений клÑÑа. ÐÑи опеÑаÑии не ÑооÑвеÑÑÑвÑÑÑ Ð¾Ð¿ÐµÑаÑоÑам, коÑоÑÑе пÑименÑÑÑÑÑ Ð² ÑÑловиÑÑ Ð² ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ SQL; ÑÑо внÑÑÑиÑиÑÑемнÑе подпÑогÑаммÑ, иÑполÑзÑемÑе меÑодами индекÑа.
Так же, как и Ñо ÑÑÑаÑегиÑми, клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов опÑеделÑеÑ, какие конкÑеÑнÑе ÑÑнкÑии Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð³ÑаÑÑ ÐºÐ°Ð¶Ð´ÑÑ Ð¸Ð· Ñолей Ð´Ð»Ñ Ð¾Ð¿ÑеделÑнного Ñипа даннÑÑ Ð¸ инÑеÑпÑеÑаÑии ÑеманÑики индекÑа. ÐÐ»Ñ Ð¼ÐµÑода индекÑа опÑеделÑеÑÑÑ Ð½Ð°Ð±Ð¾Ñ Ð½ÑжнÑÑ ÐµÐ¼Ñ ÑÑнкÑий, а клаÑÑ Ð¾Ð¿ÐµÑаÑоÑа вÑбиÑÐ°ÐµÑ Ð½ÑжнÑе ÑÑнкÑии Ð´Ð»Ñ Ð¿ÑименениÑ, назнаÑÐ°Ñ Ð¸Ð¼ «номеÑа опоÑнÑÑ ÑÑнкÑий», опÑеделÑемÑе меÑодом индекÑа.
ÐекоÑоÑÑе клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов дополниÑелÑно позволÑÑÑ Ð·Ð°Ð´Ð°ÑÑ Ð¿Ð°ÑамеÑÑÑ, ÑпÑавлÑÑÑие иÑ
поведением. У вÑеÑ
вÑÑÑоеннÑÑ
индекÑнÑÑ
меÑодов доÑÑÑпа имееÑÑÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑÐ½Ð°Ñ Ð¾Ð¿Ð¾ÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ options, коÑоÑÐ°Ñ Ð¾Ð¿ÑеделÑÐµÑ Ð½Ð°Ð±Ð¾Ñ Ð¿Ð°ÑамеÑÑов, поддеÑживаемÑÑ
даннÑм клаÑÑом.
ÐÐ»Ñ B-деÑевÑев ÑÑебÑеÑÑÑ Ð¾Ð¿Ð¾ÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¸ могÑÑ Ð¿ÑедоÑÑавлÑÑÑÑÑ ÑеÑÑÑе дополниÑелÑнÑе опоÑнÑе ÑÑнкÑии по вÑбоÑÑ ÑазÑабоÑÑика клаÑÑа опеÑаÑоÑов, опиÑаннÑе в ТаблиÑе 36.9. ТÑÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ðº ÑÑим опоÑнÑм ÑÑнкÑиÑм подÑобно ÑаÑÑмаÑÑиваÑÑÑÑ Ð² ÐодÑазделе 63.1.3.
ТаблиÑа 36.9. ÐпоÑнÑе ÑÑнкÑии B-деÑевÑев
| ФÑнкÑÐ¸Ñ | ÐÐ¾Ð¼ÐµÑ Ð¾Ð¿Ð¾Ñной ÑÑнкÑии |
|---|---|
| СÑÐ°Ð²Ð½Ð¸Ð²Ð°ÐµÑ Ð´Ð²Ð° клÑÑа и возвÑаÑÐ°ÐµÑ Ñелое менÑÑе нÑлÑ, Ð½Ð¾Ð»Ñ Ð¸Ð»Ð¸ Ñелое болÑÑе нÑлÑ, показÑваÑÑее, ÑÑо пеÑвÑй клÑÑ Ð¼ÐµÐ½ÑÑе, Ñавен или болÑÑе вÑоÑого | 1 |
| ÐозвÑаÑÐ°ÐµÑ Ð°Ð´ÑеÑа вÑзÑваемÑÑ Ð¸Ð· C опоÑнÑÑ ÑÑнкÑий (или ÑÑнкÑии) ÑоÑÑиÑовки (необÑзаÑелÑнаÑ) | 2 |
| СÑÐ°Ð²Ð½Ð¸Ð²Ð°ÐµÑ Ð¿ÑовеÑÑемое знаÑение Ñ Ð±Ð°Ð·Ð¾Ð²Ñм плÑÑ/минÑÑ ÑмеÑение и возвÑаÑÐ°ÐµÑ true или false в завиÑимоÑÑи Ð¾Ñ ÑезÑлÑÑаÑа ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ (необÑзаÑелÑнаÑ) | 3 |
| ÐпÑеделÑеÑ, Ð¼Ð¾Ð¶ÐµÑ Ð»Ð¸ в индекÑÐ°Ñ , иÑполÑзÑÑÑÐ¸Ñ Ð´Ð°Ð½Ð½Ñй клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов, безопаÑно пÑименÑÑÑÑÑ Ñеализованное в btree иÑклÑÑение дÑбликаÑов (необÑзаÑелÑнаÑ) | 4 |
| ÐпÑеделÑÐµÑ Ð¿Ð°ÑамеÑÑÑ, оÑноÑÑÑиеÑÑ Ðº Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÐºÐ»Ð°ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов (необÑзаÑелÑнаÑ) | 5 |
| ÐозвÑаÑÐ°ÐµÑ Ð°Ð´ÑеÑа вÑзÑваемÑÑ Ð¸Ð· C опоÑнÑÑ ÑÑнкÑий (или ÑÑнкÑии) пÑопÑÑка знаÑений (необÑзаÑелÑнаÑ) | 6 |
ÐÐ»Ñ Ñ ÐµÑ-индекÑов ÑÑебÑеÑÑÑ Ð¾Ð´Ð½Ð° опоÑÐ½Ð°Ñ ÑÑнкÑиÑ, и еÑÑ Ð´Ð²Ðµ могÑÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ Ð¿Ð¾ вÑбоÑÑ ÑазÑабоÑÑика клаÑÑа опеÑаÑоÑов, как показано в ТаблиÑе 36.10.
ТаблиÑа 36.10. ÐпоÑнÑе ÑÑнкÑии Ñ ÐµÑа
| ФÑнкÑÐ¸Ñ | ÐÐ¾Ð¼ÐµÑ Ð¾Ð¿Ð¾Ñной ÑÑнкÑии |
|---|---|
| ÐÑÑиÑлÑÐµÑ 32-биÑное знаÑение Ñ ÐµÑа Ð´Ð»Ñ ÐºÐ»ÑÑа | 1 |
| ÐÑÑиÑлÑÐµÑ 64-биÑное знаÑение Ñ ÐµÑа Ð´Ð»Ñ ÐºÐ»ÑÑа Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ 64-биÑной ÑолÑÑ; еÑли знаÑение Ñоли Ñавно 0, младÑие 32 биÑа ÑезÑлÑÑаÑа Ð´Ð¾Ð»Ð¶Ð½Ñ ÑооÑвеÑÑÑвоваÑÑ Ð·Ð½Ð°ÑениÑ, коÑоÑое бÑло Ð±Ñ Ð²ÑÑиÑлено ÑÑнкÑией 1 (необÑзаÑелÑнаÑ) | 2 |
| ÐпÑеделÑÐµÑ Ð¿Ð°ÑамеÑÑÑ, оÑноÑÑÑиеÑÑ Ðº Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÐºÐ»Ð°ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов (необÑзаÑелÑнаÑ) | 3 |
ÐÐ»Ñ Ð¸Ð½Ð´ÐµÐºÑов GiST пÑедÑÑмоÑÑÐµÐ½Ñ Ð´Ð²ÐµÐ½Ð°Ð´ÑаÑÑ Ð¾Ð¿Ð¾ÑнÑÑ ÑÑнкÑий, ÑÐµÐ¼Ñ Ð¸Ð· коÑоÑÑÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑнÑе; они опиÑÐ°Ð½Ñ Ð² ТаблиÑе 36.11. (Ðа дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº РазделÑ 63.2.)
ТаблиÑа 36.11. ÐпоÑнÑе ÑÑнкÑии GiST
| ФÑнкÑÐ¸Ñ | ÐпиÑание | ÐÐ¾Ð¼ÐµÑ Ð¾Ð¿Ð¾Ñной ÑÑнкÑии |
|---|---|---|
consistent | опÑеделÑеÑ, ÑдовлеÑвоÑÑÐµÑ Ð»Ð¸ клÑÑ ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð·Ð°Ð¿ÑоÑа | 1 |
union | вÑÑиÑлÑÐµÑ Ð¾Ð±Ñединение набоÑа клÑÑей | 2 |
compress | вÑÑиÑлÑÐµÑ ÑжаÑое пÑедÑÑавление клÑÑа или индекÑиÑÑемого знаÑÐµÐ½Ð¸Ñ (необÑзаÑелÑнаÑ) | 3 |
decompress | вÑÑиÑлÑÐµÑ ÑазвÑÑнÑÑое пÑедÑÑавление ÑжаÑого клÑÑа (необÑзаÑелÑнаÑ) | 4 |
penalty | вÑÑиÑлÑÐµÑ ÑÑоимоÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клÑÑа в поддеÑево Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñм клÑÑом | 5 |
picksplit | опÑеделÑеÑ, какие запиÑи ÑÑÑаниÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¿ÐµÑемеÑÐµÐ½Ñ Ð² новÑÑ ÑÑÑаниÑÑ, и вÑÑиÑлÑÐµÑ ÐºÐ»ÑÑи обÑÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑезÑлÑÑиÑÑÑÑÐ¸Ñ ÑÑÑÐ°Ð½Ð¸Ñ | 6 |
same | ÑÑÐ°Ð²Ð½Ð¸Ð²Ð°ÐµÑ Ð´Ð²Ð° клÑÑа и возвÑаÑÐ°ÐµÑ true, еÑли они ÑÐ°Ð²Ð½Ñ | 7 |
distance | опÑеделÑÐµÑ Ð´Ð¸ÑÑанÑÐ¸Ñ Ð¾Ñ ÐºÐ»ÑÑа до иÑкомого знаÑÐµÐ½Ð¸Ñ (необÑзаÑелÑнаÑ) | 8 |
fetch | вÑÑиÑлÑÐµÑ Ð¸ÑÑ Ð¾Ð´Ð½Ð¾Ðµ пÑедÑÑавление ÑжаÑого клÑÑа Ð´Ð»Ñ ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑолÑко по индекÑÑ (необÑзаÑелÑнаÑ) | 9 |
options | опÑеделÑÐµÑ Ð¿Ð°ÑамеÑÑÑ, оÑноÑÑÑиеÑÑ Ðº Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÐºÐ»Ð°ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов (необÑзаÑелÑнаÑ) | 10 |
sortsupport | пÑедоÑÑавлÑÐµÑ ÐºÐ¾Ð¼Ð¿Ð°ÑаÑÐ¾Ñ Ð´Ð»Ñ ÑоÑÑиÑовки, коÑоÑÑй бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ Ð±ÑÑÑÑого поÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа (необÑзаÑелÑнаÑ) | 11 |
translate_cmptype | пÑеобÑазÑÐµÑ ÑÐ¸Ð¿Ñ ÑÑавнений в номеÑа ÑÑÑаÑегий, иÑполÑзÑемÑÑ ÐºÐ»Ð°ÑÑом опеÑаÑоÑов (необÑзаÑелÑнаÑ) | 12 |
ÐÐ»Ñ Ð¸Ð½Ð´ÐµÐºÑов SP-GiST пÑедÑÑмоÑÑÐµÐ½Ñ ÑеÑÑÑ Ð¾Ð¿Ð¾ÑнÑÑ ÑÑнкÑий, одна из коÑоÑÑÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑнаÑ; они опиÑÐ°Ð½Ñ Ð² ТаблиÑе 36.12. (Ðа дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº РазделÑ 63.3.)
ТаблиÑа 36.12. ÐпоÑнÑе ÑÑнкÑии SP-GiST
| ФÑнкÑÐ¸Ñ | ÐпиÑание | ÐÐ¾Ð¼ÐµÑ Ð¾Ð¿Ð¾Ñной ÑÑнкÑии |
|---|---|---|
config | пÑедоÑÑавлÑÐµÑ Ð¾ÑновнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ клаÑÑе опеÑаÑоÑов | 1 |
choose | опÑеделÑеÑ, как вÑÑавиÑÑ Ð½Ð¾Ð²Ð¾Ðµ знаÑение во внÑÑÑенний ÑÐ»ÐµÐ¼ÐµÐ½Ñ | 2 |
picksplit | опÑеделÑеÑ, как ÑазделиÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво знаÑений | 3 |
inner_consistent | опÑеделÑеÑ, в ÐºÐ°ÐºÐ¸Ñ Ð²Ð½ÑÑÑÐµÐ½Ð½Ð¸Ñ Ð²ÐµÑвÑÑ Ð½Ñжно иÑкаÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ðµ знаÑение | 4 |
leaf_consistent | опÑеделÑеÑ, ÑдовлеÑвоÑÑÐµÑ Ð»Ð¸ клÑÑ ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð·Ð°Ð¿ÑоÑа | 5 |
options | опÑеделÑÐµÑ Ð¿Ð°ÑамеÑÑÑ, оÑноÑÑÑиеÑÑ Ðº Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÐºÐ»Ð°ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов (необÑзаÑелÑнаÑ) | 6 |
ÐÐ»Ñ Ð¸Ð½Ð´ÐµÐºÑов GIN пÑедÑÑмоÑÑÐµÐ½Ñ ÑÐµÐ¼Ñ Ð¾Ð¿Ð¾ÑнÑÑ ÑÑнкÑий, ÑеÑÑÑе из коÑоÑÑÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑнÑе; они опиÑÐ°Ð½Ñ Ð² ТаблиÑе 36.13. (Ðа дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº РазделÑ 63.4.)
ТаблиÑа 36.13. ÐпоÑнÑе ÑÑнкÑии GIN
| ФÑнкÑÐ¸Ñ | ÐпиÑание | ÐÐ¾Ð¼ÐµÑ Ð¾Ð¿Ð¾Ñной ÑÑнкÑии |
|---|---|---|
compare | ÑÑÐ°Ð²Ð½Ð¸Ð²Ð°ÐµÑ Ð´Ð²Ð° клÑÑа и возвÑаÑÐ°ÐµÑ Ñелое менÑÑе нÑлÑ, Ð½Ð¾Ð»Ñ Ð¸Ð»Ð¸ Ñелое болÑÑе нÑлÑ, показÑваÑÑее, ÑÑо пеÑвÑй клÑÑ Ð¼ÐµÐ½ÑÑе, Ñавен или болÑÑе вÑоÑого | 1 |
extractValue | Ð¸Ð·Ð²Ð»ÐµÐºÐ°ÐµÑ ÐºÐ»ÑÑи из индекÑиÑÑемого знаÑÐµÐ½Ð¸Ñ | 2 |
extractQuery | Ð¸Ð·Ð²Ð»ÐµÐºÐ°ÐµÑ ÐºÐ»ÑÑи из ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð·Ð°Ð¿ÑоÑа | 3 |
consistent | опÑеделÑеÑ, ÑооÑвеÑÑÑвÑÐµÑ Ð»Ð¸ знаÑение ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð·Ð°Ð¿ÑоÑа (логиÑеÑÐºÐ°Ñ Ð²Ð°ÑиаÑиÑ) (не ÑÑебÑеÑÑÑ, еÑли пÑиÑÑÑÑÑвÑÐµÑ Ð¾Ð¿Ð¾ÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ 6) | 4 |
comparePartial | ÑÑÐ°Ð²Ð½Ð¸Ð²Ð°ÐµÑ ÑаÑÑиÑнÑй клÑÑ Ð¸Ð· запÑоÑа Ñ ÐºÐ»ÑÑом из индекÑа и возвÑаÑÐ°ÐµÑ Ñелое ÑиÑло менÑÑе нÑлÑ, Ð½Ð¾Ð»Ñ Ð¸Ð»Ð¸ болÑÑе нÑлÑ, показÑваÑÑее, ÑÑо GIN должен игноÑиÑоваÑÑ ÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð¸Ð½Ð´ÐµÐºÑа, пÑинÑÑÑ ÐµÑ ÐºÐ°Ðº ÑооÑвеÑÑÑвÑÑÑÑÑ Ð¸Ð»Ð¸ пÑекÑаÑиÑÑ ÑканиÑование индекÑа (необÑзаÑелÑнаÑ) | 5 |
triConsistent | опÑеделÑеÑ, ÑооÑвеÑÑÑвÑÐµÑ Ð»Ð¸ знаÑение ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð·Ð°Ð¿ÑоÑа (ÑÑоиÑÐ½Ð°Ñ Ð²Ð°ÑиаÑиÑ) (не ÑÑебÑеÑÑÑ, еÑли пÑиÑÑÑÑÑвÑÐµÑ Ð¾Ð¿Ð¾ÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ 4) | 6 |
options | опÑеделÑÐµÑ Ð¿Ð°ÑамеÑÑÑ, оÑноÑÑÑиеÑÑ Ðº Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÐºÐ»Ð°ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов (необÑзаÑелÑнаÑ) | 7 |
ÐÐ»Ñ Ð¸Ð½Ð´ÐµÐºÑов BRIN пÑедÑÑмоÑÑÐµÐ½Ñ Ð¿ÑÑÑ Ð±Ð°Ð·Ð¾Ð²ÑÑ Ð¾Ð¿Ð¾ÑнÑÑ ÑÑнкÑий, пеÑеÑиÑленнÑÑ Ð² ТаблиÑе 36.14. ÐÐ»Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ Ð²Ð¸Ð´Ð¾Ð² базовÑÑ ÑÑнкÑий Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð¿ÑедоÑÑавиÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе опоÑнÑе ÑÑнкÑии. (Ðа дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 63.5.3.)
ТаблиÑа 36.14. ÐпоÑнÑе ÑÑнкÑии BRIN
| ФÑнкÑÐ¸Ñ | ÐпиÑание | ÐÐ¾Ð¼ÐµÑ Ð¾Ð¿Ð¾Ñной ÑÑнкÑии |
|---|---|---|
opcInfo | возвÑаÑÐ°ÐµÑ Ð²Ð½ÑÑÑеннÑÑ Ð¸Ð½ÑоÑмаÑиÑ, опиÑÑваÑÑÑÑ ÑводнÑе даннÑе по индекÑиÑованнÑм ÑÑолбÑам | 1 |
add_value | добавлÑÐµÑ Ð½Ð¾Ð²Ð¾Ðµ знаÑение в ÑÑÑеÑÑвÑÑÑий ÑводнÑй коÑÑеж индекÑа | 2 |
consistent | опÑеделÑеÑ, ÑдовлеÑвоÑÑÐµÑ Ð»Ð¸ знаÑение ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð·Ð°Ð¿ÑоÑа | 3 |
union | вÑÑиÑлÑÐµÑ Ð¾Ð±Ñединение двÑÑ Ð¾Ð±Ð¾Ð±ÑаÑÑÐ¸Ñ ÐºÐ¾ÑÑежей | 4 |
options | опÑеделÑÐµÑ Ð¿Ð°ÑамеÑÑÑ, оÑноÑÑÑиеÑÑ Ðº Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÐºÐ»Ð°ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов (необÑзаÑелÑнаÑ) | 5 |
РоÑлиÑие Ð¾Ñ Ð¾Ð¿ÐµÑаÑоÑов поиÑка, опоÑнÑе ÑÑнкÑии возвÑаÑаÑÑ ÑÐ¾Ñ Ñип даннÑÑ , коÑоÑÑй Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ ÐºÐ¾Ð½ÐºÑеÑнÑй меÑод индекÑа; напÑимеÑ, ÑÑнкÑÐ¸Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ B-деÑевÑев возвÑаÑÐ°ÐµÑ Ð·Ð½Ð°ÐºÐ¾Ð²Ð¾Ðµ Ñелое. ÐолиÑеÑÑво и ÑÐ¸Ð¿Ñ Ð°ÑгÑменÑов Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ опоÑной ÑÑнкÑии Ñак же завиÑÑÑ Ð¾Ñ Ð¼ÐµÑода индекÑа. ÐÐ»Ñ Ð¼ÐµÑодов B-деÑева и Ñ ÐµÑа ÑÑнкÑии ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¸ Ñ ÐµÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÑинимаÑÑ Ñе же ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ , ÑÑо и опеÑаÑоÑÑ, вклÑÑÑннÑе в клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов, но Ð´Ð»Ñ Ð±Ð¾Ð»ÑÑинÑÑва опоÑнÑÑ ÑÑнкÑий GiST, SP-GiST, GIN и BRIN ÑÑо не Ñак.
36.16.4. ÐÑÐ¸Ð¼ÐµÑ #
ТепеÑÑ, когда Ð¼Ñ Ð¿Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð¸Ð»Ð¸ÑÑ Ñ Ð¾ÑновнÑми идеÑми, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ пеÑейÑи к обеÑÐ°Ð½Ð½Ð¾Ð¼Ñ Ð¿ÑимеÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑÑа опеÑаÑоÑов. ÐлаÑÑ Ð¾Ð¿ÐµÑаÑоÑов вклÑÑÐ°ÐµÑ Ð¾Ð¿ÐµÑаÑоÑÑ, ÑоÑÑиÑÑÑÑие комплекÑнÑе ÑиÑла по поÑÑÐ´ÐºÑ Ð°Ð±ÑолÑÑнÑÑ
знаÑений, поÑÑÐ¾Ð¼Ñ Ð¼Ñ Ð²ÑбÑали Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ Ð¸Ð¼Ñ complex_abs_ops. Ðо-пеÑвÑÑ
, нам понадобиÑÑÑ Ð½Ð°Ð±Ð¾Ñ Ð¾Ð¿ÐµÑаÑоÑов. ÐÑоÑедÑÑа опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑов бÑла ÑаÑÑмоÑÑена в Разделе 36.14. ÐÐ»Ñ ÐºÐ»Ð°ÑÑа опеÑаÑоÑов B-деÑевÑев нам понадобÑÑÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ:
- абÑолÑÑное-знаÑение менÑÑе (ÑÑÑаÑÐµÐ³Ð¸Ñ 1)
- абÑолÑÑное-знаÑение менÑÑе-или-Ñавно (ÑÑÑаÑÐµÐ³Ð¸Ñ 2)
- абÑолÑÑное-знаÑение Ñавно (ÑÑÑаÑÐµÐ³Ð¸Ñ 3)
- абÑолÑÑное-знаÑение болÑÑе-или-Ñавно (ÑÑÑаÑÐµÐ³Ð¸Ñ 4)
- абÑолÑÑное-знаÑение болÑÑе (ÑÑÑаÑÐµÐ³Ð¸Ñ 5)
ЧÑÐ¾Ð±Ñ Ð½Ðµ пÑовоÑиÑоваÑÑ Ð¾Ñибки пÑи опÑеделении ÑвÑзанного набоÑа опеÑаÑоÑов ÑÑавнениÑ, лÑÑÑе вÑего ÑнаÑала напиÑаÑÑ Ð²ÑпомогаÑелÑнÑÑ ÑÑнкÑÐ¸Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ B-деÑева, а заÑем напиÑаÑÑ Ð´ÑÑгие ÑÑнкÑии как одноÑÑÑоÑнÑе оболоÑки ÑÑой вÑпомогаÑелÑной ÑÑнкÑии. ÐÑо ÑменÑÑÐ¸Ñ Ð²ÐµÑоÑÑноÑÑÑ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð½ÐµÑоглаÑованнÑÑ ÑезÑлÑÑаÑов в иÑклÑÑиÑелÑнÑÑ ÑлÑÑаÑÑ . СледÑÑ ÑÑÐ¾Ð¼Ñ Ð¿Ð¾Ð´Ñ Ð¾Ð´Ñ, Ð¼Ñ ÑнаÑала напиÑем:
#define Mag(c) ((c)->x*(c)->x + (c)->y*(c)->y)
static int
complex_abs_cmp_internal(Complex *a, Complex *b)
{
double amag = Mag(a),
bmag = Mag(b);
if (amag < bmag)
return -1;
if (amag > bmag)
return 1;
return 0;
}
ТепеÑÑ ÑÑнкÑÐ¸Ñ Â«Ð¼ÐµÐ½ÑÑе» бÑÐ´ÐµÑ Ð²ÑглÑдеÑÑ Ñак:
PG_FUNCTION_INFO_V1(complex_abs_lt);
Datum
complex_abs_lt(PG_FUNCTION_ARGS)
{
Complex *a = (Complex *) PG_GETARG_POINTER(0);
Complex *b = (Complex *) PG_GETARG_POINTER(1);
PG_RETURN_BOOL(complex_abs_cmp_internal(a, b) < 0);
}
ÐÑÑалÑнÑе ÑеÑÑÑе ÑÑнкÑии оÑлиÑаÑÑÑÑ Ð¾Ñ Ð½ÐµÑ ÑолÑко Ñем, как ÑÑавниваÑÑ ÑезÑлÑÑÐ°Ñ Ð²Ð½ÑÑÑенней ÑÑнкÑии Ñ Ð½ÑлÑм.
ÐаÑем Ð¼Ñ Ð¾Ð±ÑÑвим в SQL ÑÑнкÑии и опеÑаÑоÑÑ Ð½Ð° оÑнове ÑÑÐ¸Ñ ÑÑнкÑий:
CREATE FUNCTION complex_abs_lt(complex, complex) RETURNS bool
AS 'имÑ_Ñайла', 'complex_abs_lt'
LANGUAGE C IMMUTABLE STRICT;
CREATE OPERATOR < (
leftarg = complex, rightarg = complex, procedure = complex_abs_lt,
commutator = > , negator = >= ,
restrict = scalarltsel, join = scalarltjoinsel
);Ðажно пÑавилÑно опÑеделиÑÑ Ð¾Ð±ÑаÑнÑе и коммÑÑиÑÑÑÑие опеÑаÑоÑÑ, а Ñакже Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑие ÑÑнкÑии избиÑаÑелÑноÑÑи огÑаниÑÐµÐ½Ð¸Ñ Ð¸ ÑоединениÑ; инаÑе опÑимизаÑÐ¾Ñ Ð½Ðµ ÑÐ¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑ Ð½Ð°Ñ Ð¸Ð½Ð´ÐµÐºÑ ÑÑÑекÑивно.
ÐдеÑÑ Ñакже ÑÑÐ¾Ð¸Ñ Ð¾Ð±ÑаÑиÑÑ Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ðµ на ÑледÑÑÑее:
УÑÑиÑе, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑолÑко один опеÑаÑÐ¾Ñ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼, напÑимеÑ,
=, коÑоÑÑй бÑÐ´ÐµÑ Ð¿ÑинимаÑÑ ÑипcomplexÑ Ð´Ð²ÑÑ ÑÑоÑон. Ð ÑÑом ÑлÑÑае Ñ Ð½Ð°Ñ Ð½Ðµ бÑÐ´ÐµÑ Ð´ÑÑгого опеÑаÑоÑа=длÑcomplex, но еÑли Ð¼Ñ ÑоздаÑм пÑакÑиÑеÑки полезнÑй Ñип даннÑÑ , веÑоÑÑно, Ð¼Ñ Ð·Ð°Ñ Ð¾Ñим, ÑÑÐ¾Ð±Ñ Ð¾Ð¿ÐµÑаÑоÑ=пÑовеÑÑл обÑÑное ÑавенÑÑво двÑÑ ÐºÐ¾Ð¼Ð¿Ð»ÐµÐºÑнÑÑ ÑиÑел (а не ÑавенÑÑво Ð¸Ñ Ð°Ð±ÑолÑÑнÑÑ Ð·Ð½Ð°Ñений). Ð ÑÑом ÑлÑÑае длÑcomplex_abs_eqнÑжно вÑбÑаÑÑ ÐºÐ°ÐºÐ¾Ðµ-Ñо дÑÑгое Ð¸Ð¼Ñ Ð¾Ð¿ÐµÑаÑоÑа.ХоÑÑ Ð² Postgres Pro ÑазнÑе ÑÑнкÑии могÑÑ Ð¸Ð¼ÐµÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñе имена SQL, еÑли Ñ Ð½Ð¸Ñ ÑазлиÑнÑе ÑÐ¸Ð¿Ñ Ð°ÑгÑменÑов, в C ÑолÑко одна глобалÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ðµ имÑ. ÐоÑÑÐ¾Ð¼Ñ Ð½Ðµ ÑледÑÐµÑ Ð´Ð°Ð²Ð°ÑÑ ÑÑнкÑии на C Ð¸Ð¼Ñ Ð²Ñоде
abs_eq. Ðо избежание конÑликÑов Ñ ÑÑнкÑиÑми Ð´Ð»Ñ Ð´ÑÑÐ³Ð¸Ñ Ñипов даннÑÑ , в Ð¸Ð¼Ñ ÑÑнкÑии на C обÑÑно вклÑÑаеÑÑÑ Ð¸Ð¼Ñ ÐºÐ¾Ð½ÐºÑеÑного Ñипа даннÑÑ .ÐÑ Ð¼Ð¾Ð³Ð»Ð¸ бÑÑÑ Ð´Ð°ÑÑ Ð½Ð°Ñей ÑÑнкÑии имÑ
abs_eqв SQL, ÑаÑÑÑиÑÑÐ²Ð°Ñ Ð½Ð° Ñо, ÑÑо Postgres Pro оÑлиÑÐ¸Ñ ÐµÑ Ð¾Ñ Ð»ÑбÑÑ Ð´ÑÑÐ³Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð¸Ð¼ÑннÑÑ ÑÑнкÑий SQL по Ñипам аÑгÑменÑов. Ðо в данном ÑлÑÑае Ð´Ð»Ñ ÑпÑоÑÐµÐ½Ð¸Ñ Ð¿ÑимеÑа Ð¼Ñ Ð´Ð°Ð»Ð¸ ей одинаковÑе имена на ÑÑовне C и ÑÑовне SQL.
Ðа ÑледÑÑÑем ÑÑапе ÑегиÑÑÑиÑÑеÑÑÑ Ð¾Ð¿Ð¾ÑÐ½Ð°Ñ Ð¿ÑоÑедÑÑа, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð´Ð»Ñ B-деÑевÑев. РнаÑем пÑимеÑе код C, ÑеализÑÑÑий еÑ, Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð² Ñом же Ñайле, ÑÑо и ÑÑнкÑии опеÑаÑоÑов. ÐÑ Ð¾Ð±ÑÑвлÑем ÑÑÑ Ð¿ÑоÑедÑÑÑ Ñак:
CREATE FUNCTION complex_abs_cmp(complex, complex)
RETURNS integer
AS 'имÑ_Ñайла'
LANGUAGE C IMMUTABLE STRICT;ТепеÑÑ, когда Ð¼Ñ Ð¾Ð±ÑÑвили ÑÑебÑемÑе опеÑаÑоÑÑ Ð¸ опоÑнÑÑ ÑÑнкÑиÑ, Ð¼Ñ Ð½Ð°ÐºÐ¾Ð½ÐµÑ Ð¼Ð¾Ð¶ÐµÐ¼ ÑоздаÑÑ ÐºÐ»Ð°ÑÑ Ð¾Ð¿ÐµÑаÑоÑов:
CREATE OPERATOR CLASS complex_abs_ops
DEFAULT FOR TYPE complex USING btree AS
OPERATOR 1 < ,
OPERATOR 2 <= ,
OPERATOR 3 = ,
OPERATOR 4 >= ,
OPERATOR 5 > ,
FUNCTION 1 complex_abs_cmp(complex, complex);
ÐÐ¾Ñ Ð¸ вÑÑ! ТепеÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð¾ бÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ ÑоздаваÑÑ Ð¸ иÑполÑзоваÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ-B-деÑевÑÑ Ð¿Ð¾ ÑÑолбÑам complex.
ÐпеÑаÑоÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ бÑло запиÑаÑÑ Ð±Ð¾Ð»ÐµÐµ многоÑловно, напÑимеÑ, Ñак:
OPERATOR 1 < (complex, complex) ,
но в ÑÑом Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи, Ñак как ÑÑи опеÑаÑоÑÑ Ð¿ÑинимаÑÑ ÑÐ¾Ñ Ð¶Ðµ Ñип даннÑÑ , Ð´Ð»Ñ ÐºÐ¾ÑоÑого опÑеделÑеÑÑÑ ÐºÐ»Ð°ÑÑ Ð¾Ð¿ÐµÑаÑоÑов.
РпÑиведÑнном пÑимеÑе пÑедполагаеÑÑÑ, ÑÑо ÑÑÐ¾Ñ ÐºÐ»Ð°ÑÑ Ð¾Ð¿ÐµÑаÑоÑов бÑÐ´ÐµÑ ÐºÐ»Ð°ÑÑом опеÑаÑоÑов B-деÑева по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ñипа complex. ÐÑли вам ÑÑо не нÑжно, пÑоÑÑо опÑÑÑиÑе Ñлово DEFAULT.
36.16.5. СемейÑÑва и клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов #
Ðо ÑÑого Ð¼Ñ Ð½ÐµÑвно полагали, ÑÑо клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов ÑабоÑÐ°ÐµÑ ÑолÑко Ñ Ð¾Ð´Ð½Ð¸Ð¼ Ñипом даннÑÑ . ХоÑÑ Ð² конкÑеÑном индекÑиÑÑемом ÑÑолбÑе, опÑеделÑнно, Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑолÑко один Ñип даннÑÑ , ÑаÑÑо бÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ индекÑиÑоваÑÑ Ð¾Ð¿ÐµÑаÑии, ÑÑавниваÑÑие знаÑение ÑÑолбÑа Ñо знаÑением дÑÑгого Ñипа. Также, еÑли в ÑоÑеÑании Ñ ÐºÐ»Ð°ÑÑом опеÑаÑоÑов возможно пÑименение опеÑаÑоÑа, ÑабоÑаÑÑего Ñ Ð´Ð²ÑÐ¼Ñ Ñипами, Ð´Ð»Ñ Ð´ÑÑгого Ñипа даннÑÑ Ð¾Ð±ÑÑно Ñоже ÑоздаÑÑÑÑ ÑобÑÑвеннÑй клаÑÑ. Ð ÑÐ°ÐºÐ¸Ñ ÑлÑÑаÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ ÑÑÑановиÑÑ ÑвнÑÑ ÑвÑÐ·Ñ Ð¼ÐµÐ¶Ð´Ñ ÑвÑзаннÑми клаÑÑами, Ñак как ÑÑо Ð¿Ð¾Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð»Ð°Ð½Ð¸ÑовÑÐ¸ÐºÑ Ð¾Ð¿ÑимизиÑоваÑÑ SQL-запÑоÑÑ (оÑобенно Ð´Ð»Ñ ÐºÐ»Ð°ÑÑов опеÑаÑоÑов B-деÑева, поÑÐ¾Ð¼Ñ ÑÑо планиÑовÑик Ñ Ð¾ÑоÑо знаеÑ, как ÑабоÑаÑÑ Ñ Ð½Ð¸Ð¼Ð¸).
ÐÐ»Ñ ÑдовлеÑвоÑÐµÐ½Ð¸Ñ ÑÑÐ¸Ñ Ð¿Ð¾ÑÑебноÑÑей в Postgres Pro введена конÑепÑÐ¸Ñ ÑемейÑÑва опеÑаÑоÑов. СемейÑÑво опеÑаÑоÑов ÑодеÑÐ¶Ð¸Ñ Ð¾Ð´Ð¸Ð½ или неÑколÑко клаÑÑов опеÑаÑоÑов и Ð¼Ð¾Ð¶ÐµÑ Ñакже ÑодеÑжаÑÑ Ð¸Ð½Ð´ÐµÐºÑиÑÑемÑе опеÑаÑоÑÑ Ð¸ ÑооÑвеÑÑÑвÑÑÑие опоÑнÑе ÑÑнкÑии, пÑинадлежаÑие к ÑемейÑÑÐ²Ñ Ð² Ñелом, но не к какомÑ-Ñо Ð¾Ð´Ð½Ð¾Ð¼Ñ ÐºÐ»Ð°ÑÑÑ Ð² нÑм. ÐÑ Ð½Ð°Ð·Ñваем ÑакÑÑ ÑвÑÐ·Ñ Ð¾Ð¿ÐµÑаÑоÑов и ÑÑнкÑий Ñ ÑемейÑÑвом «Ñлабой», в оÑлиÑие Ð¾Ñ Ð¾Ð±ÑÑной ÑвÑзи Ñ Ð¾Ð¿ÑеделÑннÑм клаÑÑом. Ðак пÑавило, клаÑÑÑ ÑодеÑÐ¶Ð°Ñ Ð¾Ð¿ÐµÑаÑоÑÑ Ñ Ð¾Ð¿ÐµÑандами одного Ñипа, Ñогда как межÑиповÑе опеÑаÑоÑÑ Ñлабо ÑвÑзÑваÑÑÑÑ Ñ ÑемейÑÑвом.
ÐÑе опеÑаÑоÑÑ Ð¸ ÑÑнкÑии в ÑемейÑÑве опеÑаÑоÑов Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð¼ÐµÑÑ ÑовмеÑÑимÑÑ ÑеманÑикÑ; ÑÑÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ðº ÑовмеÑÑимоÑÑи ÑÑÑанавливаÑÑÑÑ Ð¼ÐµÑодом индекÑа. ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑпÑоÑиÑÑ, заÑем в Ñаком ÑлÑÑае вообÑе вÑделÑÑÑ ÐºÐ¾Ð½ÐºÑеÑнÑе подмножеÑÑва ÑемейÑÑва в виде клаÑÑов опеÑаÑоÑов; и на Ñамом деле во Ð¼Ð½Ð¾Ð³Ð¸Ñ ÑлÑÑаÑÑ Ð´ÐµÐ»ÐµÐ½Ð¸Ðµ на клаÑÑÑ Ð½Ðµ Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°ÑениÑ, важно ÑолÑко ÑвÑзÑвание Ñ ÑемейÑÑвом. СмÑÑл клаÑÑов опеÑаÑоÑов в Ñом, ÑÑо они опÑеделÑÑÑ, ÐºÐ°ÐºÐ°Ñ ÑаÑÑÑ ÑемейÑÑва Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð° Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки некоÑоÑого индекÑа. ÐÑли ÑÑÑеÑÑвÑÐµÑ Ð¸Ð½Ð´ÐµÐºÑ, иÑполÑзÑÑÑий клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов, ÑÑÐ¾Ñ ÐºÐ»Ð°ÑÑ Ð½ÐµÐ»ÑÐ·Ñ Ð±ÑÐ´ÐµÑ ÑдалиÑÑ, не Ñдалив Ð¸Ð½Ð´ÐµÐºÑ â но дÑÑгие ÑаÑÑи ÑемейÑÑва, а именно, дÑÑгие клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов и ÑлабоÑвÑзаннÑе опеÑаÑоÑÑ, ÑдалиÑÑ Ð¼Ð¾Ð¶Ð½Ð¾. Таким обÑазом, клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов должен опÑеделÑÑÑÑÑ Ñак, ÑÑÐ¾Ð±Ñ Ð¾Ð½ ÑодеÑжал минималÑнÑй Ð½Ð°Ð±Ð¾Ñ Ð¾Ð¿ÐµÑаÑоÑов и ÑÑнкÑий, обоÑнованно ÑÑебÑÑÑÐ¸Ñ ÑÑ Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¸Ð½Ð´ÐµÐºÑом по опÑеделÑÐ½Ð½Ð¾Ð¼Ñ ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ , а неÑÑÑеÑÑвеннÑе опеÑаÑоÑÑ Ð¼Ð¾Ð³ÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑÑÑ Ð² каÑеÑÑве ÑлабоÑвÑзаннÑÑ Ñленов в ÑемейÑÑво опеÑаÑоÑов.
РкаÑеÑÑве пÑимеÑа, в Postgres Pro еÑÑÑ Ð²ÑÑÑоенное ÑемейÑÑво опеÑаÑоÑов B-деÑева integer_ops, вклÑÑаÑÑее клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов int8_ops, int4_ops и int2_ops Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑов по ÑÑолбÑам bigint (int8), integer (int4) и smallint (int2), ÑооÑвеÑÑÑвенно. Ð ÑÑом ÑемейÑÑве Ñакже ÑодеÑжаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ Ð¼ÐµÐ¶Ñипового ÑÑавнениÑ, позволÑÑÑие ÑÑавниваÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð»ÑбÑÑ
двÑÑ
ÑÑиÑ
Ñипов, Ñак ÑÑо индекÑом по лÑÐ±Ð¾Ð¼Ñ Ð¸Ð· ÑÑиÑ
Ñипов можно полÑзоваÑÑÑÑ, вÑполнÑÑ ÑÑавнение Ñ Ð´ÑÑгим Ñипом. ÐÑо ÑемейÑÑво можно пÑедÑÑавиÑÑ Ñакими опÑеделениÑми:
CREATE OPERATOR FAMILY integer_ops USING btree; CREATE OPERATOR CLASS int8_ops DEFAULT FOR TYPE int8 USING btree FAMILY integer_ops AS -- standard int8 comparisons OPERATOR 1 < , OPERATOR 2 <= , OPERATOR 3 = , OPERATOR 4 >= , OPERATOR 5 > , FUNCTION 1 btint8cmp(int8, int8) , FUNCTION 2 btint8sortsupport(internal) , FUNCTION 3 in_range(int8, int8, int8, boolean, boolean) , FUNCTION 4 btequalimage(oid) , FUNCTION 6 btint8skipsupport(internal) ; CREATE OPERATOR CLASS int4_ops DEFAULT FOR TYPE int4 USING btree FAMILY integer_ops AS -- standard int4 comparisons OPERATOR 1 < , OPERATOR 2 <= , OPERATOR 3 = , OPERATOR 4 >= , OPERATOR 5 > , FUNCTION 1 btint4cmp(int4, int4) , FUNCTION 2 btint4sortsupport(internal) , FUNCTION 3 in_range(int4, int4, int4, boolean, boolean) , FUNCTION 4 btequalimage(oid) , FUNCTION 6 btint4skipsupport(internal) ; CREATE OPERATOR CLASS int2_ops DEFAULT FOR TYPE int2 USING btree FAMILY integer_ops AS -- standard int2 comparisons OPERATOR 1 < , OPERATOR 2 <= , OPERATOR 3 = , OPERATOR 4 >= , OPERATOR 5 > , FUNCTION 1 btint2cmp(int2, int2) , FUNCTION 2 btint2sortsupport(internal) , FUNCTION 3 in_range(int2, int2, int2, boolean, boolean) , FUNCTION 4 btequalimage(oid) , FUNCTION 6 btint2skipsupport(internal) ; ALTER OPERATOR FAMILY integer_ops USING btree ADD -- cross-type comparisons int8 vs int2 OPERATOR 1 < (int8, int2) , OPERATOR 2 <= (int8, int2) , OPERATOR 3 = (int8, int2) , OPERATOR 4 >= (int8, int2) , OPERATOR 5 > (int8, int2) , FUNCTION 1 btint82cmp(int8, int2) , -- cross-type comparisons int8 vs int4 OPERATOR 1 < (int8, int4) , OPERATOR 2 <= (int8, int4) , OPERATOR 3 = (int8, int4) , OPERATOR 4 >= (int8, int4) , OPERATOR 5 > (int8, int4) , FUNCTION 1 btint84cmp(int8, int4) , -- cross-type comparisons int4 vs int2 OPERATOR 1 < (int4, int2) , OPERATOR 2 <= (int4, int2) , OPERATOR 3 = (int4, int2) , OPERATOR 4 >= (int4, int2) , OPERATOR 5 > (int4, int2) , FUNCTION 1 btint42cmp(int4, int2) , -- cross-type comparisons int4 vs int8 OPERATOR 1 < (int4, int8) , OPERATOR 2 <= (int4, int8) , OPERATOR 3 = (int4, int8) , OPERATOR 4 >= (int4, int8) , OPERATOR 5 > (int4, int8) , FUNCTION 1 btint48cmp(int4, int8) , -- cross-type comparisons int2 vs int8 OPERATOR 1 < (int2, int8) , OPERATOR 2 <= (int2, int8) , OPERATOR 3 = (int2, int8) , OPERATOR 4 >= (int2, int8) , OPERATOR 5 > (int2, int8) , FUNCTION 1 btint28cmp(int2, int8) , -- cross-type comparisons int2 vs int4 OPERATOR 1 < (int2, int4) , OPERATOR 2 <= (int2, int4) , OPERATOR 3 = (int2, int4) , OPERATOR 4 >= (int2, int4) , OPERATOR 5 > (int2, int4) , FUNCTION 1 btint24cmp(int2, int4) , -- cross-type in_range functions FUNCTION 3 in_range(int4, int4, int8, boolean, boolean) , FUNCTION 3 in_range(int4, int4, int2, boolean, boolean) , FUNCTION 3 in_range(int2, int2, int8, boolean, boolean) , FUNCTION 3 in_range(int2, int2, int4, boolean, boolean) ;
ÐамеÑÑÑе, ÑÑо в опÑеделении ÑемейÑÑва «пеÑегÑÑжаÑÑÑÑ» номеÑа ÑÑÑаÑегий опеÑаÑоÑов и опоÑнÑÑ ÑÑнкÑий: каждÑй Ð½Ð¾Ð¼ÐµÑ ÑигÑÑиÑÑÐµÑ Ð² ÑемейÑÑве неоднокÑаÑно. ÐÑо допÑÑкаеÑÑÑ, еÑли Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑкземплÑÑа опÑеделÑнного номеÑа задаÑÑÑÑ Ñвои ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐкземплÑÑÑ, Ñ ÐºÐ¾ÑоÑÑÑ Ð¾Ð±Ð° Ð²Ñ Ð¾Ð´Ð½ÑÑ Ñипа ÑовпадаÑÑ Ñ Ð²Ñ Ð¾Ð´Ð½Ñм Ñипом клаÑÑа опеÑаÑоÑов, ÑвлÑÑÑÑÑ Ð¿ÐµÑвиÑнÑми опеÑаÑоÑами и опоÑнÑми ÑÑнкÑиÑми Ð´Ð»Ñ ÑÑого клаÑÑа, и в болÑÑинÑÑве ÑлÑÑаев они Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾Ð±ÑÑвлÑÑÑÑÑ Ð² ÑоÑÑаве клаÑÑа опеÑаÑоÑов, а не бÑÑÑ ÑлабоÑвÑзаннÑми Ñленами ÑемейÑÑва.
Ð ÑемейÑÑве опеÑаÑоÑов B-деÑева вÑе опеÑаÑоÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑовмеÑÑимÑми в конÑекÑÑе ÑоÑÑиÑовки; ÑÑо подÑобно опиÑано в ÐодÑазделе 63.1.2. ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ опеÑаÑоÑа в ÑемейÑÑве должна ÑÑÑеÑÑвоваÑÑ Ð¾Ð¿Ð¾ÑÐ½Ð°Ñ ÑÑнкÑиÑ, пÑинимаÑÑÐ°Ñ Ð½Ð° Ð²Ñ Ð¾Ð´ Ñе же два Ñипа, ÑÑо и опеÑаÑоÑ. СемейÑÑво ÑекомендÑеÑÑÑ Ð´ÐµÐ»Ð°ÑÑ Ð¿Ð¾Ð»Ð½Ñм, Ñо еÑÑÑ Ð²ÐºÐ»ÑÑаÑÑ Ð² него вÑе опеÑаÑоÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑоÑеÑÐ°Ð½Ð¸Ñ Ñипов даннÑÑ . РклаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов ÑледÑÐµÑ Ð²ÐºÐ»ÑÑаÑÑ ÑолÑко одноÑиповÑе опеÑаÑоÑÑ Ð¸ опоÑнÑе ÑÑнкÑии Ð´Ð»Ñ Ð¾Ð¿ÑеделÑнного Ñипа даннÑÑ .
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ ÑемейÑÑво опеÑаÑоÑов Ñ ÐµÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ Ñипов даннÑÑ , Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑоздаÑÑ ÑовмеÑÑимÑе ÑÑнкÑии поддеÑжки Ñ ÐµÑа Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñипа даннÑÑ , коÑоÑÑй бÑÐ´ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ ÑемейÑÑво. ÐдеÑÑ Ð¿Ð¾Ð´ ÑовмеÑÑимоÑÑÑÑ Ð¿Ð¾Ð½Ð¸Ð¼Ð°ÐµÑÑÑ Ð³Ð°ÑанÑÐ¸Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñ ÐµÑ-кода Ð´Ð»Ñ Ð»ÑбÑÑ Ð´Ð²ÑÑ Ð·Ð½Ð°Ñений, коÑоÑÑе опеÑаÑоÑÑ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð² ÑÑом ÑемейÑÑве ÑÑиÑаÑÑ ÑавнÑми, даже еÑли они имеÑÑ ÑазнÑе ÑипÑ. ÐбÑÑно ÑÑо Ñложно оÑÑÑеÑÑвиÑÑ, когда ÑÐ¸Ð¿Ñ Ð¸Ð¼ÐµÑÑ Ñазное ÑизиÑеÑкое пÑедÑÑавление, но в некоÑоÑÑÑ ÑлÑÑаÑÑ Ð²ÑÑ Ð¶Ðµ возможно. Ðолее Ñого, пÑеобÑазование знаÑÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñипа даннÑÑ , пÑедÑÑавленного в ÑемейÑÑве опеÑаÑоÑов, к дÑÑÐ³Ð¾Ð¼Ñ ÑипÑ, Ñакже пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ð¾Ð¼Ñ Ð² ÑÑом ÑемейÑÑве, пÑÑÑм неÑвного или двоиÑного ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð½Ðµ должно менÑÑÑ Ð·Ð½Ð°Ñение вÑÑиÑлÑемого Ñ ÐµÑа. ÐамеÑÑÑе, ÑÑо единÑÑÐ²ÐµÐ½Ð½Ð°Ñ Ð¾Ð¿Ð¾ÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð·Ð°Ð´Ð°ÑÑÑÑ Ð´Ð»Ñ Ñипа даннÑÑ , а не Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑоÑа ÑавенÑÑва. СемейÑÑво ÑекомендÑеÑÑÑ Ð´ÐµÐ»Ð°ÑÑ Ð¿Ð¾Ð»Ð½Ñм, Ñо еÑÑÑ Ð²ÐºÐ»ÑÑиÑÑ Ð² него опеÑаÑÐ¾Ñ ÑавенÑÑва Ð´Ð»Ñ Ð²ÑÐµÑ ÑоÑеÑаний Ñипов даннÑÑ . РклаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов ÑледÑÐµÑ Ð²ÐºÐ»ÑÑаÑÑ ÑолÑко одноÑиповÑй опеÑаÑÐ¾Ñ ÑавенÑÑва и опоÑнÑÑ ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¾Ð¿ÑеделÑнного Ñипа даннÑÑ .
РиндекÑÐ°Ñ GiST, SP-GiST и GIN межÑиповÑе опеÑаÑии Ñвно не вÑÑаженÑ. ÐножеÑÑво поддеÑживаемÑÑ Ð¾Ð¿ÐµÑаÑоÑов опÑеделÑеÑÑÑ ÑолÑко Ñеми опеÑаÑиÑми, коÑоÑÑе могÑÑ Ð²ÑполнÑÑÑ Ð¾ÑновнÑе опоÑнÑе ÑÑнкÑии заданного клаÑÑа опеÑаÑоÑов.
Ð BRIN ÑÑÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð²Ð¸ÑÑÑ Ð¾Ñ Ð¸Ð½ÑÑаÑÑÑÑкÑÑÑÑ, пÑедоÑÑавлÑÑÑей клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов. ÐÐ»Ñ ÐºÐ»Ð°ÑÑов опеÑаÑоÑов, поÑÑÑоеннÑÑ
на инÑÑаÑÑÑÑкÑÑÑе minmax, ÑÑебÑеÑÑÑ Ñо же поведение, ÑÑо и Ð´Ð»Ñ ÑемейÑÑв опеÑаÑоÑов B-деÑева: вÑе опеÑаÑоÑÑ Ð² ÑемейÑÑве Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ ÑовмеÑÑимÑй поÑÑдок, а пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð½Ðµ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²Ð»Ð¸ÑÑÑ Ð½Ð° ÑÑÑановленнÑй поÑÑдок ÑоÑÑиÑовки.
ÐÑимеÑание
Ðо веÑÑии 8.3 в PostgreSQL не бÑло понÑÑÐ¸Ñ ÑемейÑÑва опеÑаÑоÑов, поÑÑÐ¾Ð¼Ñ Ð»ÑбÑе межÑиповÑе опеÑаÑоÑÑ, пÑедназнаÑеннÑе Ð´Ð»Ñ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ Ð¸Ð½Ð´ÐµÐºÑом, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±Ñли пÑивÑзÑваÑÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно к клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑа индекÑа. ХоÑÑ ÑÑÐ¾Ñ Ð¿Ð¾Ð´Ñ Ð¾Ð´ по-пÑÐµÐ¶Ð½ÐµÐ¼Ñ ÑабоÑаеÑ, он ÑÑиÑаеÑÑÑ ÑÑÑаÑевÑим, поÑÐ¾Ð¼Ñ ÑÑо он ÑоздаÑÑ ÑлиÑком много завиÑимоÑÑей Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа, а Ñакже поÑомÑ, ÑÑо планиÑовÑик Ð¼Ð¾Ð¶ÐµÑ Ð²ÑполнÑÑÑ Ð¼ÐµÐ¶ÑиповÑе ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ ÑÑÑекÑивно, когда Ð´Ð»Ñ Ð¾Ð±Ð¾Ð¸Ñ Ñипов даннÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð¾Ð¿ÐµÑаÑоÑÑ Ð² одном ÑемейÑÑве.
36.16.6. СиÑÑемнÑе завиÑимоÑÑи Ð¾Ñ ÐºÐ»Ð°ÑÑов опеÑаÑоÑов #
Postgres Pro иÑполÑзÑÐµÑ ÐºÐ»Ð°ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов Ð´Ð»Ñ Ð½Ð°Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑов Ñакими ÑвойÑÑвами, коÑоÑÑе могÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ Ð½Ðµ ÑолÑко Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑов. ÐоÑÑÐ¾Ð¼Ñ ÐºÐ»Ð°ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов могÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ, даже еÑли Ð²Ñ Ð½Ðµ намеÑÐµÐ½Ñ Ð¸Ð½Ð´ÐµÐºÑиÑоваÑÑ ÑÑолбÑÑ Ñо знаÑениÑми опÑеделÑнного вами Ñипа.
Ð ÑаÑÑноÑÑи, ÑÑо каÑаеÑÑÑ SQL-конÑÑÑÑкÑий ORDER BY и DISTINCT, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
ÑÑебÑеÑÑÑ ÑÑавниваÑÑ Ð¸ ÑпоÑÑдоÑиваÑÑ Ð·Ð½Ð°ÑениÑ. ЧÑÐ¾Ð±Ñ ÑÑи конÑÑÑÑкÑии ÑабоÑали Ñ Ð¾Ð¿ÑеделÑннÑм полÑзоваÑелем Ñипом даннÑÑ
, Postgres Pro задейÑÑвÑÐµÑ ÐºÐ»Ð°ÑÑ Ð¾Ð¿ÐµÑаÑоÑов B-деÑева по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ ÑÑого Ñипа. Член «Ñавно» ÑÑого клаÑÑа опÑеделÑеÑ, как ÑиÑÑема бÑÐ´ÐµÑ Ð¿Ð¾Ð½Ð¸Ð¼Ð°ÑÑ ÑавенÑÑво знаÑений Ð´Ð»Ñ GROUP BY и DISTINCT, а поÑÑдок ÑоÑÑиÑовки, задаваемÑй клаÑÑом опеÑаÑоÑов, опÑеделÑÐµÑ Ð¿Ð¾ÑÑдок ORDER BY по ÑмолÑаниÑ.
ÐÑли клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов B-деÑева по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ñипа даннÑÑ Ð½Ðµ опÑеделÑн, ÑиÑÑема бÑÐ´ÐµÑ Ð¸ÑкаÑÑ ÐºÐ»Ð°ÑÑ Ð¾Ð¿ÐµÑаÑоÑов Ñ ÐµÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ. Ðо Ñак как подобнÑй клаÑÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑолÑко ÑавенÑÑво, Ñ Ð½Ð¸Ð¼ бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð° ÑолÑко гÑÑппиÑовка, но не ÑоÑÑиÑовка.
ÐÑли Ð´Ð»Ñ Ñипа не опÑеделÑн клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов по ÑмолÑаниÑ, попÑÑавÑиÑÑ Ð¸ÑполÑзоваÑÑ ÑÑи конÑÑÑÑкÑии SQL Ñ Ð´Ð°Ð½Ð½Ñм Ñипом, Ð²Ñ Ð¿Ð¾Ð»ÑÑиÑе оÑÐ¸Ð±ÐºÑ Ð²Ð¸Ð´Ð° «не ÑдалоÑÑ Ð½Ð°Ð¹Ñи опеÑаÑÐ¾Ñ ÑоÑÑиÑовки».
ÐÑимеÑание
Ðо веÑÑии PostgreSQL 7.4, в опеÑаÑиÑÑ
ÑоÑÑиÑовки и гÑÑппиÑовки неÑвно иÑполÑзовалиÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸ =, < и >. С новÑм подÑ
одом, опиÑаÑÑимÑÑ Ð½Ð° клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов по ÑмолÑаниÑ, ÑиÑÑема не Ð´ÐµÐ»Ð°ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ
пÑедположений о поведении опеÑаÑоÑов по иÑ
именам.
СоÑÑиÑовка Ñ Ð½ÐµÑÑандаÑÑнÑм клаÑÑом опеÑаÑоÑов B-деÑева возможна, еÑли ÑказаÑÑ Ð² пÑедложении USING опеÑаÑÐ¾Ñ Â«Ð¼ÐµÐ½ÑÑе или Ñавно» в данном клаÑÑе:
SELECT * FROM mytable ORDER BY somecol USING ~<~;
Также возможно вÑполниÑÑ ÑоÑÑиÑÐ¾Ð²ÐºÑ Ð² поÑÑдке по ÑбÑваниÑ, еÑли ÑказаÑÑ Ð² USING опеÑаÑÐ¾Ñ Â«Ð±Ð¾Ð»ÑÑе или Ñавно».
СÑавнение маÑÑивов полÑзоваÑелÑÑÐºÐ¸Ñ Ñипов Ñакже пÑоизводиÑÑÑ Ð² завиÑимоÑÑи Ð¾Ñ ÑеманÑики, опÑеделÑнной клаÑÑом опеÑаÑоÑов B-деÑева. ÐÑли клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов B-деÑева по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ Ñипа не опÑеделÑн, но имееÑÑÑ ÐºÐ»Ð°ÑÑ Ð¾Ð¿ÐµÑаÑоÑов Ñ ÐµÑиÑованиÑ, Ñо бÑÐ´ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑÑÑ ÑÑавнение маÑÑивов, но не ÑпоÑÑдоÑивание.
ÐÑÑ Ð¾Ð´Ð½Ð° возможноÑÑÑ ÑзÑка SQL, коÑоÑÐ°Ñ ÑÑебÑÐµÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ
знаний о Ñипе даннÑÑ
â ÑÑо Ñказание RANGE ÑмеÑение PRECEDING/FOLLOWING Ð´Ð»Ñ Ð¾ÐºÐ¾Ð½Ð½ÑÑ
ÑÑнкÑий (Ñм. ÐодÑаздел 4.2.8). ÐÐ»Ñ Ð·Ð°Ð¿ÑоÑа вида
SELECT sum(x) OVER (ORDER BY x RANGE BETWEEN 5 PRECEDING AND 10 FOLLOWING) FROM mytable;
недоÑÑаÑоÑно знаÑÑ, как ÑпоÑÑдоÑиÑÑ x; база даннÑÑ
должна Ñакже понимаÑÑ, как «вÑÑеÑÑÑ 5» или «пÑибавиÑÑ 10» к знаÑÐµÐ½Ð¸Ñ x в ÑекÑÑей ÑÑÑоке Ð´Ð»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñамок ÑекÑÑего окна. СÑавниваÑÑ ÑезÑлÑÑиÑÑÑÑие гÑаниÑÑ Ñо знаÑениÑми x в дÑÑгиÑ
ÑÑÑокаÑ
можно иÑполÑзÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ ÑÑавнениÑ, пÑедоÑÑавленнÑе клаÑÑом опеÑаÑоÑов B-деÑева, коÑоÑÑе задаÑÑ ÑпоÑÑдоÑивание ORDER BY, но опеÑаÑоÑÑ ÑÐ»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¸ вÑÑиÑÐ°Ð½Ð¸Ñ Ð½Ðµ вÑ
одÑÑ Ð² ÑÑÐ¾Ñ ÐºÐ»Ð°ÑÑ Ð¾Ð¿ÐµÑаÑоÑов. Так какие же иÑполÑзоваÑÑ Ð² ÑÑом ÑлÑÑае? ÐÑÑÑко заÑикÑиÑоваÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ Ð² коде бÑло Ð±Ñ Ð½ÐµÐ¶ÐµÐ»Ð°ÑелÑно, Ñак как пÑи ÑазлиÑнÑÑ
поÑÑдкаÑ
ÑоÑÑиÑовки (Ñ ÑазлиÑнÑми клаÑÑами опеÑаÑоÑов B-деÑева) поведение Ð¼Ð¾Ð¶ÐµÑ Ð¼ÐµÐ½ÑÑÑÑÑ. ÐоÑÑÐ¾Ð¼Ñ ÐºÐ»Ð°ÑÑ Ð¾Ð¿ÐµÑаÑоÑов B-деÑева позволÑÐµÑ Ð·Ð°Ð´Ð°ÑÑ Ð¾Ð¿Ð¾ÑнÑÑ ÑÑнкÑÐ¸Ñ in_range, оÑÑÑеÑÑвлÑÑÑÑÑ Ñложение и вÑÑиÑание в ÑооÑвеÑÑÑвии Ñ Ð¿Ð¾ÑÑдком ÑоÑÑиÑовки. ÐпоÑнÑÑ
ÑÑнкÑий in_range Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð°Ð¶Ðµ неÑколÑко, еÑли в каÑеÑÑве ÑмеÑÐµÐ½Ð¸Ñ Ð² пÑедложениÑÑ
RANGE Ð¸Ð¼ÐµÐµÑ ÑмÑÑл пеÑедаваÑÑ Ð´Ð°Ð½Ð½Ñе ÑазнÑÑ
Ñипов. ÐÑли в клаÑÑе опеÑаÑоÑов B-деÑева, ÑвÑзанном Ñ ÑказаннÑм Ð´Ð»Ñ Ð¾ÐºÐ½Ð° пÑедложением ORDER BY, Ð½ÐµÑ Ð¿Ð¾Ð´Ñ
одÑÑей опоÑной ÑÑнкÑии in_range, Ñо Ñказание RANGE ÑмеÑение PRECEDING/FOLLOWING не поддеÑживаеÑÑÑ.
Также важно оÑмеÑиÑÑ, ÑÑо опеÑаÑÐ¾Ñ ÑавенÑÑва, ÑказаннÑй в ÑемейÑÑве опеÑаÑоÑов Ñ ÐµÑиÑованиÑ, ÑвлÑеÑÑÑ ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñом Ð´Ð»Ñ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñи ÑлиÑнии и агÑегаÑии по Ñ ÐµÑÑ, а Ñакже пÑи ÑвÑзанной опÑимизаÑии. СемейÑÑво опеÑаÑоÑов Ñ ÐµÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð³ÑÐ°ÐµÑ Ð² данном ÑлÑÑае опÑеделÑÑÑÑÑ ÑолÑ, Ñак как именно в нÑм задаÑÑÑÑ ÑÑнкÑÐ¸Ñ Ñ ÐµÑиÑованиÑ.
36.16.7. ÐпеÑаÑоÑÑ ÑпоÑÑдоÑÐ¸Ð²Ð°Ð½Ð¸Ñ #
ÐекоÑоÑÑе меÑÐ¾Ð´Ñ Ð´Ð¾ÑÑÑпа индекÑов (в наÑÑоÑÑее вÑÐµÐ¼Ñ ÑолÑко GiST и SP-GiST) поддеÑживаÑÑ ÐºÐ¾Ð½ÑепÑÐ¸Ñ Ð¾Ð¿ÐµÑаÑоÑов ÑпоÑÑдоÑиваниÑ. ÐпеÑаÑоÑÑ, коÑоÑÑе Ð¼Ñ Ð¾Ð±ÑÑждали до ÑÑого, бÑли опеÑаÑоÑами поиÑка. ÐпеÑаÑоÑом поиÑка назÑваеÑÑÑ Ñакой опеÑаÑоÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑого можно вÑполниÑÑ Ð¿Ð¾Ð¸Ñк по индекÑÑ Ð¸ найÑи вÑе ÑÑÑоки, ÑдовлеÑвоÑÑÑÑие ÑÑÐ»Ð¾Ð²Ð¸Ñ WHERE индекÑиÑованнÑй_ÑÑÐ¾Ð»Ð±ÐµÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ ÐºÐ¾Ð½ÑÑанÑа. ÐамеÑÑÑе, ÑÑо пÑи ÑÑом ниÑего не говоÑиÑÑÑ Ð¾ поÑÑдке, в коÑоÑом бÑдÑÑ Ð²Ð¾Ð·Ð²ÑаÑÐµÐ½Ñ Ð¿Ð¾Ð´Ñ
одÑÑие ÑÑÑоки. ÐпеÑаÑÐ¾Ñ ÑпоÑÑдоÑиваниÑ, напÑоÑив, не огÑаниÑÐ¸Ð²Ð°ÐµÑ Ð½Ð°Ð±Ð¾Ñ Ð²Ð¾Ð·Ð²ÑаÑаемÑÑ
ÑÑÑок, но опÑеделÑÐµÑ Ð¸Ñ
поÑÑдок. С Ñаким опеÑаÑоÑом, пÑоÑканиÑовав индекÑ, можно полÑÑиÑÑ ÑÑÑоки в поÑÑдке, заданнÑм Ñказанием ORDER BY индекÑиÑованнÑй_ÑÑÐ¾Ð»Ð±ÐµÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ ÐºÐ¾Ð½ÑÑанÑа. Такое опÑеделение обÑÑÑнÑеÑÑÑ Ñем, ÑÑо оно поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿Ð¾Ð¸Ñк ближайÑего ÑоÑеда, еÑли ÑÑÐ¾Ñ Ð¾Ð¿ÐµÑаÑÐ¾Ñ Ð²ÑÑиÑлÑÐµÑ ÑаÑÑÑоÑние. ÐапÑимеÑ, запÑоÑ
SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
наÑ
Ð¾Ð´Ð¸Ñ Ð´ÐµÑÑÑÑ Ð±Ð»Ð¸Ð¶Ð°Ð¹ÑиÑ
к заданной ÑоÑке меÑÑ. ÐÐ½Ð´ÐµÐºÑ GiST по ÑÑолбÑÑ location Ð¼Ð¾Ð¶ÐµÑ ÑделаÑÑ ÑÑо ÑÑÑекÑивно, Ñак как <-> â ÑÑо опеÑаÑÐ¾Ñ ÑпоÑÑдоÑиваниÑ.
Тогда как опеÑаÑоÑÑ Ð¿Ð¾Ð¸Ñка Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ Ð»Ð¾Ð³Ð¸ÑеÑкие ÑезÑлÑÑаÑÑ, опеÑаÑоÑÑ ÑпоÑÑдоÑÐ¸Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±ÑÑно возвÑаÑаÑÑ Ð´ÑÑгой Ñип, напÑимеÑ, float или numeric Ð´Ð»Ñ ÑаÑÑÑоÑний. ÐÑÐ¾Ñ Ñип, как пÑавило, оÑлиÑаеÑÑÑ Ð¾Ñ Ñипа индекÑиÑÑемÑÑ
даннÑÑ
. ЧÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð¶ÑÑÑко запÑогÑаммиÑованнÑÑ
пÑедположений о поведении ÑазлиÑнÑÑ
Ñипов даннÑÑ
, пÑи обÑÑвлении опеÑаÑоÑа ÑпоÑÑдоÑÐ¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ ÑказÑваÑÑÑÑ ÑемейÑÑво опеÑаÑоÑов B-деÑева, опÑеделÑÑÑее поÑÑдок ÑоÑÑиÑовки ÑезÑлÑÑиÑÑÑÑего Ñипа даннÑÑ
. Ðак бÑло оÑмеÑено в пÑедÑдÑÑем Ñазделе, ÑемейÑÑва опеÑаÑоÑов B-деÑева опÑеделÑÑÑ Ð¿Ð¾Ð½ÑÑие ÑпоÑÑдоÑÐ¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Postgres Pro, Ñак ÑÑо Ñакое обÑÑвление оказÑваеÑÑÑ ÐµÑÑеÑÑвеннÑм. Так как опеÑаÑÐ¾Ñ <-> Ð´Ð»Ñ ÑоÑек возвÑаÑÐ°ÐµÑ float8, его можно вклÑÑиÑÑ Ð² ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ»Ð°ÑÑа опеÑаÑоÑов Ñак:
OPERATOR 15 <-> (point, point) FOR ORDER BY float_ops
где float_ops â вÑÑÑоенное ÑемейÑÑво опеÑаÑоÑов, вклÑÑаÑÑее опеÑаÑии Ñ float8. ÐÑо обÑÑвление ознаÑаеÑ, ÑÑо Ð¸Ð½Ð´ÐµÐºÑ Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ ÑÑÑоки в поÑÑдке ÑвелиÑÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñений опеÑаÑоÑа <->.
36.16.8. ÐÑобенноÑÑи клаÑÑов опеÑаÑоÑов #
ÐÑÑÑ ÐµÑÑ Ð´Ð²Ðµ оÑобенноÑÑи клаÑÑов опеÑаÑоÑов, коÑоÑÑе Ð¼Ñ Ð´Ð¾ ÑÑого не обÑÑждали, в пеÑвÑÑ Ð¾ÑеÑÐµÐ´Ñ Ð¿Ð¾ÑомÑ, ÑÑо они не воÑÑÑÐµÐ±Ð¾Ð²Ð°Ð½Ñ Ð´Ð»Ñ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ ÑаÑÑо пÑименÑемÑÑ Ð¼ÐµÑодов индекÑов.
ÐбÑÑно обÑÑвление опеÑаÑоÑа в каÑеÑÑве Ñлена клаÑÑа опеÑаÑоÑов (или ÑемейÑÑва) ознаÑаеÑ, ÑÑо меÑод индекÑа Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ ÑоÑно Ð½Ð°Ð±Ð¾Ñ ÑÑÑок, коÑоÑÑй ÑдовлеÑвоÑÑÐµÑ ÑÑÐ»Ð¾Ð²Ð¸Ñ WHERE Ñ ÑÑим опеÑаÑоÑом. ÐапÑимеÑ, запÑоÑ:
SELECT * FROM table WHERE integer_column < 4;
Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑдовлеÑвоÑÑн в ÑоÑноÑÑи индекÑом-B-деÑевом по ÑелоÑиÑÐ»ÐµÐ½Ð½Ð¾Ð¼Ñ ÑÑолбÑÑ. Ðо бÑваÑÑ ÑлÑÑаи, когда Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½ как пÑиблизиÑелÑнÑй ÑказаÑÐµÐ»Ñ Ð½Ð° ÑооÑвеÑÑÑвÑÑÑие ÑÑÑоки. ÐапÑимеÑ, еÑли Ð¸Ð½Ð´ÐµÐºÑ GiST Ñ
ÑÐ°Ð½Ð¸Ñ ÑолÑко пÑÑмоÑголÑники, опиÑаннÑе вокÑÑг геомеÑÑиÑеÑкиÑ
обÑекÑов, он не Ð¼Ð¾Ð¶ÐµÑ ÑоÑно ÑдовлеÑвоÑиÑÑ ÑÑловие WHERE, коÑоÑое пÑовеÑÑÐµÑ Ð¿ÐµÑеÑеÑение не пÑÑмоÑголÑнÑÑ
обÑекÑов, а напÑимеÑ, многоÑголÑников. Ðднако ÑÑÐ¾Ñ Ð¸Ð½Ð´ÐµÐºÑ Ð¼Ð¾Ð¶Ð½Ð¾ пÑимениÑÑ, ÑÑÐ¾Ð±Ñ Ð½Ð°Ð¹Ñи обÑекÑÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
опиÑаннÑе вокÑÑг пÑÑмоÑголÑники пеÑеÑекаÑÑÑÑ Ñ Ð¿ÑÑмоÑголÑником, опиÑаннÑм вокÑÑг Ñелевого обÑекÑа, а заÑем пÑовеÑÑи ÑоÑнÑÑ Ð¿ÑовеÑÐºÑ Ð¿ÐµÑеÑеÑÐµÐ½Ð¸Ñ ÑолÑко Ð´Ð»Ñ Ð½Ð°Ð¹Ð´ÐµÐ½Ð½ÑÑ
по индекÑÑ Ð¾Ð±ÑекÑов. ÐÑли ÑÑо Ð¸Ð¼ÐµÐµÑ Ð¼ÐµÑÑо, Ñакой Ð¸Ð½Ð´ÐµÐºÑ Ð½Ð°Ð·ÑваеÑÑÑ Â«Ð½ÐµÑоÑнÑм» Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑоÑа. ÐÐ»Ñ ÑеализаÑии поиÑка по неÑоÑÐ½Ð¾Ð¼Ñ Ð¸Ð½Ð´ÐµÐºÑÑ Ð¼ÐµÑод индекÑа возвÑаÑÐ°ÐµÑ Ñлаг recheck (пеÑепÑовеÑиÑÑ), когда ÑÑÑока Ð¼Ð¾Ð¶ÐµÑ Ð´ÐµÐ¹ÑÑвиÑелÑно ÑдовлеÑвоÑÑÑÑ, а Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ ÑдовлеÑвоÑÑÑÑ ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð·Ð°Ð¿ÑоÑа. ÐаÑем иÑполниÑÐµÐ»Ñ Ð·Ð°Ð¿ÑоÑа пеÑепÑовеÑÑÐµÑ Ð¿Ð¾Ð»ÑÑеннÑÑ ÑÑÑÐ¾ÐºÑ Ð¿Ð¾ иÑÑ
Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð·Ð°Ð¿ÑоÑа и опÑеделÑеÑ, должна ли она вÑдаваÑÑÑÑ ÐºÐ°Ðº дейÑÑвиÑелÑно ÑооÑвеÑÑÑвÑÑÑÐ°Ñ ÐµÐ¼Ñ. ÐÑÐ¾Ñ Ð¿Ð¾Ð´Ñ
од ÑабоÑаеÑ, еÑли Ð¸Ð½Ð´ÐµÐºÑ Ð³Ð°ÑанÑиÑованно вÑдаÑÑ Ð²Ñе ÑÑебÑемÑе ÑÑÑоки плÑÑ, возможно, дополниÑелÑнÑе ÑÑÑоки, коÑоÑÑе можно иÑклÑÑиÑÑ, вÑзвав пеÑвонаÑалÑнÑй опеÑаÑоÑ. ÐеÑÐ¾Ð´Ñ Ð¸Ð½Ð´ÐµÐºÑов, поддеÑживаÑÑие неÑоÑнÑй поиÑк (в наÑÑоÑÑее вÑемÑ, GiST, SP-GiST и GIN), позволÑÑÑ ÑÑÑанавливаÑÑ Ñлаг recheck опоÑнÑм ÑÑнкÑиÑм оÑделÑнÑÑ
клаÑÑов опеÑаÑоÑов, Ñак ÑÑо по ÑÑÑи ÑÑо оÑобенноÑÑÑ ÐºÐ»Ð°ÑÑа опеÑаÑоÑов.
ÐеÑнÑмÑÑ Ðº ÑиÑÑаÑии, когда Ð¼Ñ Ñ
Ñаним в индекÑе ÑолÑко пÑÑмоÑголÑник, опиÑаннÑй вокÑÑг Ñложного обÑекÑа, Ñакого как многоÑголÑник. Ð ÑÑом ÑлÑÑае Ð½ÐµÑ Ð±Ð¾Ð»ÑÑого ÑмÑÑла Ñ
ÑаниÑÑ Ð² ÑлеменÑе индекÑа веÑÑ Ð¼Ð½Ð¾Ð³Ð¾ÑголÑник â Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ Ñ Ñем же ÑÑпеÑ
ом Ñ
ÑаниÑÑ Ð±Ð¾Ð»ÐµÐµ пÑоÑÑой обÑÐµÐºÑ Ñипа box. ÐÑо оÑклонение вÑÑажаеÑÑÑ Ñказанием STORAGE в команде CREATE OPERATOR CLASS, коÑоÑое запиÑÑваеÑÑÑ Ð¿ÑимеÑно Ñак:
CREATE OPERATOR CLASS polygon_ops
DEFAULT FOR TYPE polygon USING gist AS
...
STORAGE box; РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÑолÑко меÑÐ¾Ð´Ñ Ð¸Ð½Ð´ÐµÐºÑов GiST, SP-GiST, GIN и BRIN позволÑÑÑ Ð·Ð°Ð´Ð°ÑÑ Ð² STORAGE Ñип, оÑлиÑнÑй Ð¾Ñ Ñипа даннÑÑ
ÑÑолбÑа. Ð GiST пÑеобÑазованием даннÑÑ
, ÑвÑзаннÑм Ñ Ð¸ÑполÑзованием STORAGE, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð°Ð½Ð¸Ð¼Ð°ÑÑÑÑ Ð¾Ð¿Ð¾ÑнÑе пÑоÑедÑÑÑ compress и decompress. ÐналогиÑнÑм обÑазом в SP-GiST опоÑÐ½Ð°Ñ Ð¿ÑоÑедÑÑа compress занимаеÑÑÑ Ð¿ÑеобÑазованием даннÑÑ
к ÑÐ¸Ð¿Ñ Ñ
ÑанениÑ, еÑли они имеÑÑ Ð´ÑÑгой Ñип; еÑли клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов SP-GiST поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¸ полÑÑение даннÑÑ
, обÑаÑное пÑеобÑазование вÑполнÑÐµÑ ÑÑнкÑÐ¸Ñ consistent. Ð GIN Ñип STORAGE опÑеделÑÐµÑ Ñип знаÑений «клÑÑа», коÑоÑÑй обÑÑно оÑлиÑаеÑÑÑ Ð¾Ñ Ñипа индекÑиÑÑемого ÑÑолбÑа â напÑимеÑ, в клаÑÑе опеÑаÑоÑов Ð´Ð»Ñ ÑÑолбÑов Ñ ÑелоÑиÑленнÑм маÑÑивом клÑÑами могÑÑ Ð±ÑÑÑ Ð¿ÑоÑÑо ÑелÑе ÑиÑла. Ðа извлеÑение клÑÑей из индекÑиÑованнÑÑ
знаÑений в GIN оÑвеÑаÑÑ Ð¾Ð¿Ð¾ÑнÑе ÑÑнкÑии extractValue и extractQuery. BRIN поÑ
ож на GIN: в нÑм Ñип STORAGE опÑеделÑÐµÑ Ñип Ñ
ÑанимÑÑ
обобÑÑннÑÑ
знаÑений, а опоÑнÑе пÑоÑедÑÑÑ ÐºÐ»Ð°ÑÑов опеÑаÑоÑов оÑвеÑаÑÑ Ð·Ð° пÑавилÑное пÑоÑÑение ÑÑиÑ
знаÑений.