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-деÑево Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð² ÑÑловиÑÑ
Ñ Ð»ÑбÑм подмножеÑÑвом ÑÑолбÑов индекÑа, но наиболее ÑÑÑекÑивен он пÑи огÑаниÑениÑÑ
по ведÑÑим (левÑм) ÑÑолбÑам. ТоÑное пÑавило ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо ÑканиÑÑÐµÐ¼Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¸Ð½Ð´ÐµÐºÑа опÑеделÑеÑÑÑ ÑÑловиÑми ÑавенÑÑва Ñ Ð²ÐµÐ´ÑÑими ÑÑолбÑами и ÑÑловиÑми неÑавенÑÑва Ñ Ð¿ÐµÑвÑм ÑÑолбÑом, не ÑÑаÑÑвÑÑÑим в ÑÑловии ÑавенÑÑва. ÐгÑаниÑÐµÐ½Ð¸Ñ ÑÑолбÑов пÑавее ниÑ
Ñакже пÑовеÑÑÑÑÑÑ Ð¿Ð¾ индекÑÑ, Ñак ÑÑо обÑаÑение к ÑаблиÑе оÑкладÑваеÑÑÑ, но на ÑÐ°Ð·Ð¼ÐµÑ ÑканиÑÑемой облаÑÑи индекÑа ÑÑо Ñже не влиÑеÑ. ÐапÑимеÑ, еÑли еÑÑÑ Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾ ÑÑолбÑам (a, b, c) и ÑÑловие WHERE a = 5 AND b >= 42 AND c < 77, Ð¸Ð½Ð´ÐµÐºÑ Ð±ÑÐ´ÐµÑ ÑканиÑоваÑÑÑÑ Ð¾Ñ Ð¿ÐµÑвой запиÑи a = 5 и b = 42 до поÑледней Ñ a = 5. ÐапиÑи индекÑа, в коÑоÑÑÑ
c >= 77, не бÑдÑÑ ÑÑиÑÑваÑÑÑÑ, но Ñем не менее бÑдÑÑ Ð¿ÑоÑканиÑованÑ. ÐÑÐ¾Ñ Ð¸Ð½Ð´ÐµÐºÑ Ð² пÑинÑипе Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð² запÑоÑаÑ
Ñ Ð¾Ð³ÑаниÑениÑми по b и/или c, без огÑаниÑений ÑÑолбÑа a, но пÑи ÑÑом бÑÐ´ÐµÑ Ð¿ÑоÑканиÑован веÑÑ Ð¸Ð½Ð´ÐµÐºÑ, Ñак ÑÑо в болÑÑинÑÑве ÑлÑÑаев планиÑовÑик пÑедпоÑÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа полное ÑканиÑование ÑаблиÑÑ.
СоÑÑавной Ð¸Ð½Ð´ÐµÐºÑ GiST Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð² ÑÑловиÑÑ Ñ Ð»ÑбÑм подмножеÑÑвом ÑÑолбÑов индекÑа. УÑÐ»Ð¾Ð²Ð¸Ñ Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑми ÑÑолбÑами огÑаниÑиваÑÑ Ð·Ð°Ð¿Ð¸Ñи, возвÑаÑаемÑе индекÑом, но в пеÑвÑÑ Ð¾ÑеÑÐµÐ´Ñ ÑканиÑÑÐµÐ¼Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¸Ð½Ð´ÐµÐºÑа опÑеделÑеÑÑÑ Ð¾Ð³ÑаниÑением пеÑвого ÑÑолбÑа. GiST-Ð¸Ð½Ð´ÐµÐºÑ Ð±ÑÐ´ÐµÑ Ð¾ÑноÑиÑелÑно малоÑÑÑекÑивен, когда пеÑвÑй его ÑÑÐ¾Ð»Ð±ÐµÑ ÑодеÑÐ¶Ð¸Ñ ÑолÑко неÑколÑко ÑазлиÑаÑÑÐ¸Ñ ÑÑ Ð·Ð½Ð°Ñений, даже еÑли дополниÑелÑнÑе ÑÑолбÑÑ Ð´Ð°ÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво ÑазлиÑнÑÑ Ð·Ð½Ð°Ñений.
СоÑÑавной Ð¸Ð½Ð´ÐµÐºÑ GIN Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð² ÑÑловиÑÑ Ñ Ð»ÑбÑм подмножеÑÑвом ÑÑолбÑов индекÑа. РоÑлиÑие Ð¾Ñ Ð¸Ð½Ð´ÐµÐºÑов GiST или B-деÑевÑев, ÑÑÑекÑивноÑÑÑ Ð¿Ð¾Ð¸Ñка по Ð½ÐµÐ¼Ñ Ð½Ðµ менÑеÑÑÑ Ð² завиÑимоÑÑи Ð¾Ñ Ñого, какие из его ÑÑолбÑов иÑполÑзÑÑÑÑÑ Ð² ÑÑловиÑÑ Ð·Ð°Ð¿ÑоÑа.
СоÑÑавной Ð¸Ð½Ð´ÐµÐºÑ BRIN Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð² ÑÑловиÑÑ
запÑоÑа Ñ Ð»ÑбÑм подмножеÑÑвом ÑÑолбÑов индекÑа. Ðодобно индекÑÑ GIN и в оÑлиÑие Ð¾Ñ B-деÑевÑев или GiST, ÑÑÑекÑивноÑÑÑ Ð¿Ð¾Ð¸Ñка по Ð½ÐµÐ¼Ñ Ð½Ðµ менÑеÑÑÑ Ð² завиÑимоÑÑи Ð¾Ñ Ñого, какие из его ÑÑолбÑов иÑполÑзÑÑÑÑÑ Ð² ÑÑловиÑÑ
запÑоÑа. ÐдинÑÑвенное, заÑем в одной ÑаблиÑе могÑÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð½ÐµÑколÑко индекÑов BRIN вмеÑÑо одного ÑоÑÑавного индекÑа â ÑÑо заÑем, ÑÑÐ¾Ð±Ñ Ð¿ÑименÑлиÑÑ ÑазнÑе паÑамеÑÑÑ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ pages_per_range.
ÐÑи ÑÑом, ÑазÑмееÑÑÑ, каждÑй ÑÑÐ¾Ð»Ð±ÐµÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ иÑполÑзоваÑÑÑÑ Ñ Ð¾Ð¿ÐµÑаÑоÑами, ÑооÑвеÑÑÑвÑÑÑими ÑÐ¸Ð¿Ñ Ð¸Ð½Ð´ÐµÐºÑа; огÑаниÑÐµÐ½Ð¸Ñ Ñ Ð´ÑÑгими опеÑаÑоÑами ÑаÑÑмаÑÑиваÑÑÑÑ Ð½Ðµ бÑдÑÑ.
СоÑÑавнÑе индекÑÑ ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð¾Ð±Ð´Ñманно. РболÑÑинÑÑве ÑлÑÑаев Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾ Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑÑолбÑÑ Ð±ÑÐ´ÐµÑ ÑабоÑаÑÑ Ð´Ð¾ÑÑаÑоÑно Ñ Ð¾ÑоÑо и ÑÑÐºÐ¾Ð½Ð¾Ð¼Ð¸Ñ Ð²ÑÐµÐ¼Ñ Ð¸ меÑÑо. ÐндекÑÑ Ð¿Ð¾ более Ñем ÑÑÑм ÑÑолбÑам вÑÑд ли бÑдÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñми, еÑли ÑолÑко ÑаблиÑа не иÑполÑзÑеÑÑÑ ÐºÑайне однообÑазно. ÐпиÑание доÑÑоинÑÑв ÑазлиÑнÑÑ ÐºÐ¾Ð½ÑигÑÑаÑий индекÑов можно найÑи в Разделе 11.5 и Разделе 11.9.