CREATE INDEX
СинÑакÑиÑ
CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ Ð¸Ð¼Ñ ] ON table_name [ USING меÑод ]
( { имÑ_колонки | ( вÑÑажение ) } [ COLLATE пÑавило_ÑоÑÑиÑовки ] [ клаÑÑ_опеÑаÑоÑов ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )
[ WITH ( паÑамеÑÑ_Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ = знаÑение [, ... ] ) ]
[ TABLESPACE Ñабл_пÑоÑÑÑанÑÑво ]
[ WHERE пÑÐµÐ´Ð¸ÐºÐ°Ñ ]ÐпиÑание
CREATE INDEX ÑоздаÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ Ð¿Ð¾ Ñказанной колонке(ам) заданного оÑноÑениÑ, коÑоÑÑм Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑаблиÑа или маÑеÑиализованное пÑедÑÑавление. ÐндекÑÑ Ð¿ÑименÑÑÑÑÑ Ð² пеÑвÑÑ Ð¾ÑеÑÐµÐ´Ñ Ð´Ð»Ñ Ð¾Ð¿ÑимизаÑии пÑоизводиÑелÑноÑÑи Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ (Ñ Ð¾ÑÑ Ð¿Ñи непÑавилÑном иÑполÑзовании возможен и пÑоÑивоположнÑй ÑÑÑекÑ).
ÐлÑÑевое поле Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа задаÑÑÑÑ ÐºÐ°Ðº Ð¸Ð¼Ñ ÐºÐ¾Ð»Ð¾Ð½ÐºÐ¸ или вÑÑажение, заклÑÑÑнное в Ñкобки. ÐÑли меÑод индекÑа поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¼Ð½Ð¾Ð³Ð¾ÐºÐ¾Ð»Ð¾Ð½Ð¾ÑнÑе индекÑÑ, допÑÑкаеÑÑÑ Ñказание неÑколÑÐºÐ¸Ñ Ð¿Ð¾Ð»ÐµÐ¹.
Ðоле индекÑа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²ÑÑажением, вÑÑиÑлÑемÑм из знаÑений одной или неÑколÑÐºÐ¸Ñ ÐºÐ¾Ð»Ð¾Ð½Ð¾Ðº в ÑÑÑоке ÑаблиÑÑ. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð±ÑÑÑÑого доÑÑÑпа к даннÑм по некоÑоÑÐ¾Ð¼Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ÑÑ Ð¾Ð´Ð½ÑÑ Ð·Ð½Ð°Ñений. ÐапÑимеÑ, индекÑ, поÑÑÑоеннÑй по вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ upper(col), Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ Ð¸ÑполÑзоваÑÑ Ð¿Ð¾Ð¸Ñк по индекÑÑ Ð² пÑедложении WHERE upper(col) = 'JIM'.
PostgreSQL пÑедоÑÑавлÑÐµÑ ÑледÑÑÑие меÑÐ¾Ð´Ñ Ð¸Ð½Ð´ÐµÐºÑов: B-деÑево, Ñ ÐµÑ, GiST, SP-GiST и GIN. ÐолÑзоваÑели могÑÑ Ð¾Ð¿ÑеделиÑÑ Ð¸ ÑобÑÑвеннÑе меÑÐ¾Ð´Ñ Ð¸Ð½Ð´ÐµÐºÑов, но ÑÑо доволÑно ÑÐ»Ð¾Ð¶Ð½Ð°Ñ Ð·Ð°Ð´Ð°Ñа.
ÐÑли в команде пÑиÑÑÑÑÑвÑÐµÑ Ð¿Ñедложение WHERE, она ÑоздаÑÑ ÑаÑÑиÑнÑй индекÑ. Такой Ð¸Ð½Ð´ÐµÐºÑ ÑодеÑÐ¶Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи ÑолÑко Ð´Ð»Ñ ÑаÑÑи ÑаблиÑÑ, обÑÑно более полезной Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑаÑии, Ñем оÑÑалÑÐ½Ð°Ñ ÑаблиÑа. ÐапÑимеÑ, еÑли ÑаблиÑа ÑодеÑÐ¶Ð¸Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ð± оплаÑеннÑÑ Ð¸ неоплаÑеннÑÑ ÑÑеÑÐ°Ñ , пÑи ÑÑом поÑÐ»ÐµÐ´Ð½Ð¸Ñ ÑÑавниÑелÑно немного, но именно ÑÑа ÑаÑÑÑ ÑаблиÑÑ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ воÑÑÑебована, Ñо ÑвелиÑиÑÑ Ð±ÑÑÑÑодейÑÑвие можно, Ñоздав Ð¸Ð½Ð´ÐµÐºÑ ÑолÑко по ÑÑой ÑаÑÑи. ÐÑÑ Ð¾Ð´Ð½Ð¾ возможное пÑименение WHERE â добавив UNIQUE, обеÑпеÑиÑÑ ÑникалÑноÑÑÑ Ð² подмножеÑÑве ÑаблиÑÑ. ÐодÑобнее ÑÑо ÑаÑÑмаÑÑиваеÑÑÑ Ð² Разделе 11.8.
ÐÑÑажение в пÑедложении WHERE Ð¼Ð¾Ð¶ÐµÑ ÑÑÑлаÑÑÑÑ ÑолÑко на колонки нижележаÑей ÑаблиÑÑ, но не обÑзаÑелÑно огÑаниÑиваÑÑÑÑ Ñеми, по коÑоÑÑм ÑÑÑоиÑÑÑ Ð¸Ð½Ð´ÐµÐºÑ. РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð² WHERE Ñакже нелÑÐ·Ñ Ð¸ÑполÑзоваÑÑ Ð¿Ð¾Ð´Ð·Ð°Ð¿ÑоÑÑ Ð¸ агÑегаÑнÑе вÑÑажениÑ. ÐÑо же огÑаниÑение ÑаÑпÑоÑÑÑанÑеÑÑÑ Ð¸ на вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² полÑÑ Ð¸Ð½Ð´ÐµÐºÑов.
ÐÑе ÑÑнкÑии и опеÑаÑоÑÑ, иÑполÑзÑемÑе в опÑеделении индекÑа, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ "поÑÑоÑннÑми", Ñо еÑÑÑ, Ð¸Ñ ÑезÑлÑÑаÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð°Ð²Ð¸ÑеÑÑ ÑолÑко Ð¾Ñ Ð°ÑгÑменÑов, но не Ð¾Ñ Ð²Ð½ÐµÑÐ½Ð¸Ñ ÑакÑоÑов (напÑимеÑ, ÑодеÑжимого дÑÑгой ÑаблиÑÑ Ð¸Ð»Ð¸ ÑекÑÑего вÑемени). ÐÑо огÑаниÑение обеÑпеÑÐ¸Ð²Ð°ÐµÑ Ð¾Ð¿ÑеделÑнноÑÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа. ЧÑÐ¾Ð±Ñ Ð¸ÑполÑзоваÑÑ Ð² вÑÑажении индекÑа или в пÑедложении WHERE ÑобÑÑвеннÑÑ ÑÑнкÑиÑ, не забÑдÑÑе помеÑиÑÑ ÐµÑ Ð¿Ñи Ñоздании как поÑÑоÑннÑÑ.
ÐаÑамеÑÑÑ
- UNIQUE
УказÑваеÑ, ÑÑо ÑиÑÑема должна конÑÑолиÑоваÑÑ Ð¿Ð¾Ð²ÑоÑÑÑÑиеÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð² ÑаблиÑе пÑи Ñоздании индекÑа (еÑли в ÑаблиÑе Ñже еÑÑÑ Ð´Ð°Ð½Ð½Ñе) и пÑи каждом добавлении даннÑÑ . ÐопÑÑки вÑÑавиÑÑ Ð¸Ð»Ð¸ измениÑÑ Ð´Ð°Ð½Ð½Ñе, пÑи коÑоÑÑÑ Ð±ÑÐ´ÐµÑ Ð½Ð°ÑÑÑена ÑникалÑноÑÑÑ Ð¸Ð½Ð´ÐµÐºÑа, бÑдÑÑ Ð·Ð°Ð²ÐµÑÑаÑÑÑÑ Ð¾Ñибкой.
- CONCURRENTLY
С ÑÑим Ñказанием PostgreSQL поÑÑÑÐ¾Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑ, не ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°Ñ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовок, коÑоÑÑе Ð±Ñ Ð¿ÑедоÑвÑаÑали добавление, изменение или Ñдаление запиÑей в ÑаблиÑе; Ñогда как по ÑмолÑÐ°Ð½Ð¸Ñ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ð¿Ð¾ÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа блокиÑÑÐµÑ Ð·Ð°Ð¿Ð¸ÑÑ (но не ÑÑение) в ÑаблиÑе до Ñвоего завеÑÑениÑ. ÐÑи Ñоздании индекÑа в паÑаллелÑном Ñежиме еÑÑÑ ÑÑд оÑобенноÑÑей, о коÑоÑÑÑ ÑледÑÐµÑ Ð·Ð½Ð°ÑÑ — Ñм. ÐаÑаллелÑное поÑÑÑоение индекÑов.
- имÑ
ÐÐ¼Ñ Ñоздаваемого индекÑа. Указание ÑÑ ÐµÐ¼Ñ Ð¿Ñи ÑÑом не допÑÑкаеÑÑÑ; Ð¸Ð½Ð´ÐµÐºÑ Ð²Ñегда оÑноÑиÑÑÑ Ðº Ñой же ÑÑ ÐµÐ¼Ðµ, ÑÑо и ÑодиÑелÑÑÐºÐ°Ñ ÑаблиÑа. ÐÑли Ð¸Ð¼Ñ Ð¾Ð¿ÑÑено, PostgreSQL ÑоÑмиÑÑÐµÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑее Ð¸Ð¼Ñ Ð¿Ð¾ имени ÑодиÑелÑÑкой ÑаблиÑÑ Ð¸ именам индекÑиÑÑемÑÑ ÐºÐ¾Ð»Ð¾Ð½Ð¾Ðº.
- table_name
ÐÐ¼Ñ (возможно, дополненное ÑÑ ÐµÐ¼Ð¾Ð¹) индекÑиÑÑемой ÑаблиÑÑ.
- меÑод
ÐÐ¼Ñ Ð¿ÑименÑемого меÑода индекÑа. ÐозможнÑе ваÑианÑÑ: btree, hash, gist, spgist и gin. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑ Ð¼ÐµÑод btree.
- имÑ_колонки
ÐÐ¼Ñ ÐºÐ¾Ð»Ð¾Ð½ÐºÐ¸ ÑаблиÑÑ.
- вÑÑажение
ÐÑÑажение Ñ Ð¾Ð´Ð½Ð¾Ð¹ или неÑколÑкими колонками ÑаблиÑÑ. ÐбÑÑно вÑÑажение должно запиÑÑваÑÑÑÑ Ð² ÑÐºÐ¾Ð±ÐºÐ°Ñ , как показано в ÑинÑакÑиÑе командÑ. Ðднако Ñкобки можно опÑÑÑиÑÑ, еÑли вÑÑажение запиÑано в виде вÑзова ÑÑнкÑии.
- пÑавило_ÑоÑÑиÑовки
ÐÐ¼Ñ Ð¿Ñавила ÑоÑÑиÑовки, пÑименÑемого Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ÑполÑзÑеÑÑÑ Ð¿Ñавило ÑоÑÑиÑовки, заданное Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑиÑÑемой колонки, либо полÑÑенное Ð´Ð»Ñ ÑезÑлÑÑаÑа вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа. ÐндекÑÑ Ñ Ð½ÐµÑÑандаÑÑнÑми пÑавилами ÑоÑÑиÑовки могÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов, вклÑÑаÑÑÐ¸Ñ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñ Ñакими пÑавилами.
- клаÑÑ_опеÑаÑоÑов
ÐÐ¼Ñ ÐºÐ»Ð°ÑÑа опеÑаÑоÑов. ÐодÑобнее об ÑÑом ниже.
- ASC
УказÑÐ²Ð°ÐµÑ Ð¿Ð¾ÑÑдок ÑоÑÑиÑовки по возÑаÑÑÐ°Ð½Ð¸Ñ (подÑазÑмеваеÑÑÑ Ð¿Ð¾ ÑмолÑаниÑ).
- DESC
УказÑÐ²Ð°ÐµÑ Ð¿Ð¾ÑÑдок ÑоÑÑиÑовки по ÑбÑваниÑ.
- NULLS FIRST
УказÑваеÑ, ÑÑо знаÑÐµÐ½Ð¸Ñ NULL поÑле ÑоÑÑиÑовки оказÑваÑÑÑÑ Ð¿ÐµÑед оÑÑалÑнÑми. ÐÑо поведение по ÑмолÑÐ°Ð½Ð¸Ñ Ñ Ð¿Ð¾ÑÑдком ÑоÑÑиÑовки DESC.
- NULLS LAST
УказÑваеÑ, ÑÑо знаÑÐµÐ½Ð¸Ñ NULL поÑле ÑоÑÑиÑовки оказÑваÑÑÑÑ Ð¿Ð¾Ñле оÑÑалÑнÑÑ . ÐÑо поведение по ÑмолÑÐ°Ð½Ð¸Ñ Ñ Ð¿Ð¾ÑÑдком ÑоÑÑиÑовки ASC.
- паÑамеÑÑ_Ñ ÑанениÑ
ÐÐ¼Ñ ÑпеÑиÑиÑного Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа паÑамеÑÑа Ñ ÑанениÑ. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº ÐаÑамеÑÑÑ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа.
- Ñабл_пÑоÑÑÑанÑÑво
ТаблиÑное пÑоÑÑÑанÑÑво, в коÑоÑом бÑÐ´ÐµÑ Ñоздан индекÑ. ÐÑли не опÑеделено, вÑбиÑаеÑÑÑ default_tablespace, либо temp_tablespaces, пÑи Ñоздании индекÑа вÑеменной ÑаблиÑÑ.
- пÑедикаÑ
ÐÑÑажение огÑаниÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑаÑÑиÑного индекÑа.
ÐаÑамеÑÑÑ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа
ÐеобÑзаÑелÑное пÑедложение WITH опÑеделÑÐµÑ Ð¿Ð°ÑамеÑÑÑ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа. У каждого меÑода индекÑа еÑÑÑ Ñвой Ð½Ð°Ð±Ð¾Ñ Ð´Ð¾Ð¿ÑÑÑимÑÑ Ð¿Ð°ÑамеÑÑов Ñ ÑанениÑ. СледÑÑÑий паÑамеÑÑ Ð¿ÑинимаÑÑ Ð¼ÐµÑÐ¾Ð´Ñ B-деÑево, Ñ ÐµÑ, GiST и SP-GiST:
- FILLFACTOR
ФакÑÐ¾Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа опÑеделÑÐµÑ Ð² пÑоÑенÑном оÑноÑении, наÑколÑко плоÑно меÑод индекÑа бÑÐ´ÐµÑ Ð·Ð°Ð¿Ð¾Ð»Ð½ÑÑÑ ÑÑÑаниÑÑ Ð¸Ð½Ð´ÐµÐºÑа. ÐÐ»Ñ B-деÑевÑев конÑевÑе ÑÑÑаниÑÑ Ð·Ð°Ð¿Ð¾Ð»Ð½ÑÑÑÑÑ Ð´Ð¾ ÑÑого пÑоÑенÑа пÑи наÑалÑном поÑÑÑоении индекÑа и позже, пÑи ÑаÑÑиÑении индекÑа впÑаво (добавлении новÑÑ Ð½Ð°Ð¸Ð±Ð¾Ð»ÑÑÐ¸Ñ Ð·Ð½Ð°Ñений клÑÑа). ÐÑли ÑÑÑаниÑÑ Ð²Ð¿Ð¾ÑледÑÑвии оказÑваÑÑÑÑ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð½Ñми полноÑÑÑÑ, они бÑдÑÑ ÑазделенÑ, ÑÑо пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº поÑÑÐµÐ¿ÐµÐ½Ð½Ð¾Ð¼Ñ ÑÐ½Ð¸Ð¶ÐµÐ½Ð¸Ñ ÑÑÑекÑивноÑÑи индекÑа. ÐÐ»Ñ B-деÑевÑев по ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ÑполÑзÑеÑÑÑ ÑакÑÐ¾Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ 90, но его можно поменÑÑÑ Ð½Ð° лÑбое Ñелое знаÑение Ð¾Ñ 10 до 100. ФакÑÐ¾Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ, ÑавнÑй 100, полезен Ð´Ð»Ñ ÑÑаÑиÑеÑÐºÐ¸Ñ ÑÐ°Ð±Ð»Ð¸Ñ Ð¸ Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ ÑменÑÑиÑÑ ÑизиÑеÑкий ÑÐ°Ð·Ð¼ÐµÑ ÑаблиÑÑ, но Ð´Ð»Ñ Ð¸Ð½ÑенÑивно изменÑемÑÑ ÑÐ°Ð±Ð»Ð¸Ñ Ð»ÑÑÑе иÑполÑзоваÑÑ Ð¼ÐµÐ½ÑÑее знаÑение, ÑÑÐ¾Ð±Ñ ÑазделÑÑÑ ÑÑÑаниÑÑ Ð¿ÑÐ¸Ñ Ð¾Ð´Ð¸Ð»Ð¾ÑÑ Ñеже. С дÑÑгими меÑодами индекÑа ÑакÑÐ¾Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´ÐµÐ¹ÑÑвÑÐµÑ Ð¿Ð¾-дÑÑгомÑ, но пÑимеÑно в Ñом же клÑÑе; знаÑение ÑакÑоÑа Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ ÑазнÑÑ Ð¼ÐµÑодов Ñазное.
ÐндекÑÑ GiST дополниÑелÑно пÑинимаÑÑ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ:
- BUFFERING
ÐпÑеделÑеÑ, бÑÐ´ÐµÑ Ð»Ð¸ пÑи поÑÑÑоении индекÑа иÑполÑзоваÑÑÑÑ Ð±ÑÑеÑизаÑиÑ, опиÑÐ°Ð½Ð½Ð°Ñ Ð² ÐодÑазделе 56.4.1. Со знаÑением OFF она оÑклÑÑена, Ñ ON â вклÑÑена, а Ñ AUTO â оÑклÑÑена внаÑале, но Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ñем вклÑÑиÑÑÑÑ Ð½Ð° Ñ Ð¾Ð´Ñ, как ÑолÑко ÑÐ°Ð·Ð¼ÐµÑ Ð¸Ð½Ð´ÐµÐºÑа доÑÑÐ¸Ð³Ð½ÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ effective_cache_size. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑ AUTO.
ÐндекÑÑ GIN пÑинимаÑÑ Ð´ÑÑгой паÑамеÑÑ:
- FASTUPDATE
ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ ÑпÑавлÑÐµÑ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð¾Ð¼ бÑÑÑÑого обновлениÑ, опиÑаннÑм в ÐодÑазделе 58.4.1. Ðн Ð¸Ð¼ÐµÐµÑ Ð»Ð¾Ð³Ð¸ÑеÑкое знаÑение: ON вклÑÑÐ°ÐµÑ Ð±ÑÑÑÑое обновление, OFF оÑклÑÑÐ°ÐµÑ ÐµÐ³Ð¾. (ÐÑÑгие возможнÑе напиÑÐ°Ð½Ð¸Ñ ON и OFF пеÑеÑиÑÐ»ÐµÐ½Ñ Ð² Разделе 18.1.) ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ â ON.
ÐамеÑание: ÐÑклÑÑение FASTUPDATE в ALTER INDEX пÑедоÑвÑаÑÐ°ÐµÑ Ð¿Ð¾Ð¼ÐµÑение добавлÑемÑÑ Ð² далÑнейÑем ÑÑÑок в ÑпиÑок запиÑей, ожидаÑÑÐ¸Ñ Ð¸Ð½Ð´ÐµÐºÑаÑии, но запиÑи, добавленнÑе в ÑÑÐ¾Ñ ÑпиÑок Ñанее, в нÑм оÑÑаÑÑÑÑ. ЧÑÐ¾Ð±Ñ Ð¾ÑиÑÑиÑÑ Ð¾ÑеÑÐµÐ´Ñ Ð¾Ð¿ÐµÑаÑий, надо заÑем вÑполниÑÑ VACUUM Ð´Ð»Ñ ÑÑой ÑаблиÑÑ.
ÐаÑаллелÑное поÑÑÑоение индекÑов
Создание индекÑа Ð¼Ð¾Ð¶ÐµÑ Ð¼ÐµÑаÑÑ Ð¾Ð±ÑÑной ÑабоÑе Ñ Ð±Ð°Ð·Ð¾Ð¹ даннÑÑ . ÐбÑÑно PostgreSQL блокиÑÑÐµÑ Ð¸Ð½Ð´ÐµÐºÑиÑÑемÑÑ ÑаблиÑÑ Ð¾Ñ Ð·Ð°Ð¿Ð¸Ñи и вÑполнÑÐµÑ Ð²ÑÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ð¿Ð¾ÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа за одно ÑканиÑование ÑаблиÑÑ. ÐÑÑгие ÑÑанзакÑии могÑÑ Ð¿ÑодолжаÑÑ ÑиÑаÑÑ ÑаблиÑÑ, но пÑи попÑÑке вÑÑавиÑÑ, измениÑÑ Ð¸Ð»Ð¸ ÑдалиÑÑ ÑÑÑоки в ÑаблиÑе они бÑдÑÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²Ð°Ð½Ñ Ð´Ð¾ завеÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾ÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð¾ÐºÐ°Ð·Ð°ÑÑ Ð½ÐµÐ¶ÐµÐ»Ð°ÑелÑное влиÑние на ÑабоÑÑ Ð¿ÑоизводÑÑвенной Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐндекÑаÑÐ¸Ñ Ð¾ÑÐµÐ½Ñ Ð±Ð¾Ð»ÑÑÐ¸Ñ ÑÐ°Ð±Ð»Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð½Ð¸Ð¼Ð°ÑÑ Ð¼Ð½Ð¾Ð³Ð¾ ÑаÑов, и даже Ð´Ð»Ñ Ð¼Ð°Ð»ÐµÐ½ÑÐºÐ¸Ñ ÑÐ°Ð±Ð»Ð¸Ñ Ð¿Ð¾ÑÑÑоение индекÑа Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸ÑоваÑÑ Ð·Ð°Ð¿Ð¸ÑÑваÑÑие пÑоÑеÑÑÑ Ð½Ð° вÑемÑ, непÑиемлемое Ð´Ð»Ñ Ð¿ÑоизводÑÑвенной ÑиÑÑемÑ.
PostgreSQL поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿Ð¾ÑÑÑоение индекÑов без блокиÑовки запиÑи. ÐÑÐ¾Ñ Ð¼ÐµÑод вÑбиÑаеÑÑÑ Ñказанием CONCURRENTLY ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE INDEX. Ðогда он иÑполÑзÑеÑÑÑ, PostgreSQL должен вÑполниÑÑ Ð´Ð²Ð° ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑаблиÑÑ, а кÑоме Ñого, должен дождаÑÑÑÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ Ð²ÑÐµÑ ÑÑÑеÑÑвÑÑÑÐ¸Ñ ÑÑанзакÑий, коÑоÑÑе поÑенÑиалÑно могÑÑ Ð¸ÑполÑзоваÑÑ ÑÑÐ¾Ñ Ð¸Ð½Ð´ÐµÐºÑ. Таким обÑазом, ÑÑа пÑоÑедÑÑа ÑÑебÑÐµÑ Ð¿ÑоделаÑÑ Ð² ÑÑмме болÑÑе дейÑÑвий и вÑполнÑеÑÑÑ Ð·Ð½Ð°ÑиÑелÑно долÑÑе, Ñем обÑÑное поÑÑÑоение индекÑа. Ðднако благодаÑÑ ÑомÑ, ÑÑо ÑÑÐ¾Ñ Ð¼ÐµÑод позволÑÐµÑ Ð¿ÑодолжаÑÑ Ð¾Ð±ÑÑнÑÑ ÑабоÑÑ Ñ Ð±Ð°Ð·Ð¾Ð¹ во вÑÐµÐ¼Ñ Ð¿Ð¾ÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа, он оказÑваеÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñм в пÑоизводÑÑвенной ÑÑеде. ХоÑÑ ÑазÑмееÑÑÑ, дополниÑелÑÐ½Ð°Ñ Ð½Ð°Ð³ÑÑзка на пÑоÑеÑÑÐ¾Ñ Ð¸ подÑиÑÑÐµÐ¼Ñ Ð²Ð²Ð¾Ð´Ð°/вÑвода, ÑÐ¾Ð·Ð´Ð°Ð²Ð°ÐµÐ¼Ð°Ñ Ð¿Ñи поÑÑÑоении индекÑа, Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к Ð·Ð°Ð¼ÐµÐ´Ð»ÐµÐ½Ð¸Ñ Ð´ÑÑÐ³Ð¸Ñ Ð¾Ð¿ÐµÑаÑий.
ÐÑи паÑаллелÑном поÑÑÑоении индекÑа он Ð¿Ð¾Ð¿Ð°Ð´Ð°ÐµÑ Ð² ÑиÑÑемнÑй каÑалог в одной ÑÑанзакÑии, заÑем еÑÑ Ð´Ð²Ð° ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑаблиÑÑ Ð²ÑполнÑÑÑÑÑ Ð² двÑÑ Ð´ÑÑÐ³Ð¸Ñ ÑÑанзакÑиÑÑ . ÐÑÐ±Ð°Ñ ÑÑанзакÑиÑ, акÑÐ¸Ð²Ð½Ð°Ñ Ð² Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ñала вÑоÑого ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑаблиÑÑ, Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸ÑоваÑÑ Ð¿Ð°ÑаллелÑное Ñоздание индекÑа до Ñвоего оконÑаниÑ, даже еÑли ÑÑа ÑÑанзакÑÐ¸Ñ Ð¾Ð±ÑаÑилаÑÑ Ðº ÑаблиÑе Ñже поÑле наÑала вÑоÑого ÑканиÑованиÑ. ÐÑоÑедÑÑа паÑаллелÑного ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа поÑледоваÑелÑно Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ Ð²ÑÐµÑ ÑÑаÑÑÑ ÑÑанзакÑий, пÑименÑÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´, опиÑаннÑй в Ñазделе Раздел 48.60.
ÐÑли пÑи ÑканиÑовании ÑаблиÑÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¿Ñоблема, напÑÐ¸Ð¼ÐµÑ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð±Ð»Ð¾ÐºÐ¸Ñовка или наÑÑÑение ÑникалÑноÑÑи в ÑникалÑном индекÑе, команда CREATE INDEX завеÑÑиÑÑÑ Ð¾Ñибкой, но оÑÑÐ°Ð²Ð¸Ñ Ð¿Ð¾Ñле ÑÐµÐ±Ñ "неÑабоÑий" индекÑ. ÐÑÐ¾Ñ Ð¸Ð½Ð´ÐµÐºÑ Ð±ÑÐ´ÐµÑ Ð¸Ð³Ð½Ð¾ÑиÑоваÑÑÑÑ Ð¿Ñи ÑÑении даннÑÑ , Ñак как он Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÐ¿Ð¾Ð»Ð½Ñм; однако Ñ Ð½Ð¸Ð¼ могÑÑ Ð±ÑÑÑ ÑвÑÐ·Ð°Ð½Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе опеÑаÑии пÑи изменениÑÑ . Ð psql вÑÑÑÐ¾ÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° \d помеÑÐ°ÐµÑ Ñакой Ð¸Ð½Ð´ÐµÐºÑ ÐºÐ°Ðº INVALID:
postgres=# \d tab
Table "public.tab"
Column | Type | Modifiers
--------+---------+-----------
col | integer |
Indexes:
"idx" btree (col) INVALIDРекомендÑемÑй в ÑÐ°ÐºÐ¸Ñ ÑлÑÑаÑÑ ÑпоÑоб иÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑиÑÑаÑии â ÑдалиÑÑ Ð¸Ð½Ð´ÐµÐºÑ Ð¸ заÑем попÑÑаÑÑÑÑ Ñнова вÑполниÑÑ CREATE INDEX CONCURRENTLY. (ÐÑоме Ñого, можно пеÑеÑÑÑоиÑÑ ÐµÐ³Ð¾ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ REINDEX. Ðо Ñак как REINDEX не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿Ð°ÑаллелÑнÑй Ñежим, вÑÑд ли ÑÑÐ¾Ñ Ð²Ð°ÑÐ¸Ð°Ð½Ñ Ð±ÑÐ´ÐµÑ Ð¶ÐµÐ»Ð°ÑелÑнÑм.)
ÐÑÑ Ð¾Ð´Ð½Ð° ÑложноÑÑÑ, Ñ ÐºÐ¾ÑоÑой можно ÑÑолкнÑÑÑÑÑ Ð¿Ñи паÑаллелÑном поÑÑÑоении ÑникалÑного индекÑа, заклÑÑаеÑÑÑ Ð² Ñом, ÑÑо огÑаниÑение ÑникалÑноÑÑи Ñже влиÑÐµÑ Ð½Ð° дÑÑгие ÑÑанзакÑии, когда вÑоÑое ÑканиÑование ÑаблиÑÑ ÑолÑко наÑинаеÑÑÑ. ÐÑо знаÑиÑ, ÑÑо наÑÑÑÐµÐ½Ð¸Ñ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¿ÑоÑвлÑÑÑÑÑ Ð² дÑÑÐ³Ð¸Ñ Ð·Ð°Ð¿ÑоÑÐ°Ñ Ð´Ð¾ Ñого, как Ð¸Ð½Ð´ÐµÐºÑ ÑÑановиÑÑÑ Ð´Ð¾ÑÑÑпнÑм Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ даже Ñогда, когда ÑоздаÑÑ Ð¸Ð½Ð´ÐµÐºÑ Ð² иÑоге не ÑдаÑÑÑÑ. ÐÑоме Ñого, еÑли пÑи вÑоÑом ÑканиÑовании пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð¾Ñибка, "неÑабоÑий" Ð¸Ð½Ð´ÐµÐºÑ Ð¾ÑÑавлÑÐµÑ Ð² Ñиле ÑÐ²Ð¾Ñ Ð¾Ð³ÑаниÑение ÑникалÑноÑÑи и далÑÑе.
ÐеÑод паÑаллелÑного поÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ Ñакже индекÑÑ Ð²ÑÑажений и ÑаÑÑиÑнÑе индекÑÑ. ÐÑибки, пÑоизоÑедÑие пÑи вÑÑиÑлении ÑÑÐ¸Ñ Ð²ÑÑажений, могÑÑ Ð¿ÑивеÑÑи к ÑÐ°ÐºÐ¾Ð¼Ñ Ð¶Ðµ поведениÑ, как в вÑÑеопиÑаннÑÑ ÑлÑÑаÑÑ Ñ Ð½Ð°ÑÑÑением огÑаниÑений ÑникалÑноÑÑи.
ÐбÑÑное поÑÑÑоение индекÑа допÑÑÐºÐ°ÐµÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменное поÑÑÑоение дÑÑÐ³Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑов обÑÑнÑм меÑодом, но паÑаллелÑное поÑÑÑоение в один Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ñемени допÑÑкаеÑÑÑ ÑолÑко одно. Ð Ð¾Ð±Ð¾Ð¸Ñ ÑлÑÑаÑÑ , никакие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñипов в ÑÑ ÐµÐ¼Ðµ ÑаблиÑÑ Ð² ÑÑо вÑÐµÐ¼Ñ Ð½Ðµ ÑазÑеÑаÑÑÑÑ. ÐÑÑгое оÑлиÑие ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо в блоке ÑÑанзакÑии Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ñполнена обÑÑÐ½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° CREATE INDEX, но не CREATE INDEX CONCURRENTLY.
ÐамеÑаниÑ
ÐнÑоÑмаÑÐ¸Ñ Ð¾ Ñом, когда могÑÑ Ð¿ÑименÑÑÑÑÑ, и когда не пÑименÑÑÑÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ, и в ÐºÐ°ÐºÐ¸Ñ ÐºÐ¾Ð½ÐºÑеÑнÑÑ ÑиÑÑаÑиÑÑ Ð¾Ð½Ð¸ могÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ, можно найÑи в Ðлаве 11.
| ÐÑедоÑÑеÑежение |
ÐпеÑаÑии Ñ Ñ ÐµÑ-индекÑами в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð½Ðµ пÑÐ¾Ñ Ð¾Ð´ÑÑ ÑеÑез WAL, Ñак ÑÑо поÑле аваÑийной оÑÑановки Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð¿ÐµÑеÑÑÑоиÑÑ Ñ ÐµÑ-индекÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ REINDEX. ÐÑоме Ñого, Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² Ñ ÐµÑ-индекÑÐ°Ñ Ð¿Ð¾Ñле наÑалÑной копии не пеÑеноÑÑÑÑÑ Ð¿Ñи поÑоковой или Ñайловой ÑепликаÑии, Ñак ÑÑо в поÑледÑÑÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑÐ°Ñ Ð¾Ð½Ð¸ бÑдÑÑ Ð´Ð°Ð²Ð°ÑÑ Ð½ÐµÐ¿ÑавилÑнÑе оÑвеÑÑ. Ðо ÑÑим пÑиÑинам наÑÑоÑÑелÑно ÑекомендÑеÑÑÑ Ð½Ðµ иÑполÑзоваÑÑ Ð¸Ñ . |
РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð¼Ð½Ð¾Ð³Ð¾ÐºÐ¾Ð»Ð¾Ð½Ð¾ÑнÑе индекÑÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ ÑолÑко меÑÐ¾Ð´Ñ B-деÑево, GiST и GIN. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ñакой Ð¸Ð½Ð´ÐµÐºÑ Ð¼Ð¾Ð¶ÐµÑ Ð²ÐºÐ»ÑÑаÑÑ Ð´Ð¾ 32 полей. (ÐÑÐ¾Ñ Ð¿Ñедел можно измениÑÑ, пеÑеÑобÑав PostgreSQL.) УникалÑнÑе индекÑÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑолÑко B-деÑево.
ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ колонки индекÑа можно задаÑÑ ÐºÐ»Ð°ÑÑ Ð¾Ð¿ÐµÑаÑоÑов. ÐÑÐ¾Ñ ÐºÐ»Ð°ÑÑ Ð¾Ð¿ÑеделÑеÑ, какие опеÑаÑоÑÑ Ð±ÑдÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð¸Ð½Ð´ÐµÐºÑом Ð´Ð»Ñ ÑÑой колонки. ÐапÑимеÑ, индекÑ-B-деÑево по ÑеÑÑÑÑÑ Ð±Ð°Ð¹ÑовÑм ÑелÑм бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ ÐºÐ»Ð°ÑÑ int4_ops; ÑÑÐ¾Ñ ÐºÐ»Ð°ÑÑ Ð¾Ð¿ÐµÑаÑоÑов вклÑÑÐ°ÐµÑ ÑÑнкÑии ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑÐ°ÐºÐ¸Ñ Ð·Ð½Ð°Ñений. Ðа пÑакÑике обÑÑно доÑÑаÑоÑно иÑполÑзоваÑÑ ÐºÐ»Ð°ÑÑ Ð¾Ð¿ÐµÑаÑоÑов по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ñипа даннÑÑ ÐºÐ¾Ð»Ð¾Ð½ÐºÐ¸. СÑÑеÑÑвование клаÑÑов опеÑаÑоÑов обÑÑÑнÑеÑÑÑ Ð² пеÑвÑÑ Ð¾ÑеÑÐµÐ´Ñ Ñем, ÑÑо Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ Ñипов даннÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ пÑедложиÑÑ Ð±Ð¾Ð»ÐµÐµ одного оÑмÑÑленного поÑÑдка ÑоÑÑиÑовки. ÐапÑимеÑ, Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÑÑÑ Ð¶ÐµÐ»Ð°Ð½Ð¸Ðµ оÑÑоÑÑиÑоваÑÑ ÐºÐ¾Ð¼Ð¿Ð»ÐµÐºÑнÑе ÑиÑла как по абÑолÑÑÐ½Ð¾Ð¼Ñ Ð·Ð½Ð°ÑениÑ, Ñак и по веÑеÑÑвенной ÑаÑÑи. ÐÑо можно ÑделаÑÑ, опÑеделив два клаÑÑа опеÑаÑоÑов Ð´Ð»Ñ Ñипа даннÑÑ Ð¸ вÑбÑав Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑий клаÑÑ Ð¿Ñи Ñоздании индекÑа. Ðа дополниÑелÑнÑми ÑведениÑми о клаÑÑÐ°Ñ Ð¾Ð¿ÐµÑаÑоÑов обÑаÑиÑеÑÑ Ðº Ð Ð°Ð·Ð´ÐµÐ»Ñ 11.9 и Ð Ð°Ð·Ð´ÐµÐ»Ñ 35.14.
ÐÐ»Ñ Ð¼ÐµÑодов индекÑа, поддеÑживаÑÑÐ¸Ñ ÑканиÑование по поÑÑÐ´ÐºÑ (в наÑÑоÑÑее вÑÐµÐ¼Ñ ÑÑо поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑолÑко B-деÑево), можно измениÑÑ Ð¿Ð¾ÑÑдок ÑоÑÑиÑовки индекÑа, добавив необÑзаÑелÑнÑе пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ASC, DESC, NULLS FIRST или NULLS LAST. Так как ÑпоÑÑдоÑеннÑй Ð¸Ð½Ð´ÐµÐºÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑканиÑоваÑÑ Ð²Ð¿ÐµÑÑд или назад, обÑÑно не Ð¸Ð¼ÐµÐµÑ ÑмÑÑла ÑоздаваÑÑ Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾ ÑбÑÐ²Ð°Ð½Ð¸Ñ (DESC) Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ колонки — ÑÑÐ¾Ñ Ð¿Ð¾ÑÑдок ÑоÑÑиÑовки можно полÑÑиÑÑ Ð¸ Ñ Ð¾Ð±ÑÑнÑм индекÑом. ÐÑи паÑамеÑÑÑ Ð¸Ð¼ÐµÑÑ ÑмÑÑл пÑи Ñоздании многоколоноÑнÑÑ Ð¸Ð½Ð´ÐµÐºÑов Ñак, ÑÑо они бÑдÑÑ ÑооÑвеÑÑÑвоваÑÑ Ð¿Ð¾ÑÑÐ´ÐºÑ ÑоÑÑиÑовки, ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ Ð² запÑоÑе Ñо ÑмеÑаннÑм поÑÑдком, напÑÐ¸Ð¼ÐµÑ SELECT ... ORDER BY x ASC, y DESC. ÐаÑамеÑÑÑ NULLS полезнÑ, когда ÑÑебÑеÑÑÑ ÑеализоваÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ "NULL внизÑ", изменив ÑÑандаÑÑное "NULL ввеÑÑ Ñ", в запÑоÑÐ°Ñ , завиÑÑÑÐ¸Ñ Ð¾Ñ Ð¸Ð½Ð´ÐµÐºÑов, ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑной ÑоÑÑиÑовки.
ÐÐ»Ñ Ð±Ð¾Ð»ÑÑинÑÑва меÑодов индекÑов ÑкоÑоÑÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа завиÑÐ¸Ñ Ð¾Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ maintenance_work_mem. ÐÑи ÑвелиÑении ÑÑого знаÑÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑ Ð±ÑÐ´ÐµÑ ÑоздаваÑÑÑÑ Ð±ÑÑÑÑее, пока оно не пÑевÑÑÐ¸Ñ Ð´ÐµÐ¹ÑÑвиÑелÑно доÑÑÑпнÑй обÑÑм памÑÑи, ÑÑо пÑиведÑÑ Ðº иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÐºÐ°Ñки. ÐÐ»Ñ Ñ ÐµÑ-индекÑов знаÑение effective_cache_size Ñакже влиÑÐµÑ Ð½Ð° вÑÐµÐ¼Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа: PostgreSQL бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ Ð¾Ð´Ð¸Ð½ из двÑÑ ÑазлиÑнÑÑ Ð¼ÐµÑодов ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа, в завиÑимоÑÑи Ð¾Ñ Ñого, болÑÑе или менÑÑе оÑениваемÑй ÑÐ°Ð·Ð¼ÐµÑ Ð¸Ð½Ð´ÐµÐºÑа, Ñем effective_cache_size. ÐÐ»Ñ Ð½Ð°Ð¸Ð»ÑÑÑÐ¸Ñ ÑезÑлÑÑаÑов ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð½Ñжно ÑÑÑанавливаÑÑ Ð² завиÑимоÑÑи Ð¾Ñ Ð¾Ð±ÑÑма Ñвободной памÑÑи, но Ñак, ÑÑÐ¾Ð±Ñ ÑÑмма maintenance_work_mem и effective_cache_size бÑла менÑÑе обÑÑма ÐÐУ за вÑÑеÑом обÑÑма, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾Ð³Ð¾ дÑÑгим пÑогÑаммам.
ÐÐ»Ñ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа пÑименÑеÑÑÑ DROP INDEX.
РпÑедÑдÑÑÐ¸Ñ Ð²ÑпÑÑÐºÐ°Ñ PostgreSQL Ñакже поддеÑживалÑÑ Ð¼ÐµÑод индекÑа R-деÑево. СейÑÐ°Ñ Ð¾Ð½ оÑÑÑÑÑÑвÑеÑ, Ñак как он не даÑÑ Ð·Ð½Ð°ÑиÑелÑнÑÑ Ð¿ÑеимÑÑеÑÑв по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ GiST. Указание USING rtree команда CREATE INDEX бÑÐ´ÐµÑ Ð¸Ð½ÑеÑпÑеÑиÑоваÑÑ ÐºÐ°Ðº USING gist, Ð´Ð»Ñ ÑпÑоÑÐµÐ½Ð¸Ñ Ð¿ÐµÑевода ÑÑаÑÑÑ Ð±Ð°Ð· на GiST.
ÐÑимеÑÑ
Создание индекÑа-B-деÑева по колонке title в ÑаблиÑе films:
CREATE UNIQUE INDEX title_idx ON films (title);
Создание индекÑа по вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ lower(title), позволÑÑÑего ÑÑÑекÑивно вÑполнÑÑÑ ÑегиÑÑÑонезавиÑимÑй поиÑк:
CREATE INDEX ON films ((lower(title)));
(Ð ÑÑом пÑимеÑе Ð¼Ñ ÑеÑили опÑÑÑиÑÑ Ð¸Ð¼Ñ Ð¸Ð½Ð´ÐµÐºÑа, ÑÑÐ¾Ð±Ñ Ð¸Ð¼Ñ Ð²ÑбÑала ÑиÑÑема, напÑÐ¸Ð¼ÐµÑ films_lower_idx.)
Создание индекÑа Ñ Ð½ÐµÑÑандаÑÑнÑм пÑавилом ÑоÑÑиÑовки:
CREATE INDEX title_idx_german ON films (title COLLATE "de_DE");
Создание индекÑа Ñ Ð½ÐµÑÑандаÑÑнÑм поÑÑдком знаÑений NULL:
CREATE INDEX title_idx_nulls_low ON films (title NULLS FIRST);
Создание индекÑа Ñ Ð½ÐµÑÑандаÑÑнÑм ÑакÑоÑом заполнениÑ:
CREATE UNIQUE INDEX title_idx ON films (title) WITH (fillfactor = 70);
Создание индекÑа GIN Ñ Ð¾ÑклÑÑÑннÑм Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð¾Ð¼ бÑÑÑÑого обновлениÑ:
CREATE INDEX gin_idx ON documents_table USING gin (locations) WITH (fastupdate = off);
Создание индекÑа по колонке code в ÑаблиÑе films и ÑазмеÑение его в ÑаблиÑном пÑоÑÑÑанÑÑве indexspace:
CREATE INDEX code_idx ON films (code) TABLESPACE indexspace;
Создание индекÑа GiST по кооÑдинаÑам ÑоÑек, позволÑÑÑего ÑÑÑекÑивно иÑполÑзоваÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ box Ñ ÑезÑлÑÑаÑом ÑÑнкÑии пÑеобÑазованиÑ:
CREATE INDEX pointloc
ON points USING gist (box(location,location));
SELECT * FROM points
WHERE box(location,location) && '(0,0),(1,1)'::box;Создание индекÑа без блокиÑовки запиÑи в ÑаблиÑÑ:
CREATE INDEX CONCURRENTLY sales_quantity_index ON sales_table (quantity);
СовмеÑÑимоÑÑÑ
CREATE INDEX ÑвлÑеÑÑÑ ÑзÑковÑм ÑаÑÑиÑением PostgreSQL. СÑедÑÑва обеÑпеÑÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑов в ÑÑандаÑÑе SQL не опиÑанÑ.
| ÐÑед. | ÐаÑало | След. |
| CREATE GROUP | УÑÐ¾Ð²ÐµÐ½Ñ Ð²ÑÑе | CREATE LANGUAGE |