11.3. СоÑÑавнÑе индекÑÑ #
ÐндекÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑоздаваÑÑ Ð¸ по неÑколÑким ÑÑолбÑам ÑаблиÑÑ. ÐапÑимеÑ, еÑли Ñ Ð²Ð°Ñ ÐµÑÑÑ ÑаблиÑа:
CREATE TABLE test2 ( major int, minor int, name varchar );
(пÑедположим, ÑÑо Ð²Ñ Ð¿Ð¾Ð¼ÐµÑÑили в Ð½ÐµÑ ÑодеÑжимое каÑалога /dev) и Ð²Ñ ÑаÑÑо вÑполнÑеÑе запÑоÑÑ Ð²Ð¸Ð´Ð°:
SELECT name FROM test2 WHERE major =конÑÑанÑаAND minor =конÑÑанÑа;
Ñогда Ð¸Ð¼ÐµÐµÑ ÑмÑÑл опÑеделиÑÑ Ð¸Ð½Ð´ÐµÐºÑ, покÑÑваÑÑий оба ÑÑолбÑа major и minor. ÐапÑимеÑ:
CREATE INDEX test2_mm_idx ON test2 (major, minor);
РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÑоÑÑавнÑми могÑÑ Ð±ÑÑÑ ÑолÑко индекÑÑ Ñипов B-деÑево, GiST, GIN и BRIN. ÐозможноÑÑÑ Ð¿Ð¾ÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа по неÑколÑким клÑÑевÑм ÑÑолбÑам не завиÑÐ¸Ñ Ð¾Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑи Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² Ð¸Ð½Ð´ÐµÐºÑ Ð½ÐµÐºÐ»ÑÑевÑÑ
ÑÑолбÑов (INCLUDE). ЧиÑло ÑÑолбÑов в индекÑе огÑаниÑиваеÑÑÑ 32, вклÑÑÐ°Ñ ÑÑолбÑÑ INCLUDE. (ÐÑÐ¾Ñ Ð¿Ñедел можно измениÑÑ Ð¿Ñи компилÑÑии Postgres Pro.)
СоÑÑавной индекÑ-B-деÑево Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð² ÑÑловиÑÑ Ñ Ð»ÑбÑм подмножеÑÑвом ÑÑолбÑов индекÑа, но наиболее ÑÑÑекÑивен он пÑи огÑаниÑениÑÑ Ð¿Ð¾ ведÑÑим (левÑм) ÑÑолбÑам. ТоÑное пÑавило ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо ÑканиÑÑÐµÐ¼Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¸Ð½Ð´ÐµÐºÑа вÑегда опÑеделÑеÑÑÑ Ð¾Ð³ÑаниÑениÑми ÑавенÑÑва Ñ Ð²ÐµÐ´ÑÑими ÑÑолбÑами и огÑаниÑениÑми неÑавенÑÑва Ñ Ð¿ÐµÑвÑм ÑÑолбÑом, не ÑÑаÑÑвÑÑÑим в огÑаниÑении ÑавенÑÑва. ÐгÑаниÑÐµÐ½Ð¸Ñ ÑÑолбÑов пÑавее Ð½Ð¸Ñ Ñакже пÑовеÑÑÑÑÑÑ Ð¿Ð¾ индекÑÑ, ÑÑо вÑегда избавлÑÐµÑ Ð¾Ñ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи обÑаÑаÑÑÑÑ Ðº ÑаблиÑе, но ÑÑо Ñже необÑзаÑелÑно влиÑÐµÑ Ð½Ð° ÑÐ°Ð·Ð¼ÐµÑ ÑканиÑÑемой облаÑÑи индекÑа. ÐÑли пÑи ÑканиÑовании индекÑа-B-деÑева ÑÑÑекÑивно пÑименÑеÑÑÑ Ð¾Ð¿ÑимизаÑÐ¸Ñ Ð¿ÑопÑÑка, огÑаниÑение Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑÑолбÑа бÑÐ´ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð¿Ñи пеÑемеÑении по индекÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð¿Ð¾Ð²ÑоÑнÑÑ Ð¿Ð¾Ð¸Ñков по индекÑÑ. ÐÑо Ð¼Ð¾Ð¶ÐµÑ ÑменÑÑиÑÑ ÑÐ°Ð·Ð¼ÐµÑ Ð¾Ð±Ð»Ð°ÑÑи индекÑа, коÑоÑÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ пÑоÑиÑаÑÑ, даже еÑли Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ или неÑколÑÐºÐ¸Ñ ÑÑолбÑов (ÑаÑположеннÑÑ Ð¿ÐµÑед наименее знаÑимÑм ÑÑолбÑом индекÑа из пÑедикаÑа запÑоÑа) оÑÑÑÑÑÑвÑÐµÑ Ð¾Ð±ÑÑное огÑаниÑение ÑавенÑÑва. ÐÑопÑÑк пÑи ÑканиÑовании ÑабоÑÐ°ÐµÑ Ð·Ð° ÑÑÑÑ Ð²Ð½ÑÑÑенней генеÑаÑии динамиÑеÑкого огÑаниÑÐµÐ½Ð¸Ñ ÑавенÑÑва, ÑооÑвеÑÑÑвÑÑÑего лÑÐ±Ð¾Ð¼Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð² ÑÑолбÑе индекÑа (пÑименÑеÑÑÑ ÑолÑко Ð´Ð»Ñ ÑÑолбÑов без огÑаниÑений ÑавенÑÑва в пÑедикаÑе запÑоÑа и ÑолÑко когда ÑгенеÑиÑованное огÑаниÑение Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ ÑовмеÑÑно Ñ Ð¿Ð¾ÑледÑÑÑими огÑаниÑениÑми ÑÑолбÑов из пÑедикаÑа запÑоÑа).
ÐапÑимеÑ, еÑли еÑÑÑ Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾ ÑÑолбÑам (x, y) и ÑÑловие запÑоÑа WHERE y = 7700, пÑи ÑканиÑовании индекÑа-B-деÑева Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð¾Ð¿ÑимизаÑÐ¸Ñ Ð¿ÑопÑÑка. ÐбÑÑно ÑÑо пÑоиÑÑ
одиÑ, когда планиÑовÑик запÑоÑов ожидаеÑ, ÑÑо повÑоÑнÑе поиÑки WHERE x = N AND y = 7700 Ð´Ð»Ñ Ð»Ñбого возможного знаÑÐµÐ½Ð¸Ñ N (или Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ знаÑÐµÐ½Ð¸Ñ x, коÑоÑое дейÑÑвиÑелÑно Ñ
ÑаниÑÑÑ Ð² индекÑе) â ÑÑо ÑамÑй бÑÑÑÑÑй возможнÑй подÑ
од, ÑÑиÑÑÐ²Ð°Ñ Ð´Ð¾ÑÑÑпнÑе индекÑÑ ÑаблиÑÑ. ÐÑÐ¾Ñ Ð¿Ð¾Ð´Ñ
од пÑименÑеÑÑÑ ÑолÑко в ÑлÑÑае, когда колиÑеÑÑво ÑникалÑнÑÑ
знаÑений x наÑÑолÑко мало, ÑÑо планиÑовÑик ожидаеÑ, ÑÑо во вÑÐµÐ¼Ñ ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð±Ð¾Ð»ÑÑÐ°Ñ ÑаÑÑÑ Ð¸Ð½Ð´ÐµÐºÑа бÑÐ´ÐµÑ Ð¿ÑопÑÑена (поÑÐ¾Ð¼Ñ ÑÑо болÑÑинÑÑво лиÑÑовÑÑ
ÑÑÑÐ°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа не могÑÑ ÑодеÑжаÑÑ ÑооÑвеÑÑÑвÑÑÑие коÑÑежи). ÐÑли ÑникалÑнÑÑ
знаÑений x много, Ñо необÑ
одимо пÑоÑканиÑоваÑÑ Ð²ÐµÑÑ Ð¸Ð½Ð´ÐµÐºÑ, поÑÑÐ¾Ð¼Ñ Ð² болÑÑинÑÑве ÑлÑÑаев планиÑовÑик пÑедпоÑÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа поÑледоваÑелÑное ÑканиÑование ÑаблиÑÑ.
ÐпÑимизаÑÐ¸Ñ Ð¿ÑопÑÑка пÑи ÑканиÑовании Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð²ÑбоÑоÑно пÑи ÑканиÑованиÑÑ
B-деÑева, когда еÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñе огÑаниÑÐµÐ½Ð¸Ñ Ð¸Ð· пÑедикаÑа запÑоÑа. ÐапÑимеÑ, еÑли еÑÑÑ Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾ ÑÑолбÑам (a, b, c) и ÑÑловие WHERE a = 5 AND b >= 42 AND c < 77, Ð¸Ð½Ð´ÐµÐºÑ Ð±ÑÐ´ÐµÑ ÑканиÑоваÑÑÑÑ Ð¾Ñ Ð¿ÐµÑвой запиÑи a = 5 и b = 42 до поÑледней Ñ a = 5. ÐапиÑи индекÑа, в коÑоÑÑÑ
c >= 77, никогда не бÑдÑÑ ÑилÑÑÑоваÑÑÑÑ Ð½Ð° ÑаблиÑном ÑÑовне, но иÑ
пÑопÑÑк в индекÑе Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÐºÐ°Ðº вÑгоднÑм, Ñак и неÑ. Ð ÑлÑÑае пÑопÑÑка наÑинаеÑÑÑ Ð½Ð¾Ð²Ñй поиÑк по индекÑÑ Ð´Ð»Ñ Ð¿ÐµÑемеÑÐµÐ½Ð¸Ñ Ð¾Ñ ÐºÐ¾Ð½Ñа ÑекÑÑей гÑÑÐ¿Ð¿Ñ a = 5 и b = N (Ñ.е. Ñ Ð¿Ð¾Ð·Ð¸Ñии в индекÑе, где поÑвлÑеÑÑÑ Ð¿ÐµÑвÑй коÑÑеж a = 5 AND b = N AND c >= 77) к наÑÐ°Ð»Ñ ÑледÑÑÑей гÑÑÐ¿Ð¿Ñ (Ñ.е. позиÑии в индекÑе, где поÑвлÑеÑÑÑ Ð¿ÐµÑвÑй коÑÑеж a = 5 AND b = N + 1).
СоÑÑавной Ð¸Ð½Ð´ÐµÐºÑ GiST Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð² ÑÑловиÑÑ Ñ Ð»ÑбÑм подмножеÑÑвом ÑÑолбÑов индекÑа. УÑÐ»Ð¾Ð²Ð¸Ñ Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑми ÑÑолбÑами огÑаниÑиваÑÑ Ð·Ð°Ð¿Ð¸Ñи, возвÑаÑаемÑе индекÑом, но в пеÑвÑÑ Ð¾ÑеÑÐµÐ´Ñ ÑканиÑÑÐµÐ¼Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¸Ð½Ð´ÐµÐºÑа опÑеделÑеÑÑÑ Ð¾Ð³ÑаниÑением пеÑвого ÑÑолбÑа. GiST-Ð¸Ð½Ð´ÐµÐºÑ Ð±ÑÐ´ÐµÑ Ð¾ÑноÑиÑелÑно малоÑÑÑекÑивен, когда пеÑвÑй его ÑÑÐ¾Ð»Ð±ÐµÑ ÑодеÑÐ¶Ð¸Ñ ÑолÑко неÑколÑко ÑазлиÑаÑÑÐ¸Ñ ÑÑ Ð·Ð½Ð°Ñений, даже еÑли дополниÑелÑнÑе ÑÑолбÑÑ Ð´Ð°ÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво ÑазлиÑнÑÑ Ð·Ð½Ð°Ñений.
СоÑÑавной Ð¸Ð½Ð´ÐµÐºÑ GIN Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð² ÑÑловиÑÑ Ñ Ð»ÑбÑм подмножеÑÑвом ÑÑолбÑов индекÑа. РоÑлиÑие Ð¾Ñ Ð¸Ð½Ð´ÐµÐºÑов GiST или B-деÑевÑев, ÑÑÑекÑивноÑÑÑ Ð¿Ð¾Ð¸Ñка по Ð½ÐµÐ¼Ñ Ð½Ðµ менÑеÑÑÑ Ð² завиÑимоÑÑи Ð¾Ñ Ñого, какие из его ÑÑолбÑов иÑполÑзÑÑÑÑÑ Ð² ÑÑловиÑÑ Ð·Ð°Ð¿ÑоÑа.
СоÑÑавной Ð¸Ð½Ð´ÐµÐºÑ BRIN Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð² ÑÑловиÑÑ
запÑоÑа Ñ Ð»ÑбÑм подмножеÑÑвом ÑÑолбÑов индекÑа. Ðодобно индекÑÑ GIN и в оÑлиÑие Ð¾Ñ B-деÑевÑев или GiST, ÑÑÑекÑивноÑÑÑ Ð¿Ð¾Ð¸Ñка по Ð½ÐµÐ¼Ñ Ð½Ðµ менÑеÑÑÑ Ð² завиÑимоÑÑи Ð¾Ñ Ñого, какие из его ÑÑолбÑов иÑполÑзÑÑÑÑÑ Ð² ÑÑловиÑÑ
запÑоÑа. ÐдинÑÑвенное, заÑем в одной ÑаблиÑе могÑÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð½ÐµÑколÑко индекÑов BRIN вмеÑÑо одного ÑоÑÑавного индекÑа â ÑÑо заÑем, ÑÑÐ¾Ð±Ñ Ð¿ÑименÑлиÑÑ ÑазнÑе паÑамеÑÑÑ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ pages_per_range.
ÐÑи ÑÑом, ÑазÑмееÑÑÑ, каждÑй ÑÑÐ¾Ð»Ð±ÐµÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ иÑполÑзоваÑÑÑÑ Ñ Ð¾Ð¿ÐµÑаÑоÑами, ÑооÑвеÑÑÑвÑÑÑими ÑÐ¸Ð¿Ñ Ð¸Ð½Ð´ÐµÐºÑа; огÑаниÑÐµÐ½Ð¸Ñ Ñ Ð´ÑÑгими опеÑаÑоÑами ÑаÑÑмаÑÑиваÑÑÑÑ Ð½Ðµ бÑдÑÑ.
СоÑÑавнÑе индекÑÑ ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð¾Ð±Ð´Ñманно. РболÑÑинÑÑве ÑлÑÑаев Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾ Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑÑолбÑÑ Ð±ÑÐ´ÐµÑ ÑабоÑаÑÑ Ð´Ð¾ÑÑаÑоÑно Ñ Ð¾ÑоÑо и ÑÑÐºÐ¾Ð½Ð¾Ð¼Ð¸Ñ Ð²ÑÐµÐ¼Ñ Ð¸ меÑÑо. ÐндекÑÑ Ð¿Ð¾ более Ñем ÑÑÑм ÑÑолбÑам вÑÑд ли бÑдÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñми, еÑли ÑолÑко ÑаблиÑа не иÑполÑзÑеÑÑÑ ÐºÑайне однообÑазно. ÐпиÑание доÑÑоинÑÑв ÑазлиÑнÑÑ ÐºÐ¾Ð½ÑигÑÑаÑий индекÑов можно найÑи в Разделе 11.5 и Разделе 11.9.