64.4. РеализаÑÐ¸Ñ #
Ð ÑÑом Ñазделе оÑвеÑаÑÑÑÑ Ð´ÐµÑали ÑеализаÑии индекÑа-B-деÑева, знание коÑоÑÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ Ð´Ð»Ñ ÑпеÑиалиÑÑов.
64.4.1. СÑÑÑкÑÑÑа B-деÑева #
ÐндекÑÑ-B-деÑевÑÑ Ð² Postgres Pro пÑедÑÑавлÑÑÑ Ñобой многоÑÑовневÑе иеÑаÑÑ Ð¸ÑеÑкие ÑÑÑÑкÑÑÑÑ, в коÑоÑÑÑ ÐºÐ°Ð¶Ð´Ñй ÑÑÐ¾Ð²ÐµÐ½Ñ Ð´ÐµÑева Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ ÐºÐ°Ðº двÑÑвÑзнÑй ÑпиÑок ÑÑÑаниÑ. ÐдинÑÑÐ²ÐµÐ½Ð½Ð°Ñ Ð¼ÐµÑаÑÑÑаниÑа индекÑа Ñ ÑаниÑÑÑ Ð² ÑикÑиÑованной позиÑии в наÑале пеÑвого Ñайла ÑегменÑа индекÑа. ÐÑе оÑÑалÑнÑе ÑÑÑаниÑÑ Ð´ÐµÐ»ÑÑÑÑ Ð½Ð° внÑÑÑенние и на лиÑÑовÑе. ÐиÑÑовÑе ÑÑÑаниÑÑ Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ Ð½Ð° Ñамом нижнем ÑÑовне деÑева. ÐÑе более вÑÑокие ÑÑовни ÑоÑÑоÑÑ Ð¸Ð· внÑÑÑÐµÐ½Ð½Ð¸Ñ ÑÑÑаниÑ. ÐиÑÑÐ¾Ð²Ð°Ñ ÑÑÑаниÑа ÑодеÑÐ¶Ð¸Ñ ÐºÐ¾ÑÑежи, ÑказÑваÑÑие на ÑÑÑоки в ÑаблиÑе, а внÑÑÑеннÑÑ ÑÑÑаниÑа â коÑÑежи, ÑказÑваÑÑие на ÑледÑÑÑий ÑÑÐ¾Ð²ÐµÐ½Ñ Ð² деÑеве. ÐбÑÑно лиÑÑовÑе ÑÑÑаниÑÑ ÑоÑÑавлÑÑÑ Ð¾ÐºÐ¾Ð»Ð¾ 99% вÑÐµÑ ÑÑÑÐ°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа. Ð Ð´Ð»Ñ ÑÐµÑ , и Ð´Ð»Ñ Ð´ÑÑÐ³Ð¸Ñ ÑÑÑÐ°Ð½Ð¸Ñ Ð¸ÑполÑзÑеÑÑÑ Ð¾Ð´Ð¸Ð½ ÑÑандаÑÑнÑй ÑоÑмаÑ, опиÑаннÑй в Разделе 70.6.
ÐовÑе лиÑÑовÑе ÑÑÑаниÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑÑÑ Ð² B-деÑево когда ÑÑÑеÑÑвÑÑÑÐ°Ñ Ð»Ð¸ÑÑÐ¾Ð²Ð°Ñ ÑÑÑаниÑа не Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¼ÐµÑÑиÑÑ Ð½Ð¾Ð²Ñй поÑÑÑпаÑÑий коÑÑеж. ÐÑи ÑÑом вÑполнÑеÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ ÑÑÑаниÑÑ, оÑвобождаÑÑÐ°Ñ Ð¼ÐµÑÑо на пеÑеполнивÑейÑÑ ÑÑÑаниÑе, пеÑеноÑÑ Ð¿Ð¾Ð´Ð¼Ð½Ð¾Ð¶ÐµÑÑво изнаÑалÑно ÑодеÑжаÑÐ¸Ñ ÑÑ Ð½Ð° ней ÑлеменÑов на новÑÑ ÑÑÑаниÑÑ. ÐÑи Ñазделении ÑÑÑаниÑÑ Ð² ÐµÑ ÑодиÑелÑÑкÑÑ ÑÑÑаниÑÑ Ñакже должна бÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð° ÑÑÑлка вниз, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑ Ð¿ÑоизвеÑÑи Ñазделение и ÑÑой ÑодиÑелÑÑкой ÑÑÑаниÑÑ. Разделение ÑÑÑÐ°Ð½Ð¸Ñ Â«ÐºÐ°Ñкадно поднимаеÑÑÑ Ð²Ð²ÐµÑÑ Â» ÑекÑÑÑивнÑм обÑазом. Ðогда же и коÑÐ½ÐµÐ²Ð°Ñ ÑÑÑаниÑа не Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¼ÐµÑÑиÑÑ Ð½Ð¾Ð²ÑÑ ÑÑÑÐ»ÐºÑ Ð²Ð½Ð¸Ð·, пÑоизводиÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ¾Ñневой ÑÑÑаниÑÑ. ÐÑи ÑÑом в ÑÑÑÑкÑÑÑÑ Ð´ÐµÑева добавлÑеÑÑÑ Ð½Ð¾Ð²Ñй ÑÑовенÑ, на коÑоÑом оказÑваеÑÑÑ Ð½Ð¾Ð²Ð°Ñ ÐºÐ¾ÑÐ½ÐµÐ²Ð°Ñ ÑÑÑаниÑа, ÑÑоÑÑÐ°Ñ Ð½Ð°Ð´ Ñой, ÑÑо бÑла коÑневой Ñанее.
64.4.2. ÐоÑÑ Ð¾Ð´ÑÑее Ñдаление индекÑнÑÑ ÐºÐ¾ÑÑежей #
Ð ÑеализаÑии индекÑов-B-деÑевÑев не ÑÑиÑÑваеÑÑÑ, ÑÑо в ÑÑеде MVCC Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÑколÑко веÑÑий одной логиÑеÑкой ÑÑÑоки ÑаблиÑÑ; Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа каждÑй коÑÑеж ÑвлÑеÑÑÑ Ð½ÐµÐ·Ð°Ð²Ð¸ÑимÑм обÑекÑом, ÑÑебÑÑÑим оÑделÑного ÑлеменÑа в индекÑе. ÐоÑÑежи «оÑÑабоÑаннÑÑ
веÑÑий» иногда могÑÑ Ð½Ð°ÐºÐ°Ð¿Ð»Ð¸Ð²Ð°ÑÑÑÑ, ÑÑо ÑÑеваÑо задеÑжками и замедлением пÑи вÑполнении запÑоÑов. ÐÑо обÑÑно пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¿Ñи нагÑÑзке Ñ Ð¿Ñеобладанием UPDATE, когда Ð´Ð»Ñ Ð±Ð¾Ð»ÑÑинÑÑва оÑделÑнÑÑ
опеÑаÑий Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
нелÑÐ·Ñ Ð¿ÑимениÑÑ Ð¾Ð¿ÑимизаÑÐ¸Ñ HOT. Ðзменение знаÑÐµÐ½Ð¸Ñ Ð´Ð°Ð¶Ðµ одного индекÑиÑÑемого ÑÑолбÑа во вÑÐµÐ¼Ñ UPDATE вÑегда ÑÑебÑÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ набоÑа индекÑнÑÑ
коÑÑежей â оÑделÑного коÑÑежа Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ индекÑа в ÑаблиÑе. Ðолее Ñого, обÑаÑиÑе внимание, ÑÑо новÑе коÑÑежи ÑÑебÑÑÑÑÑ Ð¸ Ð´Ð»Ñ ÑеÑ
индекÑов, коÑоÑÑе не бÑли «логиÑеÑки измененÑ» командой UPDATE. Ðо вÑеÑ
индекÑаÑ
бÑдÑÑ Ð½ÑÐ¶Ð½Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе ÑизиÑеÑкие коÑÑежи, ÑказÑваÑÑие на поÑледнÑÑ Ð²ÐµÑÑÐ¸Ñ ÑÑÑоки в ÑаблиÑе. ÐаждÑй новÑй коÑÑеж в каждом индекÑе, как пÑавило, должен ÑоÑÑÑеÑÑвоваÑÑ Ñ Ð¸ÑÑ
однÑм подвеÑгÑимÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÐºÐ¾ÑÑежем в ÑеÑение коÑоÑкого пеÑиода вÑемени (обÑÑно недолго поÑле ÑикÑаÑии ÑÑанзакÑии UPDATE).
РиндекÑаÑ
-B-деÑевÑÑÑ
поÑÑепенно ÑдалÑÑÑÑÑ ÐºÐ¾ÑÑежи оÑÑабоÑаннÑÑ
веÑÑий в Ñ
оде пÑоÑедÑÑÑ Ð²Ð¾ÑÑ
одÑÑего ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑнÑÑ
коÑÑежей. ÐаждÑй пÑоÑ
од пÑоÑедÑÑÑ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð²ÑзÑваеÑÑÑ, когда ожидаеÑÑÑ, ÑÑо пÑоизойдÑÑ Â«Ñазделение ÑÑÑÐ°Ð½Ð¸Ñ Ð¸Ð·-за оÑÑабаÑÑÐ²Ð°Ð½Ð¸Ñ Ð²ÐµÑÑий». ÐÑо каÑаеÑÑÑ ÑолÑко ÑеÑ
индекÑов, коÑоÑÑе не бÑли логиÑеÑки Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ Ð¾Ð¿ÐµÑаÑоÑами UPDATE, Ñак как именно в ниÑ
возможно конÑенÑÑиÑованное накопление ÑÑÑаÑевÑиÑ
веÑÑий на опÑеделÑннÑÑ
ÑÑÑаниÑаÑ
. РеализаÑÐ¸Ñ Ð¾Ð±ÑÑно ÑÑаÑаеÑÑÑ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ ÑÑÑаниÑ, Ñ
оÑÑ Ð²Ð¿Ð¾Ð»Ð½Ðµ возможно, ÑÑо опÑеделÑннÑе ÑеÑÐµÐ½Ð¸Ñ Ð½Ð° ÐµÑ ÑÑовне не позволÑÑ Ð¸Ð´ÐµÐ½ÑиÑиÑиÑоваÑÑ Ð¸ ÑдалиÑÑ Ð½Ð¸ одного мÑÑоÑного коÑÑежа в индекÑе (в ÑÑом ÑлÑÑае пÑоблема ÑазмеÑÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ коÑÑежа на заполненной лиÑÑовой ÑÑÑаниÑе ÑеÑаеÑÑÑ Ð¿ÑÑÑм ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ ÑÑÑаниÑÑ Ð¸Ð»Ð¸ в ÑезÑлÑÑаÑе иÑклÑÑÐµÐ½Ð¸Ñ Ð´ÑбликаÑов). ÐолÑÑое колиÑеÑÑво веÑÑий каждой оÑделÑной логиÑеÑкой ÑÑÑоки, коÑоÑое нÑжно пÑоÑиÑаÑÑ Ð¿Ñи каждом ÑканиÑовании индекÑа, ÑвлÑеÑÑÑ Ð²Ð°Ð¶Ð½Ñм оÑÑиÑаÑелÑнÑм ÑакÑоÑом обÑей пÑоизводиÑелÑноÑÑи и ÑкоÑоÑÑи оÑклика ÑиÑÑемÑ. ÐÑоÑедÑÑа воÑÑ
одÑÑего ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑнÑÑ
коÑÑежей вÑбиÑÐ°ÐµÑ Ð½Ð° лиÑÑовой ÑÑÑаниÑе пÑедположиÑелÑно мÑÑоÑнÑе коÑÑежи на оÑновании каÑеÑÑвеннÑÑ
Ñ
аÑакÑеÑиÑÑик, опÑеделÑемÑÑ
логиÑеÑкими ÑÑÑоками и веÑÑиÑми. ÐÑо оÑлиÑÐ°ÐµÑ ÐµÑ Ð¾Ñ Â«Ð½Ð¸ÑÑ
одÑÑей» ÑбоÑки индекÑа, вÑполнÑемой пÑоÑеÑÑами авÑооÑиÑÑки, коÑоÑÐ°Ñ Ð·Ð°Ð¿ÑÑкаеÑÑÑ Ð¿Ñи пÑевÑÑении опÑеделÑннÑÑ
колиÑеÑÑвеннÑÑ
поÑоговÑÑ
знаÑений на ÑÑовне ÑаблиÑÑ (Ñм. ÐодÑаздел 23.1.6).
ÐÑимеÑание
Ðе вÑе опеÑаÑии ÑдалениÑ, вÑполнÑемÑе в индекÑаÑ
-B-деÑевÑÑÑ
, ÑеализÑÑÑÑÑ Ð¿ÑоÑедÑÑой воÑÑ
одÑÑего ÑдалениÑ. СÑÑеÑÑвÑÐµÑ Ð´ÑÑÐ³Ð°Ñ ÐºÐ°ÑегоÑÐ¸Ñ ÑакиÑ
опеÑаÑий: пÑоÑÑое Ñдаление индекÑнÑÑ
коÑÑежей. ÐÑо оÑÐ»Ð¾Ð¶ÐµÐ½Ð½Ð°Ñ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ð¾Ð±ÑлÑживаниÑ, ÑдалÑÑÑÐ°Ñ Ð¸Ð½Ð´ÐµÐºÑнÑе коÑÑежи, о коÑоÑÑÑ
извеÑÑно, ÑÑо иÑ
можно безопаÑно ÑÑеÑеÑÑ (Ñо еÑÑÑ Ñе, Ð´Ð»Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑов коÑоÑÑÑ
ÑÑÑановлен Ð±Ð¸Ñ LP_DEAD). Ðак и воÑÑ
одÑÑее Ñдаление индекÑнÑÑ
коÑÑежей, пÑоÑÑое Ñдаление пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð² ÑÐ¾Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ, когда ожидаеÑÑÑ Ñазделение ÑÑÑаниÑÑ, Ð´Ð»Ñ Ð¿ÑедоÑвÑаÑÐµÐ½Ð¸Ñ ÑÑого ÑазделениÑ.
ÐÑоÑÑое Ñдаление вÑполнÑеÑÑÑ Ð¿Ð¾ возможноÑÑи в Ñом ÑмÑÑле, ÑÑо оно Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоизойÑи ÑолÑко пÑи ÑÑловии, ÑÑо в ÑезÑлÑÑаÑе недавниÑ
ÑканиÑований индекÑа бÑли ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ Ð±Ð¸ÑÑ LP_DEAD Ð´Ð»Ñ Ð¾Ð±ÑабоÑаннÑÑ
ÑлеменÑов. Ðо Postgres Pro 14 единÑÑвенной каÑегоÑией опеÑаÑий ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð² B-деÑеве бÑло пÑоÑÑое Ñдаление. ÐÑновное ÑазлиÑие Ð¼ÐµÐ¶Ð´Ñ Ð¿ÑоÑÑÑм и воÑÑ
одÑÑим Ñдалением заклÑÑаеÑÑÑ Ð² Ñом, ÑÑо ÑолÑко пеÑвое обÑÑловлено акÑивноÑÑÑÑ ÑканиÑований индекÑа, а вÑоÑое оÑиенÑиÑовано именно на акÑивноÑÑÑ Ð¾ÑÑабаÑÑÐ²Ð°Ð½Ð¸Ñ Ð²ÐµÑÑий, вÑзÑваемÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ð¼Ð¸ UPDATE, коÑоÑÑе не изменÑÑÑ Ð»Ð¾Ð³Ð¸ÑеÑки индекÑиÑованнÑе ÑÑолбÑÑ.
ÐÑи опÑеделÑнной нагÑÑзке воÑÑ
одÑÑее Ñдаление индекÑнÑÑ
коÑÑежей вÑполнÑÐµÑ Ð¾ÑновнÑÑ ÑабоÑÑ Ð¿Ð¾ ÑбоÑке мÑÑоÑнÑÑ
коÑÑежей из индекÑов. Такой ÑÑÑÐµÐºÑ Ð¾Ð¶Ð¸Ð´Ð°ÐµÑÑÑ Ð´Ð»Ñ Ð»Ñбого индекÑа-B-деÑева, коÑоÑÑй в знаÑиÑелÑной меÑе заÑÑагиваеÑÑÑ Ð°ÐºÑивноÑÑÑÑ Ð¾ÑÑабаÑÑÐ²Ð°Ð½Ð¸Ñ Ð²ÐµÑÑий из-за команд UPDATE, поÑÑи никогда не изменÑÑÑиÑ
логиÑеÑки ÑÑолбÑÑ, покÑÑваемÑе индекÑом. СÑеднее и наиболÑÑее колиÑеÑÑво веÑÑий Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸ÑеÑкой ÑÑÑоки Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑÑÑ Ð½Ð° низком ÑÑовне иÑклÑÑиÑелÑно за ÑÑÑÑ Ð¿Ð¾ÑÑоÑннÑÑ
ÑоÑеÑнÑÑ
пÑоÑ
одов ÑдалениÑ. Ðполне возможно, ÑÑо ÑÐ°Ð·Ð¼ÐµÑ Ð¾Ð¿ÑеделÑннÑÑ
индекÑов на диÑке никогда не ÑвелиÑиÑÑÑ Ð½Ð¸ на Ð¾Ð´Ð½Ñ ÑÑÑаниÑÑ/блок, неÑмоÑÑÑ Ð½Ð° поÑÑоÑнное оÑÑабаÑÑвание веÑÑий, вÑзÑваемое командами UPDATE. Ðо даже в ÑÑом ÑлÑÑае в конÑе конÑов поÑÑебÑеÑÑÑ Ð¿Ð¾Ð»Ð½Ð°Ñ Â«Ð·Ð°ÑиÑÑка» индекÑа пÑоÑедÑÑой VACUUM (обÑÑно запÑÑкаемой в ÑабоÑем пÑоÑеÑÑе авÑооÑиÑÑки) как ÑаÑÑÑ ÑовмеÑÑной ÑбоÑки ÑаблиÑÑ Ð¸ вÑеÑ
ÐµÑ Ð¸Ð½Ð´ÐµÐºÑов.
РоÑлиÑие Ð¾Ñ VACUUM, воÑÑ
одÑÑее Ñдаление не даÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ
надÑжнÑÑ
гаÑанÑий оÑноÑиÑелÑно возÑаÑÑа ÑÑаÑейÑего мÑÑоÑного индекÑного коÑÑежа. Ðи в одном индекÑе не допÑÑкаеÑÑÑ ÑоÑ
Ñанение «плаваÑÑиÑ
мÑÑоÑнÑÑ
» коÑÑежей, ÑÑавÑиÑ
мÑÑÑвÑми до конÑеÑваÑивной ÑоÑки оÑÑеÑениÑ, ÑвлÑÑÑейÑÑ Ð¾Ð±Ñей Ð´Ð»Ñ ÑаблиÑÑ Ð¸ вÑеÑ
ÐµÑ Ð¸Ð½Ð´ÐµÐºÑов. ÐÑÐ¾Ñ ÑÑндаменÑалÑнÑй инваÑÐ¸Ð°Ð½Ñ Ð½Ð° ÑÑовне ÑаблиÑÑ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð¾Ð±ÐµÑпеÑиваÑÑ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑнÑÑ ÑиÑкÑлÑÑÐ¸Ñ ÑаблиÑнÑÑ
иденÑиÑикаÑоÑов (TID). Ðменно Ñаким обÑазом ÑазнÑе логиÑеÑкие ÑÑÑоки могÑÑ Ð¿Ð¾Ð²ÑоÑно иÑполÑзоваÑÑ Ð¾Ð´Ð¸Ð½ и ÑÐ¾Ñ Ð¶Ðµ иденÑиÑикаÑÐ¾Ñ Ñ ÑеÑением вÑемени (Ñ
оÑÑ ÑÑо невозможно Ð´Ð»Ñ Ð´Ð²ÑÑ
логиÑеÑкиÑ
ÑÑÑок, вÑÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸ коÑоÑÑÑ
ÑкладÑваеÑÑÑ Ð² один и ÑÐ¾Ñ Ð¶Ðµ Ñикл VACUUM).
64.4.3. ÐÑклÑÑение дÑбликаÑов #
ÐÑбликаÑом назÑваеÑÑÑ ÐºÐ¾ÑÑеж на лиÑÑовой ÑÑÑаниÑе (коÑÑеж, ÑказÑваÑÑий на ÑÑÑÐ¾ÐºÑ ÑаблиÑÑ), Ñ ÐºÐ¾ÑоÑого вÑе клÑÑевÑе ÑÑолбÑÑ Ð¸Ð½Ð´ÐµÐºÑа имеÑÑ Ð·Ð½Ð°ÑениÑ, ÑооÑвеÑÑÑвÑÑÑие знаÑениÑм ÑÑолбÑов из как минимÑм одного дÑÑгого коÑÑежа на лиÑÑовой ÑÑÑаниÑе в Ñом же индекÑе. ÐÑблиÑÑÑÑиеÑÑ ÐºÐ¾ÑÑежи доволÑно ÑаÑÑо вÑÑÑеÑаÑÑÑÑ Ð½Ð° пÑакÑике. РиндекÑÐ°Ñ -B-деÑевÑÑÑ Ñакие дÑбликаÑÑ Ð¼Ð¾Ð³ÑÑ Ð¿ÑедÑÑавлÑÑÑÑÑ Ð¾ÑобÑм ÑкономиÑнÑм обÑазом пÑи вклÑÑении дополниÑелÑного Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð° â иÑклÑÑÐµÐ½Ð¸Ñ Ð´ÑбликаÑов.
РабоÑа ÑÑого Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð° заклÑÑаеÑÑÑ Ð² пеÑиодиÑеÑком обÑединении гÑÑпп дÑблиÑÑÑÑÐ¸Ñ ÑÑ ÐºÐ¾ÑÑежей и ÑоÑмиÑовании одного коÑÑежа Ñо ÑпиÑком иденÑиÑикаÑоÑов Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ гÑÑппÑ. Ð Ñаком пÑедÑÑавлении знаÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑевÑÑ ÑÑолбÑов Ñ ÑанÑÑÑÑ Ð² единÑÑвенном ÑкземплÑÑе, а за ними идÑÑ Ð¾ÑÑоÑÑиÑованнÑй маÑÑив иденÑиÑикаÑоÑов TID, ÑказÑваÑÑÐ¸Ñ Ð½Ð° ÑÑÑоки в ÑаблиÑе. ÐÑо ÑÑÑеÑÑвенно ÑменÑÑÐ°ÐµÑ ÑÐ°Ð·Ð¼ÐµÑ Ñ ÑанÑÑÐ¸Ñ ÑÑ Ð¸Ð½Ð´ÐµÐºÑов, в коÑоÑÑÑ ÐºÐ°Ð¶Ð´Ð¾Ðµ знаÑение (или каждое ÑникалÑное ÑоÑеÑание знаÑений ÑÑолбÑов) поÑвлÑеÑÑÑ Ð² ÑÑеднем неÑколÑко Ñаз. Ð ÑезÑлÑÑаÑе Ð¼Ð¾Ð¶ÐµÑ Ð·Ð½Ð°ÑиÑелÑно ÑвелиÑиÑÑÑÑ ÑкоÑоÑÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов, а Ñакже могÑÑ ÑокÑаÑиÑÑÑÑ Ð¸Ð·Ð´ÐµÑжки, ÑвÑзаннÑе Ñ ÑегÑлÑÑной оÑиÑÑкой индекÑов.
ÐÑимеÑание
ÐÑклÑÑение дÑбликаÑов в B-деÑеве ÑабоÑÐ°ÐµÑ ÑÑÑекÑивно и Ñ Â«Ð´ÑбликаÑами», ÑодеÑжаÑими знаÑение NULL, неÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо знаÑÐµÐ½Ð¸Ñ NULL не ÑÑиÑаÑÑÑÑ ÑавнÑми Ð¼ÐµÐ¶Ð´Ñ Ñобой ÑоглаÑно опеÑаÑоÑам =, вÑ
одÑÑим в клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов btree. ÐÑо обÑÑÑнÑеÑÑÑ Ñем, ÑÑо Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ ÑеализаÑии, ÑабоÑаÑÑей Ñ Ð²Ð½ÑÑÑенним пÑедÑÑавлением ÑÑÑÑкÑÑÑÑ B-деÑева, NULL ÑвлÑеÑÑÑ Ð¿ÑоÑÑо одним из ÑлеменÑов множеÑÑва вÑеÑ
возможнÑÑ
знаÑений в индекÑе.
ÐÑоÑеÑÑ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ Ð´ÑбликаÑов оÑÑÑеÑÑвлÑеÑÑÑ Ð¿Ð¾ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи, когда вÑÑавлÑеÑÑÑ Ð½Ð¾Ð²Ñй ÑлеменÑ, не ÑмеÑаÑÑийÑÑ Ð½Ð° ÑÑÑеÑÑвÑÑÑей лиÑÑовой ÑÑÑаниÑе, но ÑолÑко Ñогда, когда Ñдаление индекÑного коÑÑежа не Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑвободиÑÑ Ð´Ð¾ÑÑаÑоÑно меÑÑа Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ÑлеменÑа (обÑÑно Ñдаление недолго ÑаÑÑмаÑÑиваеÑÑÑ, а заÑем пÑопÑÑкаеÑÑÑ). РоÑлиÑие Ð¾Ñ ÐºÐ¾ÑÑежей Ñо ÑпиÑками иденÑиÑикаÑоÑов GIN, в B-деÑеве ÑÑи коÑÑежи не Ð´Ð¾Ð»Ð¶Ð½Ñ ÑаÑÑиÑÑÑÑÑÑ Ð¿Ñи каждом добавлении нового дÑбликаÑа; они пÑоÑÑо обÑазÑÑÑ Ð´ÑÑгое ÑизиÑеÑкое пÑедÑÑавление иÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ логиÑеÑкого ÑодеÑжимого лиÑÑовой ÑÑÑаниÑÑ. ÐÑи Ñаком Ð¿Ð¾Ð´Ñ Ð¾Ð´Ðµ обеÑпеÑиваеÑÑÑ ÑÑабилÑÐ½Ð°Ñ Ð¿ÑоизводиÑелÑноÑÑÑ Ð¿Ñи ÑмеÑанной нагÑÑзке ÑÑениÑ-запиÑи. ÐÑклÑÑение дÑбликаÑов должно даÑÑ ÐºÐ°Ðº минимÑм замеÑное ÑвелиÑение пÑоизводиÑелÑноÑÑи Ð´Ð»Ñ Ð±Ð¾Ð»ÑÑинÑÑва клиенÑÑÐºÐ¸Ñ Ð¿Ñиложений. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¾Ð½Ð¾ вклÑÑено.
ÐÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE INDEX и REINDEX Ñакже вÑполнÑÑÑ Ð¸ÑклÑÑение дÑбликаÑов, ÑÐ¾Ð·Ð´Ð°Ð²Ð°Ñ ÐºÐ¾ÑÑежи Ñо ÑпиÑками иденÑиÑикаÑоÑов, но пÑименÑÑÑ Ð½ÐµÑколÑко дÑÑгÑÑ ÑÑÑаÑегиÑ. ÐÐ°Ð¶Ð´Ð°Ñ Ð³ÑÑппа дÑблиÑÑÑÑиÑ
ÑÑ Ð¾Ð±ÑÑнÑÑ
коÑÑежей, обнаÑÑженнÑÑ
в оÑÑоÑÑиÑованнÑÑ
даннÑÑ
, пÑеобÑазÑеÑÑÑ Ð² коÑÑеж Ñо ÑпиÑком иденÑиÑикаÑоÑов до Ñого, как даннÑе добавлÑÑÑÑÑ Ð² ÑекÑÑÑÑ Ð»Ð¸ÑÑовÑÑ ÑÑÑаниÑÑ. ÐÑи ÑÑом в каждÑй Ñакой коÑÑеж ÑпаковÑваеÑÑÑ ÐºÐ°Ðº можно болÑÑе иденÑиÑикаÑоÑов (TID). ÐоÑле ÑÑого лиÑÑовÑе ÑÑÑаниÑÑ Ð·Ð°Ð¿Ð¸ÑÑваÑÑÑÑ Ð¾Ð±ÑÑнÑм ÑпоÑобом, без дополниÑелÑного пÑоÑ
ода Ð´Ð»Ñ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ Ð´ÑбликаÑов. ÐÑа ÑÑÑаÑÐµÐ³Ð¸Ñ Ð¿Ð¾Ð´Ñ
Ð¾Ð´Ð¸Ñ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ CREATE INDEX и REINDEX, Ñак как они обÑабаÑÑваÑÑ Ð²Ñе даннÑе ÑÑазÑ.
ÐÑли же в пÑоÑиле нагÑÑзки пÑÐµÐ¾Ð±Ð»Ð°Ð´Ð°ÐµÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð¸ иÑклÑÑение дÑбликаÑов не пÑиноÑÐ¸Ñ Ð²ÑигÑÑÑа Ð²Ð²Ð¸Ð´Ñ Ð¾ÑÑÑÑÑÑÐ²Ð¸Ñ Ð¸Ð»Ð¸ неболÑÑого ÑиÑла дÑблиÑÑÑÑиÑ
ÑÑ Ð·Ð½Ð°Ñений, ÑÑÐ¾Ñ Ð¼ÐµÑ
анизм Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑодиÑÑ Ð½ÐµÐ±Ð¾Ð»ÑÑие поÑÑоÑннÑе издеÑжки (еÑли он не оÑклÑÑÑн). Ð ÑакиÑ
ÑлÑÑаÑÑ
его можно оÑклÑÑиÑÑ Ð´Ð»Ñ Ð¾ÑделÑнÑÑ
индекÑов Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¿Ð°ÑамеÑÑа Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ deduplicate_items. ÐÑи нагÑÑзке ÑолÑко на ÑÑение никакие дополниÑелÑнÑе издеÑжки не возникаÑÑ, Ñак как коÑÑежи Ñо ÑпиÑком иденÑиÑикаÑоÑов ÑиÑаÑÑÑÑ Ñак же ÑÑÑекÑивно, как и коÑÑежи в ÑÑандаÑÑном пÑедÑÑавлении. ÐоÑÑÐ¾Ð¼Ñ ÑаÑе вÑего оÑклÑÑение ÑÑого меÑ
анизма не бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñм.
ÐÑклÑÑение дÑбликаÑов иногда Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ ÑникалÑнÑÑ Ð¸Ð½Ð´ÐµÐºÑов (а Ñакже ÑникалÑнÑÑ Ð¾Ð³ÑаниÑений). ÐлагодаÑÑ ÑÑÐ¾Ð¼Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе дÑбликаÑÑ Ð¾ÑÑабоÑаннÑÑ Ð²ÐµÑÑий могÑÑ Ð²Ñеменно «поглоÑаÑÑÑÑ» лиÑÑовÑми ÑÑÑаниÑами. ÐÑклÑÑение дÑбликаÑов в ÑникалÑнÑÑ Ð¸Ð½Ð´ÐµÐºÑÐ°Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÑÐµÑ Ð²Ð¾ÑÑ Ð¾Ð´ÑÑее Ñдаление индекÑнÑÑ ÐºÐ¾ÑÑежей, оÑобенно в ÑÐµÑ ÑлÑÑаÑÑ , когда длиÑелÑÐ½Ð°Ñ ÑÑанзакÑÐ¸Ñ Ð´ÐµÑÐ¶Ð¸Ñ Ñнимок, пÑепÑÑÑÑвÑÑÑий ÑбоÑке мÑÑоÑа. Тем ÑамÑм вÑигÑÑваеÑÑÑ Ð²ÑÐµÐ¼Ñ Ð´Ð»Ñ Ð²Ð¾ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑÑекÑивноÑÑи ÑÑÑаÑегии воÑÑ Ð¾Ð´ÑÑего ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑнÑÑ ÐºÐ¾ÑÑежей. ÐÑкладÑвание ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ ÑÑÑÐ°Ð½Ð¸Ñ Ð´Ð¾ еÑÑеÑÑвенного завеÑÑÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð¹ длиÑелÑной ÑÑанзакÑии позволÑÐµÑ ÑÑпеÑно пÑоизвеÑÑи пÑÐ¾Ñ Ð¾Ð´ воÑÑ Ð¾Ð´ÑÑего ÑдалениÑ, коÑоÑÑй Ñанее бÑл невозможен.
ÐодÑказка
ÐÐ»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑи пÑовеÑÑи пÑоÑедÑÑÑ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ Ð´ÑбликаÑов в ÑникалÑном индекÑе пÑименÑÑÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе ÑообÑажениÑ. Ð ÑакиÑ
индекÑаÑ
как пÑавило можно пеÑейÑи ÑÑÐ°Ð·Ñ Ðº ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð»Ð¸ÑÑовой ÑÑÑаниÑÑ, не ÑаÑÑ
одÑÑ Ð»Ð¸Ñние ÑÐ¸ÐºÐ»Ñ Ð½Ð° беÑполезнÑе пÑоÑ
Ð¾Ð´Ñ Ð² поиÑке дÑбликаÑов. ÐÑли Ð²Ð°Ñ Ð±ÐµÑпокоÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñе издеÑжки, коÑоÑÑе могÑÑ Ð±ÑÑÑ ÑвÑÐ·Ð°Ð½Ñ Ñ Ð¸ÑклÑÑением дÑбликаÑов, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑÑÑановиÑÑ Ð·Ð½Ð°Ñение deduplicate_items = off Ð´Ð»Ñ Ð¾ÑделÑнÑÑ
индекÑов. Ðднако его вполне можно оÑÑавиÑÑ Ð²ÐºÐ»ÑÑÑннÑм и Ð´Ð»Ñ ÑникалÑнÑÑ
индекÑов.
ÐÑклÑÑение дÑбликаÑов Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð½Ðµ вÑегда Ð²Ð²Ð¸Ð´Ñ Ð¾Ð³ÑаниÑений на ÑÑовне ÑеализаÑии. ÐозможноÑÑÑ ÐµÐ³Ð¾ пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÑеделÑеÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ CREATE INDEX или REINDEX.
УÑÑиÑе, ÑÑо иÑклÑÑение дÑбликаÑов ÑÑиÑаеÑÑÑ Ð½ÐµÐ±ÐµÐ·Ð¾Ð¿Ð°ÑнÑм и не Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð² ÑледÑÑÑÐ¸Ñ ÑлÑÑаÑÑ , когда Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ ÑеманÑиÑеÑкие ÑазлиÑÐ¸Ñ ÑавнÑÑ Ð·Ð½Ð°Ñений:
ÐÑклÑÑение дÑбликаÑов не Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ñ Ñипами
text,varcharиcharв ÑлÑÑае иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÐ´ÐµÑеÑминиÑованнÑÑ Ð¿Ñавил ÑоÑÑиÑовки, Ñак как в ÑавнÑÑ Ð·Ð½Ð°ÑениÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÐ¾Ñ ÑанÑÑÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñе ÑазлиÑÐ¸Ñ Ð² ÑегиÑÑÑе и диакÑиÑиÑеÑÐºÐ¸Ñ Ð·Ð½Ð°ÐºÐ°Ñ .ÐÑклÑÑение дÑбликаÑов невозможно Ñ Ñипом
numeric, Ñак как Ð´Ð»Ñ ÑавнÑÑ Ð·Ð½Ð°Ñений должен ÑÐ¾Ñ ÑанÑÑÑÑÑ ÑиÑловой маÑÑÑаб, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑазнÑм.ÐÑклÑÑение дÑбликаÑов не Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ñ Ñипом
jsonb, Ñак как внÑÑÑи клаÑÑа опеÑаÑоÑов B-деÑеваjsonbиÑполÑзÑеÑÑÑ Ñипnumeric.ÐÑклÑÑение дÑбликаÑов невозможно Ð´Ð»Ñ Ñипов
float4иfloat8. Ð ÑÑÐ¸Ñ ÑÐ¸Ð¿Ð°Ñ Ð¸Ð¼ÐµÑÑÑÑ ÑазнÑе пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñений-0и0, коÑоÑÑе пÑи ÑÑом ÑÑиÑаÑÑÑÑ ÑавнÑми. Ðднако оÑлиÑие Ð¼ÐµÐ¶Ð´Ñ Ð½Ð¸Ð¼Ð¸ должно ÑÐ¾Ñ ÑанÑÑÑÑÑ.
ÐмееÑÑÑ ÐµÑÑ Ð¾Ð´Ð½Ð¾ огÑаниÑение на ÑÑовне ÑеализаÑии, коÑоÑое Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑнÑÑо в бÑдÑÑÐ¸Ñ Ð²ÐµÑÑиÑÑ Postgres Pro:
ÐÑклÑÑение дÑбликаÑов невозможно Ñ Ñипами-конÑейнеÑами (ÑÑо ÑоÑÑавнÑе, диапазоннÑе ÑипÑ, а Ñакже маÑÑивÑ).
ÐÑÑÑ ÐµÑÑ Ð¾Ð´Ð½Ð¾ огÑаниÑение на ÑÑовне ÑеализаÑии, дейÑÑвÑÑÑее вне завиÑимоÑÑи Ð¾Ñ Ð¿ÑименÑемого клаÑÑа опеÑаÑоÑов или пÑавила ÑоÑÑиÑовки:
ÐÑклÑÑение дÑбликаÑов не Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð² индекÑÐ°Ñ Ñ
INCLUDE.