CREATE INDEX
CREATE INDEX â ÑоздаÑÑ Ð¸Ð½Ð´ÐµÐºÑ
СинÑакÑиÑ
CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ]имÑ] ON [ ONLY ]имÑ_ÑаблиÑÑ[ USINGмеÑод] ( {имÑ_ÑÑолбÑа| (вÑÑажение) } [ COLLATEпÑавило_ÑоÑÑиÑовки] [клаÑÑ_опеÑаÑоÑов[ (паÑамеÑÑ_клаÑÑа_оп=знаÑение[, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] ) [ INCLUDE (имÑ_ÑÑолбÑа[, ...] ) ] [ NULLS [ NOT ] DISTINCT ] [ WITH (паÑамеÑÑ_Ñ ÑанениÑ[=знаÑение] [, ... ] ) ] [ TABLESPACEÑабл_пÑоÑÑÑанÑÑво] [ WHEREпÑедикаÑ]
ÐпиÑание
CREATE INDEX ÑоздаÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ Ð¿Ð¾ ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ ÑÑолбÑÑ(ам) заданного оÑноÑениÑ, коÑоÑÑм Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑаблиÑа или маÑеÑиализованное пÑедÑÑавление. ÐндекÑÑ Ð¿ÑименÑÑÑÑÑ Ð² пеÑвÑÑ Ð¾ÑеÑÐµÐ´Ñ Ð´Ð»Ñ Ð¾Ð¿ÑимизаÑии пÑоизводиÑелÑноÑÑи Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
(Ñ
оÑÑ Ð¿Ñи непÑавилÑном иÑполÑзовании возможен и пÑоÑивоположнÑй ÑÑÑекÑ).
ÐлÑÑевое поле Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа задаÑÑÑÑ ÐºÐ°Ðº Ð¸Ð¼Ñ ÑÑолбÑа или вÑÑажение, заклÑÑÑнное в Ñкобки. ÐÑли меÑод индекÑа поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑоÑÑавнÑе индекÑÑ, допÑÑкаеÑÑÑ Ñказание неÑколÑÐºÐ¸Ñ Ð¿Ð¾Ð»ÐµÐ¹.
Ðоле индекÑа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²ÑÑажением, вÑÑиÑлÑемÑм из знаÑений одного или неÑколÑкиÑ
ÑÑолбÑов в ÑÑÑоке ÑаблиÑÑ. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð±ÑÑÑÑого доÑÑÑпа к даннÑм по некоÑоÑÐ¾Ð¼Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ÑÑ
однÑÑ
знаÑений. ÐапÑимеÑ, индекÑ, поÑÑÑоеннÑй по вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ upper(col), Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ Ð¸ÑполÑзоваÑÑ Ð¿Ð¾Ð¸Ñк по индекÑÑ Ð² пÑедложении WHERE upper(col) = 'JIM'.
PostgreSQL пÑедоÑÑавлÑÐµÑ ÑледÑÑÑие меÑÐ¾Ð´Ñ Ð¸Ð½Ð´ÐµÐºÑов: B-деÑево, Ñ ÐµÑ, GiST, SP-GiST, GIN и BRIN. ÐолÑзоваÑели могÑÑ Ð¾Ð¿ÑеделиÑÑ Ð¸ ÑобÑÑвеннÑе меÑÐ¾Ð´Ñ Ð¸Ð½Ð´ÐµÐºÑов, но ÑÑо доволÑно ÑÐ»Ð¾Ð¶Ð½Ð°Ñ Ð·Ð°Ð´Ð°Ñа.
ÐÑли в команде пÑиÑÑÑÑÑвÑÐµÑ Ð¿Ñедложение WHERE, она ÑоздаÑÑ ÑаÑÑиÑнÑй индекÑ. Такой Ð¸Ð½Ð´ÐµÐºÑ ÑодеÑÐ¶Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи ÑолÑко Ð´Ð»Ñ ÑаÑÑи ÑаблиÑÑ, обÑÑно более полезной Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑаÑии, Ñем оÑÑалÑÐ½Ð°Ñ ÑаблиÑа. ÐапÑимеÑ, еÑли ÑаблиÑа ÑодеÑÐ¶Ð¸Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ð± оплаÑеннÑÑ
и неоплаÑеннÑÑ
ÑÑеÑаÑ
, пÑи ÑÑом поÑледниÑ
ÑÑавниÑелÑно немного, но именно ÑÑа ÑаÑÑÑ ÑаблиÑÑ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ воÑÑÑебована, Ñо ÑвелиÑиÑÑ Ð±ÑÑÑÑодейÑÑвие можно, Ñоздав Ð¸Ð½Ð´ÐµÐºÑ ÑолÑко по ÑÑой ÑаÑÑи. ÐÑÑ Ð¾Ð´Ð½Ð¾ возможное пÑименение WHERE â добавив UNIQUE, обеÑпеÑиÑÑ ÑникалÑноÑÑÑ Ð² подмножеÑÑве ÑаблиÑÑ. ÐодÑобнее ÑÑо ÑаÑÑмаÑÑиваеÑÑÑ Ð² Разделе 11.8.
ÐÑÑажение в пÑедложении WHERE Ð¼Ð¾Ð¶ÐµÑ ÑÑÑлаÑÑÑÑ ÑолÑко на ÑÑолбÑÑ Ð½Ð¸Ð¶ÐµÐ»ÐµÐ¶Ð°Ñей ÑаблиÑÑ, но не обÑзаÑелÑно огÑаниÑиваÑÑÑÑ Ñеми, по коÑоÑÑм ÑÑÑоиÑÑÑ Ð¸Ð½Ð´ÐµÐºÑ. РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð² WHERE Ñакже нелÑÐ·Ñ Ð¸ÑполÑзоваÑÑ Ð¿Ð¾Ð´Ð·Ð°Ð¿ÑоÑÑ Ð¸ агÑегаÑнÑе вÑÑажениÑ. ÐÑо же огÑаниÑение ÑаÑпÑоÑÑÑанÑеÑÑÑ Ð¸ на вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² полÑÑ
индекÑов.
ÐÑе ÑÑнкÑии и опеÑаÑоÑÑ, иÑполÑзÑемÑе в опÑеделении индекÑа, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Â«Ð¿Ð¾ÑÑоÑннÑми», Ñо еÑÑÑ, иÑ
ÑезÑлÑÑаÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð°Ð²Ð¸ÑеÑÑ ÑолÑко Ð¾Ñ Ð°ÑгÑменÑов, но не Ð¾Ñ Ð²Ð½ÐµÑниÑ
ÑакÑоÑов (напÑимеÑ, ÑодеÑжимого дÑÑгой ÑаблиÑÑ Ð¸Ð»Ð¸ ÑекÑÑего вÑемени). ÐÑо огÑаниÑение обеÑпеÑÐ¸Ð²Ð°ÐµÑ Ð¾Ð¿ÑеделÑнноÑÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа. ЧÑÐ¾Ð±Ñ Ð¸ÑполÑзоваÑÑ Ð² вÑÑажении индекÑа или в пÑедложении WHERE ÑобÑÑвеннÑÑ ÑÑнкÑиÑ, не забÑдÑÑе помеÑиÑÑ ÐµÑ Ð¿Ñи Ñоздании как поÑÑоÑннÑÑ (IMMUTABLE).
ÐаÑамеÑÑÑ
UNIQUEУказÑваеÑ, ÑÑо ÑиÑÑема должна конÑÑолиÑоваÑÑ Ð¿Ð¾Ð²ÑоÑÑÑÑиеÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð² ÑаблиÑе пÑи Ñоздании индекÑа (еÑли в ÑаблиÑе Ñже еÑÑÑ Ð´Ð°Ð½Ð½Ñе) и пÑи каждом добавлении даннÑÑ . ÐопÑÑки вÑÑавиÑÑ Ð¸Ð»Ð¸ измениÑÑ Ð´Ð°Ð½Ð½Ñе, пÑи коÑоÑÑÑ Ð±ÑÐ´ÐµÑ Ð½Ð°ÑÑÑена ÑникалÑноÑÑÑ Ð¸Ð½Ð´ÐµÐºÑа, бÑдÑÑ Ð·Ð°Ð²ÐµÑÑаÑÑÑÑ Ð¾Ñибкой.
Ðогда ÑникалÑнÑе индекÑÑ Ð¿ÑименÑÑÑÑÑ Ðº ÑекÑиониÑованнÑм ÑаблиÑам, дейÑÑвÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе огÑаниÑениÑ; Ñм. CREATE TABLE.
CONCURRENTLYС ÑÑим Ñказанием PostgreSQL поÑÑÑÐ¾Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑ, не ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°Ñ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовок, коÑоÑÑе Ð±Ñ Ð¿ÑедоÑвÑаÑали добавление, изменение или Ñдаление запиÑей в ÑаблиÑе, Ñогда как по ÑмолÑÐ°Ð½Ð¸Ñ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ð¿Ð¾ÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа блокиÑÑÐµÑ Ð·Ð°Ð¿Ð¸ÑÑ (но не ÑÑение) даннÑÑ Ð² ÑаблиÑе до Ñвоего завеÑÑениÑ. С Ñозданием индекÑа в ÑÑом Ñежиме ÑвÑзан ÑÑд оÑобенноÑÑей, о коÑоÑÑÑ ÑледÑÐµÑ Ð·Ð½Ð°ÑÑ, â Ñм. ÐеблокиÑÑÑÑее поÑÑÑоение индекÑов.
ÐÐ»Ñ Ð²ÑеменнÑÑ ÑаблиÑ
CREATE INDEXвÑегда вÑполнÑеÑÑÑ Ð±Ð¾Ð»ÐµÐµ пÑоÑÑÑм, неблокиÑÑÑÑим ÑпоÑобом, Ñак как они не могÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ð¼Ð¸ дÑÑгими ÑеанÑами.IF NOT EXISTSÐе ÑÑиÑаÑÑ Ð¾Ñибкой, еÑли Ð¸Ð½Ð´ÐµÐºÑ Ñ Ñаким именем Ñже ÑÑÑеÑÑвÑеÑ. Ð ÑÑом ÑлÑÑае бÑÐ´ÐµÑ Ð²Ñдано замеÑание. ÐамеÑÑÑе, ÑÑо Ð½ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð¹ гаÑанÑии, ÑÑо ÑÑÑеÑÑвÑÑÑий Ð¸Ð½Ð´ÐµÐºÑ ÐºÐ°Ðº-Ñо ÑооÑноÑиÑÑÑ Ñ Ñем, коÑоÑÑй мог Ð±Ñ Ð±ÑÑÑ Ñоздан. ÐÐ¼Ñ Ð¸Ð½Ð´ÐµÐºÑа ÑвлÑеÑÑÑ Ð¾Ð±ÑзаÑелÑнÑм, когда ÑказÑваеÑÑÑ
IF NOT EXISTS.INCLUDEÐеобÑзаÑелÑное пÑедложение
INCLUDEпозволÑÐµÑ ÑказаÑÑ ÑпиÑок ÑÑолбÑов, коÑоÑÑе войдÑÑ Ð² Ð¸Ð½Ð´ÐµÐºÑ ÐºÐ°Ðº неклÑÑевÑе ÑÑолбÑÑ. ÐеклÑÑевой ÑÑÐ¾Ð»Ð±ÐµÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð² ÑÑловии поиÑка Ð´Ð»Ñ ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ индекÑÑ, и он не ÑÑиÑÑваеÑÑÑ Ð¿Ñи анализе огÑаниÑÐµÐ½Ð¸Ñ ÑникалÑноÑÑи или иÑклÑÑениÑ, ÑÑÑанавливаемого индекÑом. Ðднако пÑи ÑканиÑовании ÑолÑко индекÑа ÑодеÑжимое неклÑÑевÑÑ ÑÑолбÑов Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÑÑено без обÑаÑÐµÐ½Ð¸Ñ Ðº Ñелевой ÑаблиÑе, Ñак как оно Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно в ÑлеменÑе индекÑа. Таким обÑазом, в ÑезÑлÑÑаÑе Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÐºÐ»ÑÑевÑÑ ÑÑолбÑов ÑканиÑование ÑолÑко индекÑа Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð² ÑÐµÑ Ð·Ð°Ð¿ÑоÑÐ°Ñ , где инаÑе оно бÑло Ð±Ñ Ð½ÐµÐ¿Ñименимо.ÐобавлÑÑ Ð² Ð¸Ð½Ð´ÐµÐºÑ Ð½ÐµÐºÐ»ÑÑевÑе ÑÑолбÑÑ, оÑобенно болÑÑого ÑазмеÑа, еÑÑÑ ÑмÑÑл пÑоÑвлÑÑÑ ÐºÐ¾Ð½ÑеÑваÑизм. ÐÑли коÑÑеж в индекÑе пÑевÑÑÐ°ÐµÑ Ð¼Ð°ÐºÑималÑно допÑÑÑимÑй ÑÐ°Ð·Ð¼ÐµÑ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ Ñипа индекÑов, вÑÑавиÑÑ Ð´Ð°Ð½Ð½Ñе в ÑаблиÑÑ Ð½Ðµ ÑдаÑÑÑÑ. РнеклÑÑевÑÑ ÑÑолбÑÐ°Ñ Ð´ÑблиÑÑÑÑÑÑ Ð´Ð°Ð½Ð½Ñе из оÑновной ÑаблиÑÑ, ÑÑо пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑаздÑÐ²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа и Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð²Ð»ÐµÑÑ Ð·Ð°Ð¼ÐµÐ´Ð»ÐµÐ½Ð¸Ðµ запÑоÑов. ÐÑоме Ñого, еÑли неклÑÑевой ÑÑÐ¾Ð»Ð±ÐµÑ ÑодеÑжиÑÑÑ Ð² индекÑе B-деÑево, в Ñаком индекÑе не бÑÐ´ÐµÑ ÑабоÑаÑÑ Ð¸ÑклÑÑение дÑбликаÑов.
ÐÐ»Ñ ÑÑолбÑов, пеÑеÑиÑленнÑÑ Ð²
INCLUDE, не нÑÐ¶Ð½Ñ ÑооÑвеÑÑÑвÑÑÑие клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов; ÑÑо пÑедложение Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ ÑÑолбÑÑ, Ð´Ð»Ñ Ñипов даннÑÑ ÐºÐ¾ÑоÑÑÑ Ð½Ðµ опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ ÐºÐ»Ð°ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ меÑода доÑÑÑпа.ÐÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² неклÑÑевÑÑ ÑÑолбÑÐ°Ñ Ð½Ðµ поддеÑживаÑÑÑÑ, Ñак как Ð¸Ñ Ð½ÐµÐ»ÑÐ·Ñ Ð±ÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ Ð¿Ñи ÑканиÑовании ÑолÑко индекÑа.
РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ Ð¼ÐµÑÐ¾Ð´Ñ Ð´Ð¾ÑÑÑпа индекÑов B-деÑево, GiST и SP-GiST. Ð ÑÐ°ÐºÐ¸Ñ Ð¸Ð½Ð´ÐµÐºÑÐ°Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑÑолбÑов, ÑказаннÑÑ Ð² пÑедложении
INCLUDE, вклÑÑаÑÑÑÑ Ð² коÑÑежи на ÑÑовне лиÑÑÑев, коÑоÑÑе ÑооÑвеÑÑÑвÑÑÑ ÐºÐ¾ÑÑежам кÑÑи, но не вклÑÑаÑÑÑÑ Ð² ÑлеменÑÑ Ð²ÐµÑÑ Ð½Ð¸Ñ ÑÑовней, иÑполÑзÑемÑе Ð´Ð»Ñ Ð½Ð°Ð²Ð¸Ð³Ð°Ñии в деÑеве.имÑÐÐ¼Ñ Ñоздаваемого индекÑа. Указание ÑÑ ÐµÐ¼Ñ Ð¿Ñи ÑÑом не допÑÑкаеÑÑÑ; Ð¸Ð½Ð´ÐµÐºÑ Ð²Ñегда оÑноÑиÑÑÑ Ðº Ñой же ÑÑ ÐµÐ¼Ðµ, ÑÑо и ÑодиÑелÑÑÐºÐ°Ñ ÑаблиÑа. ÐÐ¼Ñ Ð¸Ð½Ð´ÐµÐºÑа должно оÑлиÑаÑÑÑÑ Ð¾Ñ Ð¸Ð¼ÐµÐ½Ð¸ лÑбого дÑÑгого оÑноÑÐµÐ½Ð¸Ñ (ÑаблиÑÑ, поÑледоваÑелÑноÑÑи, индекÑа, пÑедÑÑавлениÑ, маÑеÑиализованного пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ÑÑоÑонней ÑаблиÑÑ) в ÑÑой ÑÑ ÐµÐ¼Ðµ. ÐÑли Ð¸Ð¼Ñ Ð¾Ð¿ÑÑено, PostgreSQL ÑоÑмиÑÑÐµÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑее Ð¸Ð¼Ñ Ð¿Ð¾ имени ÑодиÑелÑÑкой ÑаблиÑÑ Ð¸ именам индекÑиÑÑемÑÑ ÑÑолбÑов.
ONLYУказÑваеÑ, ÑÑо индекÑÑ Ð½Ðµ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑекÑÑÑивно ÑоздаваÑÑÑÑ Ð² ÑекÑиÑÑ ÑекÑиониÑованной ÑаблиÑÑ. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ñоздание вÑполнÑеÑÑÑ ÑекÑÑÑивно.
имÑ_ÑаблиÑÑÐÐ¼Ñ Ð¸Ð½Ð´ÐµÐºÑиÑÑемой ÑаблиÑÑ (возможно, дополненное ÑÑ ÐµÐ¼Ð¾Ð¹).
меÑодÐÐ¼Ñ Ð¿ÑименÑемого меÑода индекÑа. ÐозможнÑе ваÑианÑÑ:
btree,hash,gist,spgist,gin,brinили ÑÑÑановленнÑй полÑзоваÑелем меÑод, напÑÐ¸Ð¼ÐµÑ bloom. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑ Ð¼ÐµÑодbtree.имÑ_ÑÑолбÑаÐÐ¼Ñ ÑÑолбÑа ÑаблиÑÑ.
вÑÑажениеÐÑÑажение Ñ Ð¾Ð´Ð½Ð¸Ð¼ или неÑколÑкими ÑÑолбÑами ÑаблиÑÑ. ÐбÑÑно вÑÑажение должно запиÑÑваÑÑÑÑ Ð² ÑÐºÐ¾Ð±ÐºÐ°Ñ , как показано в ÑинÑакÑиÑе командÑ. Ðднако Ñкобки можно опÑÑÑиÑÑ, еÑли вÑÑажение запиÑано в виде вÑзова ÑÑнкÑии.
пÑавило_ÑоÑÑиÑовкиÐÐ¼Ñ Ð¿Ñавила ÑоÑÑиÑовки, пÑименÑемого Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ÑполÑзÑеÑÑÑ Ð¿Ñавило ÑоÑÑиÑовки, заданное Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑиÑÑемого ÑÑолбÑа, либо полÑÑенное Ð´Ð»Ñ ÑезÑлÑÑаÑа вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа. ÐндекÑÑ Ñ Ð½ÐµÑÑандаÑÑнÑми пÑавилами ÑоÑÑиÑовки могÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов, вклÑÑаÑÑÐ¸Ñ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñ Ñакими пÑавилами.
клаÑÑ_опеÑаÑоÑовÐÐ¼Ñ ÐºÐ»Ð°ÑÑа опеÑаÑоÑов. ÐодÑобнее об ÑÑом ниже.
паÑамеÑÑ_клаÑÑа_опÐÐ¼Ñ Ð¿Ð°ÑамеÑÑа клаÑÑа опеÑаÑоÑов. ÐодÑобнее об ÑÑом ниже.
ASCУказÑÐ²Ð°ÐµÑ Ð¿Ð¾ÑÑдок ÑоÑÑиÑовки по возÑаÑÑÐ°Ð½Ð¸Ñ (подÑазÑмеваеÑÑÑ Ð¿Ð¾ ÑмолÑаниÑ).
DESCУказÑÐ²Ð°ÐµÑ Ð¿Ð¾ÑÑдок ÑоÑÑиÑовки по ÑбÑваниÑ.
NULLS FIRSTУказÑваеÑ, ÑÑо знаÑÐµÐ½Ð¸Ñ NULL поÑле ÑоÑÑиÑовки оказÑваÑÑÑÑ Ð¿ÐµÑед оÑÑалÑнÑми. ÐÑо поведение по ÑмолÑÐ°Ð½Ð¸Ñ Ñ Ð¿Ð¾ÑÑдком ÑоÑÑиÑовки
DESC.NULLS LASTУказÑваеÑ, ÑÑо знаÑÐµÐ½Ð¸Ñ NULL поÑле ÑоÑÑиÑовки оказÑваÑÑÑÑ Ð¿Ð¾Ñле оÑÑалÑнÑÑ . ÐÑо поведение по ÑмолÑÐ°Ð½Ð¸Ñ Ñ Ð¿Ð¾ÑÑдком ÑоÑÑиÑовки
ASC.NULLS DISTINCTNULLS NOT DISTINCTÐпÑеделÑеÑ, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð»Ð¸ знаÑÐµÐ½Ð¸Ñ NULL ÑÑиÑаÑÑÑÑ ÑазлиÑнÑми (не ÑавнÑми) Ð´Ð»Ñ ÑникалÑного индекÑа. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¾Ð½Ð¸ ÑÑиÑаÑÑÑÑ ÑазлиÑнÑми, поÑÑÐ¾Ð¼Ñ ÑникалÑнÑй Ð¸Ð½Ð´ÐµÐºÑ Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð² ÑÑолбÑе неÑколÑко знаÑений NULL.
паÑамеÑÑ_Ñ ÑанениÑÐÐ¼Ñ ÑпеÑиÑиÑного Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа паÑамеÑÑа Ñ ÑанениÑ. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº ÑÐ°Ð·Ð´ÐµÐ»Ñ ÐаÑамеÑÑÑ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа ниже.
Ñабл_пÑоÑÑÑанÑÑвоТаблиÑное пÑоÑÑÑанÑÑво, в коÑоÑом бÑÐ´ÐµÑ Ñоздан индекÑ. ÐÑли не опÑеделено, вÑбиÑаеÑÑÑ default_tablespace, либо temp_tablespaces, пÑи Ñоздании индекÑа вÑеменной ÑаблиÑÑ.
пÑедикаÑÐÑÑажение огÑаниÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑаÑÑиÑного индекÑа.
ÐаÑамеÑÑÑ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа
ÐеобÑзаÑелÑное пÑедложение WITH опÑеделÑÐµÑ Ð¿Ð°ÑамеÑÑÑ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа. У каждого меÑода индекÑа еÑÑÑ Ñвой Ð½Ð°Ð±Ð¾Ñ Ð´Ð¾Ð¿ÑÑÑимÑÑ
паÑамеÑÑов Ñ
ÑанениÑ.
ÐеÑÐ¾Ð´Ñ Ð¸Ð½Ð´ÐµÐºÑов B-деÑево, Ñ ÐµÑ, GiST и SP-GiST пÑинимаÑÑ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ:
fillfactor(integer) #ÐпÑеделÑеÑ, наÑколÑко плоÑно меÑод индекÑа бÑÐ´ÐµÑ Ð·Ð°Ð¿Ð¾Ð»Ð½ÑÑÑ ÑÑÑаниÑÑ Ð¸Ð½Ð´ÐµÐºÑа. ÐÐ»Ñ B-деÑевÑев конÑевÑе ÑÑÑаниÑÑ Ð·Ð°Ð¿Ð¾Ð»Ð½ÑÑÑÑÑ Ð´Ð¾ ÑÑого пÑоÑенÑа пÑи наÑалÑном поÑÑÑоении индекÑа и позже, пÑи ÑаÑÑиÑении индекÑа впÑаво (добавлении новÑÑ Ð½Ð°Ð¸Ð±Ð¾Ð»ÑÑÐ¸Ñ Ð·Ð½Ð°Ñений клÑÑа). ÐÑли ÑÑÑаниÑÑ Ð²Ð¿Ð¾ÑледÑÑвии оказÑваÑÑÑÑ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð½Ñми полноÑÑÑÑ, они бÑдÑÑ ÑазделенÑ, ÑÑо пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑÑагменÑаÑии ÑÑÑÑкÑÑÑÑ Ð¸Ð½Ð´ÐµÐºÑа на диÑке. ÐÐ»Ñ B-деÑевÑев по ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ÑполÑзÑеÑÑÑ ÑакÑÐ¾Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ 90, но его можно поменÑÑÑ Ð½Ð° лÑбое Ñелое ÑиÑло Ð¾Ñ 10 до 100.
ÐÐ»Ñ Ð¸Ð½Ð´ÐµÐºÑов-B-деÑевÑев в ÑаблиÑÐ°Ñ , где ожидаеÑÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво добавлений и/или изменений запиÑей, Ð¸Ð¼ÐµÐµÑ ÑмÑÑл вÑбÑаÑÑ Ð¼ÐµÐ½ÑÑие знаÑÐµÐ½Ð¸Ñ ÑакÑоÑа Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð² Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²ÑполнениÑ
CREATE INDEX(до маÑÑовой загÑÑзки даннÑÑ Ð² ÑаблиÑÑ). ÐнаÑÐµÐ½Ð¸Ñ Ð² диапазоне 50 â 90 могÑÑ ÑгладиÑÑ Ð²ÑплеÑки Ñазделений ÑÑÑÐ°Ð½Ð¸Ñ Ð½Ð° наÑалÑном ÑÑапе жизни индекÑа-B-деÑева (пÑи подобном Ñнижении ÑакÑоÑа Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð´Ð°Ð¶Ðµ ÑменÑÑиÑÑÑÑ Ð°Ð±ÑолÑÑное колиÑеÑÑво Ñазделений ÑÑÑаниÑ, Ñ Ð¾ÑÑ ÑÑо во многом завиÑÐ¸Ñ Ð¾Ñ Ð½Ð°Ð³ÑÑзки). ÐÑоÑедÑÑа воÑÑ Ð¾Ð´ÑÑего ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑнÑÑ ÐºÐ¾ÑÑежей, опиÑÐ°Ð½Ð½Ð°Ñ Ð² ÐодÑазделе 65.1.4.2, ÑаÑÑÑиÑÑÐ²Ð°ÐµÑ Ð½Ð° налиÑие некоÑоÑого «дополниÑелÑного» меÑÑа на ÑÑÑаниÑÐ°Ñ , где бÑдÑÑ ÑÐ¾Ñ ÑанÑÑÑÑÑ Â«Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе» веÑÑии коÑÑежей, и ÑледоваÑелÑно, Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð²Ð¸ÑеÑÑ Ð¾Ñ ÑакÑоÑа Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ (Ñ Ð¾ÑÑ Ð¾Ð±ÑÑно его влиÑние вÑоÑоÑÑепенно).РдÑÑÐ³Ð¸Ñ Ð¾ÑобÑÑ ÑлÑÑаÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ ÑвелиÑиÑÑ ÑакÑÐ¾Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´Ð¾ 100 пеÑед вÑполнением
CREATE INDEX, ÑÑÐ¾Ð±Ñ Ð¼Ð°ÐºÑималÑно ÑÑÑекÑивно иÑполÑзоваÑÑ Ñ ÑанилиÑе. ÐÑÐ¾Ñ Ð²Ð°ÑÐ¸Ð°Ð½Ñ ÑледÑÐµÑ ÑаÑÑмаÑÑиваÑÑ, ÑолÑко еÑли Ð²Ñ Ð°Ð±ÑолÑÑно ÑвеÑенÑ, ÑÑо ÑаблиÑа бÑÐ´ÐµÑ ÑÑаÑиÑной (Ñо еÑÑÑ Ð² ней никогда не бÑдÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑÑÑ Ð¸Ð»Ð¸ добавлÑÑÑÑÑ Ð´Ð°Ð½Ð½Ñе). РпÑоÑивном ÑлÑÑае ÑакÑÐ¾Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ, ÑавнÑй 100, ÑкоÑее повÑÐµÐ´Ð¸Ñ Ð¿ÑоизводиÑелÑноÑÑи â даже единиÑнÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²ÑзовÑÑ Ñезкий ÑкаÑок акÑивноÑÑи ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ ÑÑÑаниÑ.ÐÑÑгие индекÑнÑе меÑÐ¾Ð´Ñ Ð¸ÑполÑзÑÑÑ ÑакÑÐ¾Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾-ÑвоемÑ, но пÑимеÑно в Ñом же клÑÑе; знаÑение по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ ÑазнÑÑ Ð¼ÐµÑодов Ñазное.
ÐндекÑÑ B-деÑево дополниÑелÑно пÑинимаÑÑ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ:
deduplicate_items(boolean) #ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ ÑпÑавлÑÐµÑ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð¾Ð¼ иÑклÑÑÐµÐ½Ð¸Ñ Ð´ÑбликаÑов, опиÑаннÑм в ÐодÑазделе 65.1.4.3. Ðн пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð»Ð¾Ð³Ð¸ÑеÑкое знаÑение
ONилиOFF, ÑооÑвеÑÑÑвенно вклÑÑаÑÑее или оÑклÑÑаÑÑее ÑÑо опÑимизаÑиÑ. (ÐÑÑгие возможнÑе напиÑаниÑONиOFFпеÑеÑиÑÐ»ÐµÐ½Ñ Ð² Разделе 19.1.) ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ âON.ÐÑимеÑание
ÐоÑле вÑклÑÑÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑа
deduplicate_itemsкомандойALTER INDEXпÑи добавлении в бÑдÑÑем новÑÑ ÑлеменÑов дÑбликаÑÑ Ð¸ÑклÑÑаÑÑÑÑ Ð½Ðµ бÑдÑÑ, но пÑедÑÑавление ÑÑÑеÑÑвÑÑÑÐ¸Ñ ÐºÐ¾ÑÑежей не поменÑеÑÑÑ Ð½Ð° ÑÑандаÑÑное.
ÐндекÑÑ GiST дополниÑелÑно пÑинимаÑÑ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ:
buffering(enum) #ÐпÑеделÑеÑ, бÑÐ´ÐµÑ Ð»Ð¸ пÑи поÑÑÑоении индекÑа иÑполÑзоваÑÑÑÑ Ð±ÑÑеÑизаÑиÑ, опиÑÐ°Ð½Ð½Ð°Ñ Ð² ÐодÑазделе 65.2.4.1. Со знаÑением
OFFона оÑклÑÑена, ÑONâ вклÑÑена, а ÑAUTOâ оÑклÑÑена внаÑале, но Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ñем вклÑÑиÑÑÑÑ Ð½Ð° Ñ Ð¾Ð´Ñ, как ÑолÑко ÑÐ°Ð·Ð¼ÐµÑ Ð¸Ð½Ð´ÐµÐºÑа доÑÑÐ¸Ð³Ð½ÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ effective_cache_size. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ âAUTO. ÐамеÑÑÑе, ÑÑо еÑли возможно поÑÑÑоиÑÑ Ð¸Ð½Ð´ÐµÐºÑ Ñ ÑоÑÑиÑовкой, именно ÑÑÐ¾Ñ Ð¼ÐµÑод бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð¿Ñи лÑбом знаÑении, кÑомеbuffering=ON.
ÐндекÑÑ GIN пÑинимаÑÑ ÑледÑÑÑие паÑамеÑÑÑ:
fastupdate(boolean) #УпÑавлÑÐµÑ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð¾Ð¼ бÑÑÑÑого обновлениÑ, опиÑаннÑм в ÐодÑазделе 65.4.4.1. ÐнаÑение
ONвклÑÑÐ°ÐµÑ Ð±ÑÑÑÑое обновление,OFFоÑклÑÑÐ°ÐµÑ ÐµÐ³Ð¾. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ âON.ÐÑимеÑание
ÐÑклÑÑение
fastupdateвALTER INDEXпÑедоÑвÑаÑÐ°ÐµÑ Ð¿Ð¾Ð¼ÐµÑение добавлÑемÑÑ Ð² далÑнейÑем ÑÑÑок в ÑпиÑок запиÑей, ожидаÑÑÐ¸Ñ Ð¸Ð½Ð´ÐµÐºÑаÑии, но Ñже ÑÑÑеÑÑвÑÑÑие запиÑи в нÑм оÑÑаÑÑÑÑ. ЧÑÐ¾Ð±Ñ Ð¾ÑиÑÑиÑÑ Ð¾ÑеÑÐµÐ´Ñ Ð¾Ð¿ÐµÑаÑий, надо заÑем вÑполниÑÑVACUUMÐ´Ð»Ñ ÑÑой ÑаблиÑÑ Ð¸Ð»Ð¸ вÑзваÑÑ ÑÑнкÑиÑgin_clean_pending_list.
gin_pending_list_limit(integer) #ÐеÑеопÑеделÑÐµÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑй паÑамеÑÑ gin_pending_list_limit Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа. ÐнаÑение ÑÑого паÑамеÑÑа задаÑÑÑÑ Ð² килобайÑÐ°Ñ .
ÐндекÑÑ BRIN пÑинимаÑÑ ÑледÑÑÑие паÑамеÑÑÑ:
pages_per_range(integer) #ÐпÑеделÑеÑ, ÑколÑко блоков ÑаблиÑÑ Ð¾Ð±ÑазÑÑÑ Ð·Ð¾Ð½Ñ Ð±Ð»Ð¾ÐºÐ¾Ð² Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ запиÑи в индекÑе BRIN (за подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 65.5.1). ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ â
128.autosummarize(boolean) #ÐпÑеделÑеÑ, бÑÐ´ÐµÑ Ð»Ð¸ поÑÑавлен в оÑеÑÐµÐ´Ñ ÑаÑÑÑÑ Ñводного знаÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿ÑедÑдÑÑей Ð·Ð¾Ð½Ñ ÑÑÑаниÑ, когда пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ в ÑледÑÑÑÑÑ. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 65.5.1.1. Ðо ÑмолÑаниÑ
off.
ÐеблокиÑÑÑÑее поÑÑÑоение индекÑов
Создание индекÑа Ð¼Ð¾Ð¶ÐµÑ Ð¼ÐµÑаÑÑ Ð¾Ð±ÑÑной ÑабоÑе Ñ Ð±Ð°Ð·Ð¾Ð¹ даннÑÑ . ÐбÑÑно PostgreSQL блокиÑÑÐµÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð² индекÑиÑÑемÑÑ ÑаблиÑÑ Ð¸ вÑполнÑÐµÑ Ð²ÑÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ð¿Ð¾ÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа за одно ÑканиÑование ÑаблиÑÑ. ÐÑÑгие ÑÑанзакÑии могÑÑ Ð¿ÑодолжаÑÑ ÑиÑаÑÑ ÑаблиÑÑ, но пÑи попÑÑке вÑÑавиÑÑ, измениÑÑ Ð¸Ð»Ð¸ ÑдалиÑÑ ÑÑÑоки в ÑаблиÑе они бÑдÑÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²Ð°Ð½Ñ Ð´Ð¾ завеÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾ÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð¾ÐºÐ°Ð·Ð°ÑÑ Ð½ÐµÐ¶ÐµÐ»Ð°ÑелÑное влиÑние на ÑабоÑÑ Ð¿ÑоизводÑÑвенной Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐндекÑаÑÐ¸Ñ Ð¾ÑÐµÐ½Ñ Ð±Ð¾Ð»ÑÑÐ¸Ñ ÑÐ°Ð±Ð»Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð½Ð¸Ð¼Ð°ÑÑ Ð¼Ð½Ð¾Ð³Ð¾ ÑаÑов, и даже Ð´Ð»Ñ Ð¼Ð°Ð»ÐµÐ½ÑÐºÐ¸Ñ ÑÐ°Ð±Ð»Ð¸Ñ Ð¿Ð¾ÑÑÑоение индекÑа Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸ÑоваÑÑ Ð·Ð°Ð¿Ð¸ÑÑваÑÑие пÑоÑеÑÑÑ Ð½Ð° вÑемÑ, непÑиемлемое Ð´Ð»Ñ Ð¿ÑоизводÑÑвенной ÑиÑÑемÑ.
PostgreSQL поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿Ð¾ÑÑÑоение индекÑов без блокиÑовки запиÑи. ÐÑÐ¾Ñ Ð¼ÐµÑод вÑбиÑаеÑÑÑ Ñказанием CONCURRENTLY ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE INDEX. Ðогда он иÑполÑзÑеÑÑÑ, PostgreSQL должен вÑполниÑÑ Ð´Ð²Ð° ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑаблиÑÑ, а кÑоме Ñого, должен дождаÑÑÑÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ Ð²ÑеÑ
ÑÑÑеÑÑвÑÑÑиÑ
ÑÑанзакÑий, коÑоÑÑе поÑенÑиалÑно могÑÑ Ð¼Ð¾Ð´Ð¸ÑиÑиÑоваÑÑ Ð¸ иÑполÑзоваÑÑ ÑÑÐ¾Ñ Ð¸Ð½Ð´ÐµÐºÑ. Таким обÑазом, ÑÑа пÑоÑедÑÑа ÑÑебÑÐµÑ Ð¿ÑоделаÑÑ Ð² ÑÑмме болÑÑе дейÑÑвий и вÑполнÑеÑÑÑ Ð·Ð½Ð°ÑиÑелÑно долÑÑе, Ñем обÑÑное поÑÑÑоение индекÑа. Ðднако благодаÑÑ ÑомÑ, ÑÑо ÑÑÐ¾Ñ Ð¼ÐµÑод позволÑÐµÑ Ð¿ÑодолжаÑÑ Ð¾Ð±ÑÑнÑÑ ÑабоÑÑ Ñ Ð±Ð°Ð·Ð¾Ð¹ во вÑÐµÐ¼Ñ Ð¿Ð¾ÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа, он оказÑваеÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñм в пÑоизводÑÑвенной ÑÑеде. ХоÑÑ ÑазÑмееÑÑÑ, дополниÑелÑÐ½Ð°Ñ Ð½Ð°Ð³ÑÑзка на пÑоÑеÑÑÐ¾Ñ Ð¸ подÑиÑÑÐµÐ¼Ñ Ð²Ð²Ð¾Ð´Ð°-вÑвода, ÑÐ¾Ð·Ð´Ð°Ð²Ð°ÐµÐ¼Ð°Ñ Ð¿Ñи поÑÑÑоении индекÑа, Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к Ð·Ð°Ð¼ÐµÐ´Ð»ÐµÐ½Ð¸Ñ Ð´ÑÑгиÑ
опеÑаÑий.
ÐÑи неблокиÑÑÑÑем поÑÑÑоении индекÑа он как «неÑабоÑий» добавлÑеÑÑÑ Ð² ÑиÑÑемнÑй каÑалог в одной ÑÑанзакÑии, а заÑем в двÑÑ
дÑÑгиÑ
ÑÑанзакÑиÑÑ
вÑполнÑÑÑÑÑ ÐµÑÑ Ð´Ð²Ð° ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑаблиÑÑ. ÐеÑед каждÑм ÑканиÑованием ÑаблиÑÑ Ð¿ÑоÑедÑÑа поÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа должна ждаÑÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ ÑекÑÑиÑ
ÑÑанзакÑий, модиÑиÑиÑовавÑиÑ
ÑÑÑ ÑаблиÑÑ. ÐоÑле вÑоÑого ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ñакже необÑ
одимо дожидаÑÑÑÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ Ð²ÑеÑ
ÑÑанзакÑий, полÑÑивÑиÑ
Ñнимок (Ñм. ÐлавÑ 13) пеÑед вÑоÑÑм ÑканиÑованием, вклÑÑÐ°Ñ ÑÑанзакÑии, задейÑÑвованнÑе на лÑбом ÑÑапе неблокиÑÑÑÑего поÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑов Ð´Ð»Ñ Ð´ÑÑгиÑ
ÑÐ°Ð±Ð»Ð¸Ñ (ÑÑо каÑаеÑÑÑ ÑаÑÑиÑнÑÑ
индекÑов и индекÑов, поÑÑÑоеннÑÑ
не пÑоÑÑо по ÑÑолбÑам). ÐÐ°ÐºÐ¾Ð½ÐµÑ Ð¸Ð½Ð´ÐµÐºÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð¼ÐµÑен как «ÑабоÑий» и гоÑовÑй к иÑполÑзованиÑ, поÑле Ñего команда CREATE INDEX завеÑÑаеÑÑÑ. Ðднако даже Ñогда Ð¸Ð½Ð´ÐµÐºÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ðµ гоÑов немедленно к пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² запÑоÑаÑ
: в Ñ
ÑдÑем ÑлÑÑае он не бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ, пока ÑÑÑеÑÑвÑÑÑ ÑÑанзакÑии, наÑаÑÑе до наÑала поÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа.
ÐÑли пÑи ÑканиÑовании ÑаблиÑÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¿Ñоблема, напÑÐ¸Ð¼ÐµÑ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð±Ð»Ð¾ÐºÐ¸Ñовка или наÑÑÑение ÑникалÑноÑÑи в ÑникалÑном индекÑе, команда CREATE INDEX завеÑÑиÑÑÑ Ð¾Ñибкой, но оÑÑÐ°Ð²Ð¸Ñ Ð¿Ð¾Ñле ÑÐµÐ±Ñ Â«Ð½ÐµÑабоÑий» индекÑ. ÐÑÐ¾Ñ Ð¸Ð½Ð´ÐµÐºÑ Ð±ÑÐ´ÐµÑ Ð¸Ð³Ð½Ð¾ÑиÑоваÑÑÑÑ Ð¿Ñи ÑÑении даннÑÑ
, Ñак как он Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÐ¿Ð¾Ð»Ð½Ñм; однако Ñ Ð½Ð¸Ð¼ могÑÑ Ð±ÑÑÑ ÑвÑÐ·Ð°Ð½Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе опеÑаÑии пÑи изменениÑÑ
. Ð psql вÑÑÑÐ¾ÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° \d помеÑÐ°ÐµÑ Ñакой Ð¸Ð½Ð´ÐµÐºÑ ÐºÐ°Ðº INVALID:
postgres=# \d tab
Table "public.tab"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
col | integer | | |
Indexes:
"idx" btree (col) INVALID РекомендÑемÑй в ÑакиÑ
ÑлÑÑаÑÑ
ÑпоÑоб иÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑиÑÑаÑии â ÑдалиÑÑ Ð¸Ð½Ð´ÐµÐºÑ Ð¸ заÑем попÑÑаÑÑÑÑ Ñнова вÑполниÑÑ CREATE INDEX CONCURRENTLY. (ÐÑоме Ñого, можно пеÑеÑÑÑоиÑÑ ÐµÐ³Ð¾ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ REINDEX INDEX CONCURRENTLY.)
ÐÑÑ Ð¾Ð´Ð½Ð° ÑложноÑÑÑ, Ñ ÐºÐ¾ÑоÑой можно ÑÑолкнÑÑÑÑÑ Ð¿Ñи неблокиÑÑÑÑем поÑÑÑоении ÑникалÑного индекÑа, заклÑÑаеÑÑÑ Ð² Ñом, ÑÑо огÑаниÑение ÑникалÑноÑÑи Ñже влиÑÐµÑ Ð½Ð° дÑÑгие ÑÑанзакÑии, когда вÑоÑое ÑканиÑование ÑаблиÑÑ ÑолÑко наÑинаеÑÑÑ. ÐÑо знаÑиÑ, ÑÑо наÑÑÑÐµÐ½Ð¸Ñ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¿ÑоÑвлÑÑÑÑÑ Ð² дÑÑÐ³Ð¸Ñ Ð·Ð°Ð¿ÑоÑÐ°Ñ Ð´Ð¾ Ñого, как Ð¸Ð½Ð´ÐµÐºÑ ÑÑановиÑÑÑ Ð´Ð¾ÑÑÑпнÑм Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ даже Ñогда, когда ÑоздаÑÑ Ð¸Ð½Ð´ÐµÐºÑ Ð² иÑоге не ÑдаÑÑÑÑ. ÐÑоме Ñого, еÑли пÑи вÑоÑом ÑканиÑовании пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð¾Ñибка, «неÑабоÑий» Ð¸Ð½Ð´ÐµÐºÑ Ð¾ÑÑавлÑÐµÑ Ð² Ñиле ÑÐ²Ð¾Ñ Ð¾Ð³ÑаниÑение ÑникалÑноÑÑи и далÑÑе.
ÐеÑод неблокиÑÑÑÑего поÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ Ñакже индекÑÑ Ð²ÑÑажений и ÑаÑÑиÑнÑе индекÑÑ. ÐÑибки, пÑоизоÑедÑие пÑи вÑÑиÑлении ÑÑÐ¸Ñ Ð²ÑÑажений, могÑÑ Ð¿ÑивеÑÑи к ÑÐ°ÐºÐ¾Ð¼Ñ Ð¶Ðµ поведениÑ, как в вÑÑеопиÑаннÑÑ ÑлÑÑаÑÑ Ñ Ð½Ð°ÑÑÑением огÑаниÑений ÑникалÑноÑÑи.
ÐбÑÑное поÑÑÑоение индекÑа допÑÑÐºÐ°ÐµÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменное поÑÑÑоение дÑÑгиÑ
индекÑов Ð´Ð»Ñ ÑаблиÑÑ Ð¾Ð±ÑÑнÑм меÑодом, но неблокиÑÑÑÑее поÑÑÑоение Ð´Ð»Ñ ÐºÐ¾Ð½ÐºÑеÑной ÑаблиÑÑ Ð² один Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ñемени допÑÑкаеÑÑÑ ÑолÑко одно. Ðднако в лÑбом ÑлÑÑае никакие дÑÑгие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑ
ÐµÐ¼Ñ ÑаблиÑÑ Ð² ÑÑо вÑÐµÐ¼Ñ Ð½Ðµ ÑазÑеÑаÑÑÑÑ. ÐÑÑгое оÑлиÑие ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо в блоке ÑÑанзакÑии Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ñполнена обÑÑÐ½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° CREATE INDEX, но не CREATE INDEX CONCURRENTLY.
ÐеÑод неблокиÑÑÑÑего поÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑов ÑекÑиониÑованнÑÑ ÑÐ°Ð±Ð»Ð¸Ñ Ð² наÑÑоÑÑее вÑÐµÐ¼Ñ Ð½Ðµ поддеÑживаеÑÑÑ. Ðднако Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑокÑаÑиÑÑ Ð²ÑемÑ, на коÑоÑое бÑÐ´ÐµÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñована ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑаблиÑа, поÑÑÑоив в неблокиÑÑÑÑем Ñежиме Ð¸Ð½Ð´ÐµÐºÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑекÑии в оÑделÑноÑÑи и заÑем Ñоздав ÑекÑиониÑованнÑй Ð¸Ð½Ð´ÐµÐºÑ Ð² обÑÑном Ñежиме. Ð ÑÑом ÑлÑÑае поÑÑÑоение ÑекÑиониÑованного индекÑа бÑÐ´ÐµÑ Ð·Ð°ÐºÐ»ÑÑаÑÑÑÑ ÑолÑко в изменении меÑаданнÑÑ .
ÐÑимеÑаниÑ
ÐнÑоÑмаÑÐ¸Ñ Ð¾ Ñом, когда могÑÑ Ð¿ÑименÑÑÑÑÑ, и когда не пÑименÑÑÑÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ, и в ÐºÐ°ÐºÐ¸Ñ ÐºÐ¾Ð½ÐºÑеÑнÑÑ ÑиÑÑаÑиÑÑ Ð¾Ð½Ð¸ могÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ, можно найÑи в Ðлаве 11.
РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð¸Ð½Ð´ÐµÐºÑÑ Ñ Ð½ÐµÑколÑкими клÑÑевÑми ÑÑолбÑами поддеÑживаÑÑÑÑ ÑолÑко меÑодами B-деÑево, GiST, GIN и BRIN. ÐозможноÑÑÑ Ð¿Ð¾ÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа по неÑколÑким клÑÑевÑм ÑÑолбÑам не завиÑÐ¸Ñ Ð¾Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки вклÑÑÐµÐ½Ð¸Ñ Ð² Ð¸Ð½Ð´ÐµÐºÑ Ð½ÐµÐºÐ»ÑÑевÑÑ
ÑÑолбÑов (INCLUDE). ÐндекÑÑ Ð¼Ð¾Ð³ÑÑ ÑодеÑжаÑÑ Ð´Ð¾ 32 ÑÑолбÑов, в Ñом ÑиÑле неклÑÑевÑÑ
. (ÐÑÐ¾Ñ Ð¿Ñедел можно измениÑÑ, пеÑеÑобÑав PostgreSQL.) УникалÑнÑе индекÑÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑолÑко меÑод B-деÑево.
ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑÑолбÑа индекÑа можно задаÑÑ ÐºÐ»Ð°ÑÑ Ð¾Ð¿ÐµÑаÑоÑов и дополниÑелÑнÑе паÑамеÑÑÑ ÐºÐ»Ð°ÑÑа. ÐаннÑй клаÑÑ Ð¾Ð¿ÑеделÑеÑ, какие опеÑаÑоÑÑ Ð±ÑдÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð¸Ð½Ð´ÐµÐºÑом Ð´Ð»Ñ ÑÑого ÑÑолбÑа. ÐапÑимеÑ, индекÑ-B-деÑево по ÑеÑÑÑÑÑ
байÑовÑм ÑелÑм бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ ÐºÐ»Ð°ÑÑ int4_ops; ÑÑÐ¾Ñ ÐºÐ»Ð°ÑÑ Ð¾Ð¿ÐµÑаÑоÑов вклÑÑÐ°ÐµÑ ÑÑнкÑии ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑакиÑ
знаÑений. Ðа пÑакÑике обÑÑно доÑÑаÑоÑно иÑполÑзоваÑÑ ÐºÐ»Ð°ÑÑ Ð¾Ð¿ÐµÑаÑоÑов по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ñипа даннÑÑ
ÑÑолбÑа. СÑÑеÑÑвование клаÑÑов опеÑаÑоÑов обÑÑÑнÑеÑÑÑ Ð² пеÑвÑÑ Ð¾ÑеÑÐµÐ´Ñ Ñем, ÑÑо Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ
Ñипов даннÑÑ
можно пÑедложиÑÑ Ð±Ð¾Ð»ÐµÐµ одного оÑмÑÑленного поÑÑдка ÑоÑÑиÑовки. ÐапÑимеÑ, Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÑÑÑ Ð¶ÐµÐ»Ð°Ð½Ð¸Ðµ оÑÑоÑÑиÑоваÑÑ ÐºÐ¾Ð¼Ð¿Ð»ÐµÐºÑнÑе ÑиÑла как по абÑолÑÑÐ½Ð¾Ð¼Ñ Ð·Ð½Ð°ÑениÑ, Ñак и по веÑеÑÑвенной ÑаÑÑи. ÐÑо можно ÑделаÑÑ, опÑеделив два клаÑÑа опеÑаÑоÑов Ð´Ð»Ñ Ñипа даннÑÑ
и вÑбÑав подÑ
одÑÑий клаÑÑ Ð¿Ñи Ñоздании индекÑа. Ðа дополниÑелÑнÑми ÑведениÑми о клаÑÑаÑ
опеÑаÑоÑов обÑаÑиÑеÑÑ Ðº РазделÑ 11.10 и РазделÑ 36.16.
Ðогда команда CREATE INDEX вÑзÑваеÑÑÑ Ð´Ð»Ñ ÑекÑиониÑованной ÑаблиÑÑ, по ÑмолÑÐ°Ð½Ð¸Ñ ÐµÑ Ð´ÐµÐ¹ÑÑвие ÑаÑпÑоÑÑÑанÑÑÑÑ ÑекÑÑÑивно на вÑе ÑекÑии, Ñ Ñем ÑÑÐ¾Ð±Ñ Ð² ниÑ
оказалиÑÑ ÑооÑвеÑÑÑвÑÑÑие индекÑÑ. СнаÑала ÐºÐ°Ð¶Ð´Ð°Ñ ÑекÑÐ¸Ñ Ð¿ÑовеÑÑеÑÑÑ Ð½Ð° налиÑие ÑавнознаÑного индекÑа, и, еÑли Ñаковой наÑ
одиÑÑÑ, он пÑиÑоединÑеÑÑÑ ÐºÐ°Ðº Ð¸Ð½Ð´ÐµÐºÑ ÑекÑии к ÑоздаваемомÑ, коÑоÑÑй Ñаким обÑазом ÑÑановиÑÑÑ ÑодиÑелÑÑким индекÑом. ÐÑли нÑжного индекÑа не оказÑваеÑÑÑ, новÑй Ð¸Ð½Ð´ÐµÐºÑ Ð°Ð²ÑомаÑиÑеÑки ÑоздаÑÑÑÑ Ð¸ пÑиÑоединÑеÑÑÑ Ðº оÑновномÑ; Ð¸Ð¼Ñ Ð¸Ð½Ð´ÐµÐºÑа Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑекÑии вÑбиÑаеÑÑÑ Ñак же, как и пÑи вÑполнении ÑÑой ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð±ÐµÐ· имени индекÑа. С Ñказанием ONLY ÑекÑÑÑÐ¸Ñ Ð½Ðµ пÑоизводиÑÑÑ Ð¸ Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾Ð¼ÐµÑаеÑÑÑ ÐºÐ°Ðº неÑабоÑий. (Ðоманда ALTER INDEX ... ATTACH PARTITION помеÑÐ¸Ñ ÐµÐ³Ð¾ как ÑабоÑий, когда он бÑÐ´ÐµÑ Ð¿ÑедÑÑавлен во вÑеÑ
ÑекÑиÑÑ
). Ðднако замеÑÑÑе, ÑÑо в лÑбой ÑекÑии, Ñоздаваемой в бÑдÑÑем командой CREATE TABLE ... PARTITION OF, ÑооÑвеÑÑÑвÑÑÑий Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾ÑвиÑÑÑ Ð°Ð²ÑомаÑиÑеÑки, вне завиÑимоÑÑи Ð¾Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ ÑказаниÑ.
ÐÐ»Ñ Ð¼ÐµÑодов индекÑа, поддеÑживаÑÑиÑ
ÑканиÑование по поÑÑÐ´ÐºÑ (в наÑÑоÑÑее вÑÐµÐ¼Ñ ÑÑо поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑолÑко B-деÑево), можно измениÑÑ Ð¿Ð¾ÑÑдок ÑоÑÑиÑовки индекÑа, добавив необÑзаÑелÑнÑе пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ASC, DESC, NULLS FIRST или NULLS LAST. Так как ÑпоÑÑдоÑеннÑй Ð¸Ð½Ð´ÐµÐºÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑканиÑоваÑÑ Ð²Ð¿ÐµÑÑд или назад, обÑÑно не Ð¸Ð¼ÐµÐµÑ ÑмÑÑла ÑоздаваÑÑ Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾ ÑбÑÐ²Ð°Ð½Ð¸Ñ (DESC) Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑÑолбÑа â ÑÑÐ¾Ñ Ð¿Ð¾ÑÑдок ÑоÑÑиÑовки можно полÑÑиÑÑ Ð¸ Ñ Ð¾Ð±ÑÑнÑм индекÑом. ÐÑи паÑамеÑÑÑ Ð¸Ð¼ÐµÑÑ ÑмÑÑл пÑи Ñоздании ÑоÑÑавнÑÑ
индекÑов Ñак, ÑÑо они бÑдÑÑ ÑооÑвеÑÑÑвоваÑÑ Ð¿Ð¾ÑÑÐ´ÐºÑ ÑоÑÑиÑовки, ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ Ð² запÑоÑе Ñо ÑмеÑаннÑм поÑÑдком, напÑÐ¸Ð¼ÐµÑ SELECT ... ORDER BY x ASC, y DESC. ÐаÑамеÑÑÑ NULLS полезнÑ, когда ÑÑебÑеÑÑÑ ÑеализоваÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ «NULL внизÑ», изменив ÑÑандаÑÑное «NULL ввеÑÑ
Ñ», в запÑоÑаÑ
, завиÑÑÑиÑ
Ð¾Ñ Ð¸Ð½Ð´ÐµÐºÑов, ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑной ÑоÑÑиÑовки.
СиÑÑема ÑегÑлÑÑно ÑобиÑÐ°ÐµÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð¿Ð¾ вÑем ÑÑолбÑам ÑаблиÑÑ. ÐовÑе индекÑÑ, поÑÑÑоеннÑе без пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²ÑÑажений, могÑÑ ÑÑÑекÑивно иÑполÑзоваÑÑ ÑÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ ÑÑазÑ. Ðднако Ð´Ð»Ñ ÑоздаваемÑÑ
индекÑов по вÑÑажениÑм ÑÑебÑеÑÑÑ Ð²ÑполниÑÑ ANALYZE или подождаÑÑ, пока ÑоновÑй пÑоÑеÑÑ Ð°Ð²ÑооÑиÑÑки не пÑоанализиÑÑÐµÑ ÑаблиÑÑ Ð¸ не поÑÑиÑÐ°ÐµÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð´Ð»Ñ ÑÑиÑ
индекÑов.
Ðа вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE INDEX search_path вÑеменно менÑеÑÑÑ Ð½Ð° pg_catalog, pg_temp.
ÐÐ»Ñ Ð±Ð¾Ð»ÑÑинÑÑва меÑодов индекÑов ÑкоÑоÑÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа завиÑÐ¸Ñ Ð¾Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ maintenance_work_mem. Чем болÑÑе ÑÑо знаÑение, Ñем менÑÑе вÑемени ÑÑебÑеÑÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа (еÑли ÑолÑко заданное знаÑение не пÑевÑÑÐ°ÐµÑ Ð¾Ð±ÑÑм дейÑÑвиÑелÑно доÑÑÑпной памÑÑи, ÑÑо влеÑÑÑ Ð·Ð° Ñобой иÑполÑзование подкаÑки).
PostgreSQL Ð¼Ð¾Ð¶ÐµÑ ÑÑÑоиÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ, задейÑÑвÑÑ Ð½ÐµÑколÑко пÑоÑеÑÑоÑов Ð´Ð»Ñ ÑÑкоÑÐµÐ½Ð¸Ñ Ð¾Ð±ÑабоÑки ÑÑÑок ÑаблиÑÑ. ÐÑо назÑваеÑÑÑ Ð¿Ð°ÑаллелÑнÑм поÑÑÑоением индекÑов. ÐÐ»Ñ Ð¼ÐµÑодов индекÑов, поддеÑживаÑÑиÑ
поÑÑÑоение в паÑаллелÑном Ñежиме (в наÑÑоÑÑее вÑÐµÐ¼Ñ ÑÑо B-деÑево, GIN и BRIN), паÑамеÑÑ maintenance_work_mem задаÑÑ Ð¼Ð°ÐºÑималÑнÑй обÑÑм памÑÑи, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ñделен Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ опеÑаÑии поÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа в Ñелом, незавиÑимо Ð¾Ñ Ñого, ÑколÑко ÑабоÑиÑ
пÑоÑеÑÑов бÑÐ´ÐµÑ Ð·Ð°Ð¿ÑÑено. ЦелеÑообÑазноÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð°ÑаллелÑнÑÑ
пÑоÑеÑÑов и иÑ
опÑималÑное колиÑеÑÑво обÑÑно авÑомаÑиÑеÑки опÑеделÑеÑÑÑ Ð¼Ð¾Ð´ÐµÐ»ÑÑ ÑÑоимоÑÑи.
ÐаÑаллелÑное поÑÑÑоение индекÑов Ð¼Ð¾Ð¶ÐµÑ Ð²ÑигÑаÑÑ Ð¾Ñ ÑвелиÑÐµÐ½Ð¸Ñ maintenance_work_mem Ñам, где Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñного поÑледоваÑелÑного поÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа вÑигÑÑÑа не бÑÐ´ÐµÑ Ð¸Ð»Ð¸ он бÑÐ´ÐµÑ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑнÑм. ÐамеÑÑÑе, ÑÑо знаÑение maintenance_work_mem Ð¼Ð¾Ð¶ÐµÑ Ð²Ð»Ð¸ÑÑÑ Ð½Ð° ÑиÑло запÑаÑиваемÑÑ
ÑабоÑиÑ
пÑоÑеÑÑов, Ñак как паÑаллелÑнÑм иÑполниÑелÑм должно бÑÑÑ Ð²Ñделено не менее 32MB из обÑего бÑджеÑа maintenance_work_mem. ÐÑоме Ñого, 32MB должно оÑÑаÑÑÑÑ Ð´Ð»Ñ Ð²ÐµÐ´ÑÑего пÑоÑеÑÑа. УвелиÑение max_parallel_maintenance_workers Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ ÑоздаÑÑ Ð±Ð¾Ð»ÑÑе иÑполниÑелей, ÑÑо пÑиведÑÑ Ðº ÑменÑÑÐµÐ½Ð¸Ñ Ð²Ñемени ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа, еÑли ÑолÑко Ñоздание индекÑа Ñже не ÑпиÑаеÑÑÑ Ð² ÑкоÑоÑÑÑ Ð²Ð²Ð¾Ð´Ð°-вÑвода. РазÑмееÑÑÑ, Ð´Ð»Ñ ÑÑого должно бÑÑÑ Ð´Ð¾ÑÑаÑоÑно пÑоÑеÑÑоÑнÑÑ
ÑеÑÑÑÑов, коÑоÑÑе инаÑе Ð±Ñ Ð¿ÑоÑÑаивали.
ÐÑли в ALTER TABLE задаÑÑÑÑ Ð·Ð½Ð°Ñение parallel_workers, именно оно опÑеделÑеÑ, ÑколÑко паÑаллелÑнÑÑ
иÑполниÑелей бÑÐ´ÐµÑ Ð·Ð°Ð¿ÑаÑиваÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° CREATE INDEX Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑаблиÑÑ. ÐÑи ÑÑом полноÑÑÑÑ Ð¸Ð³Ð½Ð¾ÑиÑÑеÑÑÑ Ð¼Ð¾Ð´ÐµÐ»Ñ ÑÑоимоÑÑи и maintenance_work_mem не влиÑÐµÑ Ð½Ð° опÑеделение колиÑеÑÑва паÑаллелÑнÑÑ
иÑполниÑелей. ÐÑли паÑамеÑÑÑ parallel_workers в ALTER TABLE пÑиÑваиваеÑÑÑ 0, паÑаллелÑное поÑÑÑоение индекÑов Ð´Ð»Ñ ÑÑой ÑаблиÑÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Ð¾ÑклÑÑаеÑÑÑ.
ÐодÑказка
ÐоÑле Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑа parallel_workers в Ñ
оде опÑимизаÑии поÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑов Ð¸Ð¼ÐµÐµÑ ÑмÑÑл ÑбÑоÑиÑÑ ÐµÐ³Ð¾. ÐÑо пÑедоÑвÑаÑÐ¸Ñ Ð½ÐµÐ¶ÐµÐ»Ð°ÑелÑнÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð»Ð°Ð½Ð¾Ð² запÑоÑов, Ñак как parallel_workers влиÑÐµÑ Ð½Ð° вÑе паÑаллелÑнÑе ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑаблиÑÑ.
ХоÑÑ CREATE INDEX Ñ Ñказанием CONCURRENTLY поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿Ð°ÑаллелÑное поÑÑÑоение без оÑобÑÑ
огÑаниÑений, ÑакÑиÑеÑки в паÑаллелÑном Ñежиме вÑполнÑеÑÑÑ ÑолÑко пеÑвое ÑканиÑование ÑаблиÑÑ.
ÐÐ»Ñ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа пÑименÑеÑÑÑ DROP INDEX.
Ðак и лÑÐ±Ð°Ñ Ð´Ð»Ð¸ÑелÑÐ½Ð°Ñ ÑÑанзакÑиÑ, опеÑаÑÐ¸Ñ CREATE INDEX Ñ ÑаблиÑей Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð²Ð»Ð¸ÑÑÑ Ð½Ð° возможноÑÑÑ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾ÑÑежей паÑаллелÑной опеÑаÑией VACUUM Ñ ÐºÐ°ÐºÐ¾Ð¹-либо дÑÑгой ÑаблиÑей.
РпÑедÑдÑÑиÑ
вÑпÑÑкаÑ
PostgreSQL Ñакже поддеÑживалÑÑ Ð¼ÐµÑод индекÑа R-деÑево. СейÑÐ°Ñ Ð¾Ð½ оÑÑÑÑÑÑвÑеÑ, Ñак как он не даÑÑ Ð·Ð½Ð°ÑиÑелÑнÑÑ
пÑеимÑÑеÑÑв по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ GiST. Указание USING rtree команда CREATE INDEX бÑÐ´ÐµÑ Ð¸Ð½ÑеÑпÑеÑиÑоваÑÑ ÐºÐ°Ðº USING gist, Ð´Ð»Ñ ÑпÑоÑÐµÐ½Ð¸Ñ Ð¿ÐµÑевода ÑÑаÑÑÑ
баз на GiST.
ÐаждÑй пÑоÑеÑÑ, вÑполнÑÑÑий опеÑаÑÐ¸Ñ CREATE INDEX, бÑÐ´ÐµÑ Ð²ÑдаваÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ Ñ
оде ÐµÑ Ð²ÑполнениÑ, оÑобÑажаемÑÑ Ð² пÑедÑÑавлении pg_stat_progress_create_index. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 27.4.4.
ÐÑимеÑÑ
Создание ÑникалÑного индекÑа-B-деÑева по ÑÑолбÑÑ title в ÑаблиÑе films:
CREATE UNIQUE INDEX title_idx ON films (title);
Создание ÑникалÑного индекÑа-B-деÑева по ÑÑолбÑÑ title Ñ Ð½ÐµÐºÐ»ÑÑевÑми ÑÑолбÑами director и rating в ÑаблиÑе films:
CREATE UNIQUE INDEX title_idx ON films (title) INCLUDE (director, rating);
Создание индекÑа B-деÑево без иÑклÑÑÐµÐ½Ð¸Ñ Ð´ÑбликаÑов:
CREATE INDEX title_idx ON films (title) WITH (deduplicate_items = off);
Создание индекÑа по вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ 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 не опиÑанÑ.