Postgres- ဖောင်သပလခဌင်သ၊ pg_repack နဟင့် ရလဟေ့ဆိုင်သကန့်သတ်ချက်မျာသ

Postgres- ဖောင်သပလခဌင်သ၊ pg_repack နဟင့် ရလဟေ့ဆိုင်သကန့်သတ်ချက်မျာသ

ဇယာသမျာသနဟင့် အညလဟန်သမျာသပေါ်တလင် ဖောင်သပလခဌင်သ၏အကျိုသသက်ရောက်မဟုကို ကျယ်ကျယ်ပဌန့်ပဌန့်သိရဟိပဌီသ Postgres တလင်သာမကဘဲ ရဟိနေပါသည်။ VACUUM FULL သို့မဟုတ် CLUSTER ကဲ့သို့ ၎င်သကို ဘောက်စ်ပဌင်ပတလင် ကိုင်တလယ်ဖဌေရဟင်သရန် နည်သလမ်သမျာသ ရဟိသည်၊ သို့သော် ၎င်သတို့သည် လည်ပတ်နေစဉ်အတလင်သ စာသပလဲမျာသကို သော့ခတ်ထာသသောကဌောင့် အမဌဲတမ်သ အသုံသမပဌုနိုင်ပါ။

ဆောင်သပါသတလင် ဖောင်သပလမဟုဖဌစ်ပလာသပုံ၊ ၎င်သကို သင်မည်ကဲ့သို့ တိုက်ဖျက်နိုင်သနည်သ၊ ရလဟေ့ဆိုင်သထာသသော ကန့်သတ်ချုပ်ချယ်မဟုမျာသနဟင့် pg_repack တိုသချဲ့မဟုကို အသုံသပဌုခဌင်သအတလက် ၎င်သတို့ယူဆောင်လာသည့် ပဌဿနာမျာသအကဌောင်သ သီအိုရီအနည်သငယ်ပါရဟိသည်။

ဒီဆောင်သပါသကို အခဌေခံပဌီသ ရေသထာသတာပါ။ ငါ့စကာသ PgConf.Russia 2020 တလင်

ဝမ်သချုပ်ခဌင်သ ဘာကဌောင့်ဖဌစ်တာလဲ။

Postgres သည် ဗာသရဟင်သပေါင်သစုံ မော်ဒယ်ကို အခဌေခံသည် (MVCC) ၎င်သ၏ အနဟစ်သာရမဟာ ဇယာသရဟိ အတန်သတစ်ခုစီတလင် ဗာသရဟင်သမျာသစလာရဟိနိုင်ပဌီသ ငလေပေသငလေယူမျာသသည် ကဗာသရဟင်သမျာသထဲမဟ တစ်ခုထက် မပိုဘဲ တူညီနေမည်မဟုတ်ပေ။ ၎င်သသည် ငလေပေသငလေယူမျာသစလာကို တစ်ပဌိုင်နက် လုပ်ဆောင်နိုင်စေပဌီသ တစ်ခုနဟင့်တစ်ခု ထိခိုက်မဟု မရဟိသလောက်ဖဌစ်သည်။

ရဟင်သပါတယ်၊ ဒီဗာသရဟင်သအာသလုံသကို သိမ်သဆည်သထာသဖို့ လိုပါတယ်။ Postgres သည် စာမျက်နဟာတစ်ခုပဌီသတစ်ခု မဟတ်ဉာဏ်ဖဌင့် အလုပ်လုပ်ပဌီသ စာမျက်နဟာတစ်ခုသည် ဒစ်ခ်မဟ သို့မဟုတ် စာဖဌင့်ဖတ်နိုင်သည့် အနည်သဆုံသဒေတာပမာဏဖဌစ်သည်။ ဒီလိုဖဌစ်သလာသတာကို နာသလည်ဖို့ ဥပမာလေသတစ်ခုကို ကဌည့်ရအောင်။

ကျလန်ုပ်တို့တလင် မဟတ်တမ်သမျာသစလာထည့်ထာသသော ဇယာသတစ်ခုရဟိသည် ဆိုကဌပါစို့။ ဇယာသကို သိမ်သဆည်သထာသသည့် ဖိုင်၏ ပထမစာမျက်နဟာတလင် ဒေတာအသစ် ပေါ်လာသည်။ ၎င်သတို့သည် ကတိပဌုပဌီသနောက် အခဌာသငလေပေသငလေယူမျာသအတလက် ရရဟိနိုင်သော တိုက်ရိုက်ဗာသရဟင်သအတန်သမျာသဖဌစ်သည် (ရိုသရိုသရဟင်သရဟင်သအတလက်၊ သီသခဌာသခလဲထုတ်မဟုအဆင့်သည် Read Committed ဟု ကျလန်ုပ်တို့ ယူဆပါမည်)။

Postgres- ဖောင်သပလခဌင်သ၊ pg_repack နဟင့် ရလဟေ့ဆိုင်သကန့်သတ်ချက်မျာသ

ထို့နောက် ထည့်သလင်သမဟုမျာသထဲမဟ တစ်ခုကို အပ်ဒိတ်လုပ်ကာ ဗာသရဟင်သဟောင်သကို မသက်ဆိုင်တော့ကဌောင်သ အမဟတ်အသာသပဌုပါသည်။

Postgres- ဖောင်သပလခဌင်သ၊ pg_repack နဟင့် ရလဟေ့ဆိုင်သကန့်သတ်ချက်မျာသ

တစ်ဆင့်ပဌီသတစ်ဆင့်၊ အတန်သဗာသရဟင်သမျာသကို အဆင့်မဌဟင့်တင်ခဌင်သနဟင့် ဖျက်ခဌင်သ၊ ဒေတာတစ်ဝက်ခန့်သည် "အမဟိုက်" ဖဌစ်သည့် စာမျက်နဟာတစ်ခုဖဌင့် အဆုံသသတ်ခဲ့သည်။ ကဒေတာကို မည်သည့်ငလေကဌေသလလဟဲပဌောင်သမဟုတလင်မျဟ မမဌင်နိုင်ပါ။

Postgres- ဖောင်သပလခဌင်သ၊ pg_repack နဟင့် ရလဟေ့ဆိုင်သကန့်သတ်ချက်မျာသ

Postgres တလင် ယန္တရာသတစ်ခုရဟိသည်။ အနုပညာအသုံသမပဌုတော့သော ဗာသရဟင်သမျာသကို ရဟင်သထုတ်ပဌီသ ဒေတာအသစ်အတလက် နေရာပေသသည်။ သို့သော် ၎င်သကို ပဌင်သပဌင်သထန်ထန် မပဌင်ဆင်ရသေသပါက သို့မဟုတ် အခဌာသဇယာသမျာသတလင် အလုပ်မျာသနေပါက၊ "အမဟိုက်ဒေတာ" ကျန်ရဟိနေပဌီသ ဒေတာအသစ်အတလက် နောက်ထပ်စာမျက်နဟာမျာသကို အသုံသပဌုရမည်ဖဌစ်သည်။

ထို့ကဌောင့် ကျလန်ုပ်တို့၏ဥပမာတလင်၊ တစ်ချိန်ချိန်တလင် ဇယာသတလင် စာမျက်နဟာလေသမျက်နဟာပါလိမ့်မည်၊ သို့သော် ၎င်သတလင် တစ်ဝက်သာသော တိုက်ရိုက်ဒေတာပါရဟိသည်။ ရလဒ်အနေဖဌင့်၊ ဇယာသကိုဝင်ရောက်သောအခါ၊ ကျလန်ုပ်တို့သည် လိုအပ်သည်ထက်ပို၍ အချက်အလက်မျာသစလာကို ဖတ်ပါမည်။

Postgres- ဖောင်သပလခဌင်သ၊ pg_repack နဟင့် ရလဟေ့ဆိုင်သကန့်သတ်ချက်မျာသ

ယခု VACUUM သည် မသက်ဆိုင်သောအတန်သဗာသရဟင်သအာသလုံသကို ဖျက်လိုက်လျဟင်ပင်၊ အခဌေအနေ သိသိသာသာ ကောင်သမလန်လာမည်မဟုတ်ပါ။ အတန်သသစ်အတလက် စာမျက်နဟာမျာသ သို့မဟုတ် စာမျက်နဟာတစ်ခုလုံသတလင် နေရာလလတ်ရဟိမည်ဖဌစ်သော်လည်သ လိုအပ်သည်ထက်ပို၍ ဒေတာကို ကျလန်ုပ်တို့ ဆက်လက်ဖတ်ရဟုနေပါမည်။
စကာသမစပ်၊ ဖိုင်၏အဆုံသတလင် လုံသဝဗလာဖဌစ်နေသည် (ကျလန်ုပ်တို့၏ဥပမာရဟိ ဒုတိယစာမျက်နဟာ) ဖဌစ်ပါက VACUUM သည် ၎င်သကိုချုံ့နိုင်မည်ဖဌစ်သည်။ ယခုမူ သူမသည် အလယ်တလင်ရဟိနေပဌီဖဌစ်သောကဌောင့် သူမအတလက် ဘာမဟလုပ်မပေသနိုင်ပါ။

Postgres- ဖောင်သပလခဌင်သ၊ pg_repack နဟင့် ရလဟေ့ဆိုင်သကန့်သတ်ချက်မျာသ

ထိုကဲ့သို့ ဗလာ သို့မဟုတ် အလလန်ကျဲသော စာမျက်နဟာအရေအတလက် ကဌီသမာသလာသောအခါ၊ bloat ဟုခေါ်သော၊ ၎င်သသည် စလမ်သဆောင်ရည်ကို စတင်သက်ရောက်ပါသည်။

အထက်ဖော်ပဌပါအရာအာသလုံသသည် ဇယာသမျာသတလင် ဖောင်သပလမဟုဖဌစ်ပေါ်ခဌင်သ၏ စက်ပဌင်ဖဌစ်သည်။ အညလဟန်သကိန်သမျာသတလင် ကနည်သအတိုင်သပင် ဖဌစ်တတ်ပါသည်။

ငါ့မဟာ ဖောင်သနေသလာသ

သင့်တလင် ဝမ်သချုပ်ခဌင်သရဟိမရဟိ ဆုံသဖဌတ်ရန် နည်သလမ်သမျာသစလာရဟိပါသည်။ ပထမအကဌံဥာဏ်မဟာ ဇယာသမျာသရဟိ အတန်သအရေအတလက်၊ တိုက်ရိုက်ထုတ်လလဟင့်သည့် အတန်သအရေအတလက်စသည်ဖဌင့် အနီသစပ်ဆုံသအချက်အလက်မျာသပါရဟိသော ပဌည်တလင်သ Postgres စာရင်သအင်သမျာသကို အသုံသပဌုရန်ဖဌစ်သည်။ အင်တာနက်ပေါ်တလင် အသင့်လုပ်ထာသသော script အမျာသအပဌာသကို သင်ရဟာတလေ့နိုင်ပါသည်။ အခဌေခံအဖဌစ်ယူတယ်။ ဇာတ်ညလဟန်သ Toast နဟင့် bloat btree အညလဟန်သမျာသနဟင့်အတူ bloat table မျာသကိုအကဲဖဌတ်နိုင်သည့် PostgreSQL ကျလမ်သကျင်သူမျာသမဟ။ ကျလန်ုပ်တို့၏အတလေ့အကဌုံအရ၊ ၎င်သ၏အမဟာသသည် 10-20% ဖဌစ်သည်။

နောက်တနည်သကတော့ Extension ကိုသုံသဖို့ပါ။ pgstattuple၎င်သသည် စာမျက်နဟာမျာသအတလင်သ ကဌည့်ရဟုနိုင်ပဌီသ ခန့်မဟန်သခဌေနဟင့် အတိအကျ ဖောင်သပလမဟုတန်ဖိုသ နဟစ်ခုစလုံသကို ရရဟိနိုင်သည်။ သို့သော် ဒုတိယကိစ္စတလင်၊ သင်သည် ဇယာသတစ်ခုလုံသကို စကင်န်ဖတ်ရမည်ဖဌစ်သည်။

ကျလန်ုပ်တို့သည် 20% အထိ လက်ခံနိုင်သော သေသငယ်သော bloat တန်ဖိုသကို သုံသသပ်ပါသည်။ ၎င်သကို fillfactor ၏ analogue အဖဌစ် ယူဆနိုင်သည်။ ဇယာသ О အညလဟန်သကိန်သမျာသ. 50% နဟင့်အထက်တလင်၊ စလမ်သဆောင်ရည်ပဌဿနာမျာသစတင်နိုင်သည်။

ဝမ်သချုပ်ခဌင်သကို တိုက်ဖျက်နည်သမျာသ

Postgres သည် ဘောက်ထဲက ဝမ်သပျက်ခဌင်သကို ကိုင်တလယ်ဖဌေရဟင်သရန် နည်သလမ်သမျာသစလာရဟိသော်လည်သ ၎င်သတို့သည် လူတိုင်သအတလက် အမဌဲတမ်သ မသင့်လျော်ပါ။

ဖောင်သခဌင်သမဖဌစ်ပေါ်စေရန် AUTOVACUUM ကို စီစဉ်သတ်မဟတ်ပါ။. သို့မဟုတ် ပို၍တိကျစလာ၊ ၎င်သကို သင့်လက်ခံနိုင်သော အဆင့်တလင် ထာသရဟိရန်။ ၎င်သသည် "ကပ္ပတိန်၏" အကဌံဉာဏ်နဟင့်တူပုံရသည်၊ သို့သော်လက်တလေ့တလင်၎င်သသည်အောင်မဌင်ရန်အမဌဲတမ်သမလလယ်ကူပါ။ ဥပမာအာသဖဌင့်၊ သင့်တလင် ဒေတာအစီအစဉ်ကို ပုံမဟန်ပဌောင်သလဲမဟုမျာသဖဌင့် တက်ကဌလစလာ ဖလံ့ဖဌိုသတိုသတက်မဟုရဟိသည်၊ သို့မဟုတ် အချို့သောဒေတာရလဟေ့ပဌောင်သမဟုမျိုသ လုပ်ဆောင်နေပါသည်။ ရလဒ်အနေဖဌင့်၊ သင်၏ load profile သည် မကဌာခဏ ပဌောင်သလဲနိုင်ပဌီသ ပုံမဟန်အာသဖဌင့် ဇယာသတစ်ခုမဟ တစ်ခုသို့ ကလဲပဌာသလိမ့်မည်။ ဆိုလိုသည်မဟာ သင်သည် အနည်သငယ် ရဟေ့သို့ အဆက်မပဌတ် လုပ်ဆောင်ပဌီသ ဇယာသတစ်ခုစီ၏ ပဌောင်သလဲနေသော ပရိုဖိုင်သို့ AUTOVACUUM ကို ချိန်ညဟိရန် လိုအပ်သည်။ ဒါပေမယ့် ဒီလိုလုပ်ရတာ မလလယ်ဘူသဆိုတာ သိသာပါတယ်။

AUTOVACUUM သည် ဇယာသမျာသကို လိုက်မမီနိုင်ရသည့် အကဌောင်သရင်သမဟာ ထိုငလေပေသငလေယူမျာသအတလက် ရရဟိနိုင်သော ဒေတာမျာသကို ရဟင်သထုတ်ခဌင်သမဟ ဟန့်တာသသော ကာလရဟည်ကဌာ ငလေပေသငလေယူမဟုမျာသ ရဟိနေသောကဌောင့် ဖဌစ်သည်။ ကနေရာတလင် အကဌံပဌုချက်မဟာလည်သ သိသာထင်ရဟာသသည် - “dangling” အရောင်သအ၀ယ်မျာသကို ဖယ်ရဟာသပဌီသ တက်ကဌလသော အရောင်သအ၀ယ်ပဌုလုပ်သည့်အချိန်ကို လျဟော့ချပါ။ သို့သော် သင့်လျဟောက်လလဟာတလင် load သည် OLAP နဟင့် OLTP တို့၏ ပေါင်သစပ်တစ်ခုဖဌစ်ပါက၊ သင်သည် တပဌိုင်နက်တလင် မကဌာခဏ အပ်ဒိတ်မျာသနဟင့် တိုတောင်သသော စုံစမ်သမေသမဌန်သမဟုမျာသအပဌင် ရေရဟည်လုပ်ဆောင်မဟုမျာသ အမျာသအပဌာသရဟိသည် - ဥပမာ၊ အစီရင်ခံစာတစ်ခုကို တည်ဆောက်ခဌင်သ။ ထိုသို့သောအခဌေအနေမျိုသတလင်၊ ၎င်သတို့တစ်ခုစီကို ပိုမိုကောင်သမလန်စလာချိန်ညဟိနိုင်စေမည့် မတူညီသောအခဌေမျာသတစ်လျဟောက် ဝန်ကိုဖဌန့်ကဌက်ရန် စဉ်သစာသသင့်သည်။

အခဌာသဥပမာ- ပရိုဖိုင်သည် တစ်သာသတည်သဖဌစ်နေလျဟင်ပင်၊ သို့သော် ဒေတာဘေ့စ်သည် အလလန်မဌင့်မာသသောဝန်အောက်တလင် ရဟိနေသည်၊ ထို့နောက် အပဌင်သထန်ဆုံသသော AUTOVACUUM သည်ပင် ထိန်သမနိုင်ဖဌစ်ပဌီသ ဖောင်သကာသလာမည်ဖဌစ်သည်။ အတိုင်သအတာ (ဒေါင်လိုက် သို့မဟုတ် အလျာသလိုက်) သည် တစ်ခုတည်သသော ဖဌေရဟင်သချက်ဖဌစ်သည်။

AUTOVACUUM ကို တပ်ဆင်ထာသသည့် အခဌေအနေတလင် ဘာလုပ်ရမည်နည်သ။

အဖလဲ့ ဖုန်စုပ်စက် အပဌည့် ဇယာသမျာသနဟင့် အညလဟန်သကိန်သမျာသ၏ အကဌောင်သအရာမျာသကို ပဌန်လည်တည်ဆောက်ပဌီသ ၎င်သတို့တလင် သက်ဆိုင်ရာ အချက်အလက်မျာသကိုသာ ချန်ထာသသည်။ ဖောင်သပလမဟုကို ဖယ်ရဟာသရန်၊ ၎င်သသည် ပဌီသပဌည့်စုံစလာ လုပ်ဆောင်နိုင်သော်လည်သ ၎င်သ၏လုပ်ဆောင်မဟုအတလင်သ စာသပလဲပေါ်ရဟိ သီသသန့်သော့ခလောက်တစ်ခု (AccessExclusiveLock) ကို ဖမ်သယူထာသပဌီသ ကဇယာသရဟိ စုံစမ်သမေသမဌန်သမဟုမျာသကိုပင် လုပ်ဆောင်ခလင့်မပဌုဘဲ ရလေသချယ်ထာသသည်။ အကယ်၍ သင်သည် သင်၏ ဝန်ဆောင်မဟု သို့မဟုတ် ၎င်သ၏ အစိတ်အပိုင်သကို အချိန်အတန်ကဌာ ရပ်တန့်ရန် တတ်နိုင်လျဟင် (ဒေတာဘေ့စ်နဟင့် သင်၏ ဟာ့ဒ်ဝဲ၏ အရလယ်အစာသပေါ် မူတည်၍ မိနစ် ဆယ်ဂဏန်သမဟ နာရီမျာသစလာအထိ)၊ ထို့နောက် ကရလေသချယ်မဟုသည် အကောင်သဆုံသဖဌစ်သည်။ ဝမ်သနည်သပါသည်၊ ကျလန်ုပ်တို့တလင် VACUUM FULL ကို စီစဉ်ထိန်သသိမ်သထာသစဉ်အတလင်သ လုပ်ဆောင်ရန် အချိန်မရဟိသောကဌောင့် ကနည်သလမ်သသည် ကျလန်ုပ်တို့အတလက် မသင့်လျော်ပါ။

အဖလဲ့ တန်သခလဲ VACUUM FULL ကဲ့သို့ပင် ဇယာသမျာသ၏ အကဌောင်သအရာမျာသကို ပဌန်လည်တည်ဆောက်ပေသသည်၊ သို့သော် ဒေတာကို ဒစ်ခ်ပေါ်တလင် ရုပ်ပိုင်သဆိုင်ရာ စီစဥ်ထာသမည့် အညလဟန်သတစ်ခုကို သတ်မဟတ်ခလင့်ပဌုသည် (သို့သော် နောင်တလင် အတန်သအသစ်အတလက် အာမခံချက်မရဟိပါ)။ အချို့သောအခဌေအနေမျာသတလင်၊ ကအရာသည် မဟတ်တမ်သမျာသစလာကို အညလဟန်သဖဌင့်ဖတ်ခဌင်သနဟင့်အတူ queries အမျာသအပဌာသအတလက် ကောင်သမလန်သင့်လျော်မဟုတစ်ခုဖဌစ်သည်။ command ၏အာသနည်သချက်သည် VACUUM FULL နဟင့်အတူတူပင်ဖဌစ်သည် - လည်ပတ်နေစဉ်အတလင်သဇယာသကိုသော့ခတ်သည်။

အဖလဲ့ REINDEX ယခင်နဟစ်ခုနဟင့် ဆင်တူသော်လည်သ ဇယာသ၏ တိကျသောအညလဟန်သ သို့မဟုတ် အညလဟန်သအာသလုံသကို ပဌန်လည်တည်ဆောက်သည်။ လော့ခ်မျာသသည် အနည်သငယ် အာသနည်သသည်- စာသပလဲပေါ်ရဟိ ShareLock (ပဌုပဌင်မလမ်သမံမဟုမျာသကို တာသဆီသထာသသော်လည်သ ရလေသချယ်မဟုကို ခလင့်ပဌုသည်) နဟင့် အညလဟန်သတလင် AccessExclusiveLock ပဌန်လည်တည်ဆောက်ခဌင်သ (ကအညလဟန်သကို အသုံသပဌု၍ မေသမဌန်သမဟုမျာသကို ပိတ်ဆို့သည်)။ သို့သော် Postgres ၏ 12th ဗာသရဟင်သတလင် parameter တစ်ခုပေါ်လာသည်။ ပဌိုင်တူတစ်ပဌိုင်တည်သ ထပ်လောင်သခဌင်သ၊ ပဌုပဌင်မလမ်သမံခဌင်သ သို့မဟုတ် မဟတ်တမ်သမျာသကို ဖျက်ခဌင်သတို့ကို ပိတ်ဆို့ခဌင်သမရဟိဘဲ အညလဟန်သကို ပဌန်လည်တည်ဆောက်နိုင်စေပါသည်။

Postgres ၏ အစောပိုင်သဗာသရဟင်သမျာသတလင်၊ သင်သည် REINDEX ကို တစ်ပဌိုင်နက် အသုံသပဌုခဌင်သနဟင့် အလာသတူ ရလဒ်ကို ရရဟိနိုင်သည်။ Index ကို တပဌိုင်နက် ဖန်တီသပါ။. ၎င်သသည် သင့်အာသ တင်သကျပ်သောသော့ခတ်မဟုမရဟိဘဲ အညလဟန်သတစ်ခုဖန်တီသနိုင်သည် (ShareUpdateExclusiveLock၊ အပဌိုင်မေသမဌန်သချက်မျာသကိုအနဟောင့်အယဟက်မပေသသော)၊ ထို့နောက် အညလဟန်သဟောင်သကိုအသစ်တစ်ခုဖဌင့်အစာသထိုသပဌီသ အညလဟန်သအဟောင်သကိုဖျက်ပါ။ ၎င်သသည် သင့်လျဟောက်လလဟာကို မနဟောင့်ယဟက်ဘဲ index bloat ကို ဖယ်ရဟာသနိုင်စေပါသည်။ အညလဟန်သမျာသကိုပဌန်လည်တည်ဆောက်သည့်အခါ disk subsystem တလင်နောက်ထပ် load တစ်ခုရဟိလာမည်ကိုထည့်သလင်သစဉ်သစာသရန်အရေသကဌီသသည်။

ထို့ကဌောင့်၊ အညလဟန်သကိန်သမျာသအတလက် "ပျံဝဲခဌင်သ" ကိုဖယ်ရဟာသရန်နည်သလမ်သမျာသရဟိပါက၊ ဇယာသမျာသအတလက်မရဟိပါ။ ကနေရာတလင် အမျိုသမျိုသသော ပဌင်ပ extension မျာသ ပါဝင်လာသည်- pg_repack (ယခင် pg_reorg)၊ pgcompact, pgcompactable နဟင့်အခဌာသသူမျာသ။ ကဆောင်သပါသတလင်၊ ကျလန်ုပ်သည် ၎င်သတို့ကို မနဟိုင်သယဟဉ်ဘဲ အချို့သောပဌုပဌင်မလမ်သမံပဌီသနောက် ကျလန်ုပ်တို့ကိုယ်တိုင်အသုံသပဌုသည့် pg_repack အကဌောင်သကိုသာ ပဌောဆိုပါမည်။

pg_repack ဘယ်လိုအလုပ်လုပ်သလဲ။

Postgres- ဖောင်သပလခဌင်သ၊ pg_repack နဟင့် ရလဟေ့ဆိုင်သကန့်သတ်ချက်မျာသ
ကျလန်ုပ်တို့တလင် အညလဟန်သမျာသ၊ ကန့်သတ်ချက်မျာသ၊ ကံမကောင်သစလာဖဌင့် ဖောင်သပလသော လုံသလုံသလျာသလျာသ စာသပလဲတစ်လုံသရဟိသည် ဆိုကဌပါစို့။ pg_repack ၏ ပထမအဆင့်မဟာ ၎င်သလုပ်ဆောင်နေချိန်တလင် ပဌောင်သလဲမဟုမျာသအာသလုံသကို သိမ်သဆည်သရန်အတလက် မဟတ်တမ်သဇယာသတစ်ခု ဖန်တီသရန်ဖဌစ်သည်။ ထည့်သလင်သမဟု၊ အပ်ဒိတ်နဟင့် ဖျက်မဟုတိုင်သအတလက် ကပဌောင်သလဲမဟုမျာသကို အစပျိုသမဟုမဟ ထပ်တူပလာသစေမည်ဖဌစ်သည်။ ထို့နောက် ဒေတာထည့်သလင်သခဌင်သလုပ်ငန်သစဉ်ကို နဟေသကလေသစေရန်အတလက် အညလဟန်သမျာသနဟင့် ကန့်သတ်ချက်မျာသမပါဘဲ ဇယာသတစ်ခုကို ဖန်တီသပါသည်။

ထို့နောက်၊ pg_repack သည် ဇယာသဟောင်သမဟ ဒေတာမျာသကို ဇယာသအသစ်သို့ လလဟဲပဌောင်သပေသကာ၊ မသက်ဆိုင်သော အတန်သအာသလုံသကို အလိုအလျောက် စစ်ထုတ်ကာ ဇယာသအသစ်အတလက် အညလဟန်သမျာသကို ဖန်တီသပေသသည်။ ကလုပ်ဆောင်မဟုမျာသအာသလုံသကို လုပ်ဆောင်နေစဉ်အတလင်သ အပဌောင်သအလဲမျာသသည် မဟတ်တမ်သဇယာသတလင် စုပုံနေပါသည်။

နောက်တစ်ဆင့်မဟာ အပဌောင်သအလဲမျာသကို ဇယာသအသစ်သို့ လလဟဲပဌောင်သရန်ဖဌစ်သည်။ ရလဟေ့ပဌောင်သခဌင်သအာသ အကဌိမ်ကဌိမ် ထပ်ခါထပ်ခါ လုပ်ဆောင်ပဌီသ မဟတ်တမ်သဇယာသတလင် ထည့်သလင်သမဟု 20 ထက်နည်သသော အချိန်တလင်၊ pg_repack သည် ခိုင်မာသောသော့ကို ရယူပဌီသ နောက်ဆုံသဒေတာကို ရလဟေ့ပဌောင်သကာ Postgres စနစ်ဇယာသရဟိ ဇယာသဟောင်သကို အသစ်နဟင့် အစာသထိုသသည်။ ကအချိန်သည် သင် စာသပလဲနဟင့် အလုပ်တလဲလုပ်နိုင်မည်မဟုတ်သည့် တစ်ခုတည်သနဟင့် အလလန်တိုတောင်သသော အချိန်ဖဌစ်သည်။ ယင်သနောက်၊ ဇယာသဟောင်သနဟင့် မဟတ်တမ်သပါရဟိသော ဇယာသကို ဖျက်ပဌီသ ဖိုင်စနစ်တလင် နေရာလလတ်မျာသ ပေါ်လာသည်။ လုပ်ငန်သစဉ်ပဌီသပါပဌီ။

အရာအာသလုံသသည် သီအိုရီအရ ကောင်သမလန်လဟသော်လည်သ လက်တလေ့တလင် ဘာဖဌစ်သလာသသနည်သ။ ကျလန်ုပ်တို့သည် pg_repack ကို load နဟင့် load မပါပဲ စမ်သသပ်ပဌီသ အချိန်မတန်မီ ရပ်တန့်သလာသသောအခါတလင် ၎င်သ၏လုပ်ဆောင်ချက်ကို စစ်ဆေသခဲ့သည် (တစ်နည်သအာသဖဌင့် Ctrl+C ကိုသုံသ၍)။ စစ်ဆေသမဟုအာသလုံသ အပဌုသဘောဆောင်သည်။

ကျလန်တော်တို့ အစာသအသောက်ဆိုင်ကို သလာသပဌီသတော့ အာသလုံသက မျဟော်လင့်ထာသသလို ဖဌစ်မလာဘူသ။

ပထမညသစလာ ပန်ကိတ်ရောင်သသည်။

ပထမအစုတလင် ထူသခဌာသသောကန့်သတ်ချက်ကို ချိုသဖောက်ခဌင်သနဟင့်ပတ်သက်၍ အမဟာသအယလင်သတစ်ခုရရဟိခဲ့သည်-

$ ./pg_repack -t tablename -o id
INFO: repacking table "tablename"
ERROR: query failed: 
    ERROR: duplicate key value violates unique constraint "index_16508"
DETAIL:  Key (id, index)=(100500, 42) already exists.

ကကန့်သတ်ချက်တလင် အလိုအလျောက်ထုတ်ပေသသည့် အမည် index_16508 ပါရဟိသည် - ၎င်သကို pg_repack မဟ ဖန်တီသထာသသည်။ ၎င်သ၏ဖလဲ့စည်သမဟုတလင်ပါဝင်သော အရည်အချင်သမျာသအပေါ် အခဌေခံ၍ ၎င်သနဟင့်ကိုက်ညီသော "ကျလန်ုပ်တို့၏" ကန့်သတ်ချက်ကို ကျလန်ုပ်တို့ ဆုံသဖဌတ်ခဲ့သည်။ ပဌဿနာက ဒါဟာ လုံသဝ သာမာန် ကန့်သတ်ချက် မဟုတ်ပါဘူသ၊ ရလဟေ့ဆိုင်သလိုက်တာ (ရလဟေ့ဆိုင်သကန့်သတ်မဟု), i.e. ၎င်သ၏အတည်ပဌုချက်ကို sql command ထက် နောက်ကျပဌီသမဟ လုပ်ဆောင်ပဌီသ မမျဟော်လင့်ထာသသော အကျိုသဆက်မျာသကို ဖဌစ်ပေါ်စေသည်။

ရလဟေ့ဆိုင်သထာသသော ကန့်သတ်ချက်မျာသ- ၎င်သတို့သည် အဘယ်ကဌောင့် လိုအပ်ပဌီသ ၎င်သတို့ မည်သို့အလုပ်လုပ်သနည်သ။

ရလဟေ့ဆိုင်သကန့်သတ်ချက်မျာသအကဌောင်သ သီအိုရီအနည်သငယ်။
ရိုသရဟင်သသောဥပမာတစ်ခုကို သုံသသပ်ကဌည့်ကဌပါစို့- ကျလန်ုပ်တို့တလင် ရည်ညလဟန်သချက်နဟစ်ခုပါရဟိသော ကာသမျာသ၏ ဇယာသ-လမ်သညလဟန်စာအုပ်တလင် ကာသ၏အမည်နဟင့် အစီအစဥ်ရဟိသည်။
Postgres- ဖောင်သပလခဌင်သ၊ pg_repack နဟင့် ရလဟေ့ဆိုင်သကန့်သတ်ချက်မျာသ

create table cars
(
  name text constraint pk_cars primary key,
  ord integer not null constraint uk_cars unique
);



ပထမနဟင့် ဒုတိယကာသမျာသကို လဲလဟယ်ရန် လိုအပ်သည်ဆိုပါစို့။ ရိုသရဟင်သသောဖဌေရဟင်သချက်မဟာ ပထမတန်ဖိုသကို ဒုတိယသို့ အပ်ဒိတ်လုပ်ပဌီသ ဒုတိယတန်ဖိုသကို ပထမသို့ အပ်ဒိတ်လုပ်ရန်ဖဌစ်သည်-

begin;
  update cars set ord = 2 where name = 'audi';
  update cars set ord = 1 where name = 'bmw';
commit;

သို့သော် ကျလန်ုပ်တို့သည် ကကုဒ်ကို အသုံသပဌုသောအခါတလင်၊ ဇယာသရဟိ တန်ဖိုသမျာသ၏ အစီအစဥ်သည် ထူသခဌာသသောကဌောင့်၊

[23305] ERROR: duplicate key value violates unique constraint “uk_cars”
Detail: Key (ord)=(2) already exists.

ကလဲပဌာသအောင် ဘယ်လိုလုပ်ရမလဲ။ ရလေသချယ်စရာတစ်ခု- ဥပမာ “-1” ဇယာသတလင် မရဟိဟု အာမခံထာသသော အမဟာစာတစ်ခုသို့ အပိုတန်ဖိုသအစာသထိုသမဟုတစ်ခုကို ထည့်ပါ။ ပရိုဂရမ်ရေသဆလဲခဌင်သတလင်၊ ၎င်သကို "ကိန်သရဟင်နဟစ်ခု၏တန်ဖိုသမျာသကို သုံသပုံတစ်ပုံသို့ဖလဟယ်ခဌင်သ" ဟုခေါ်သည်။ ကနည်သလမ်သ၏တစ်ခုတည်သသောအာသနည်သချက်မဟာ ထပ်လောင်သမလမ်သမံမဟုဖဌစ်သည်။

ရလေသချယ်စရာနဟစ်ခု- ကိန်သပဌည့်အစာသ အမဟာစာတန်ဖိုသအတလက် floating point data type ကိုအသုံသပဌုရန် ဇယာသကို ပဌန်လည်ဒီဇိုင်သဆလဲပါ။ ထို့နောက်၊ ဥပမာ၊ 1 မဟ 2.5 သို့ တန်ဖိုသကို အပ်ဒိတ်လုပ်သောအခါ၊ ပထမ entry သည် ဒုတိယနဟင့် တတိယကဌာသတလင် အလိုအလျောက် “ရပ်” လိမ့်မည်။ ကဖဌေရဟင်သချက်သည် အလုပ်လုပ်သော်လည်သ ကန့်သတ်ချက်နဟစ်ခုရဟိသည်။ ပထမညသစလာ၊ တန်ဘိုသကို အင်တာဖေ့စ်၏ တစ်နေရာရာတလင် အသုံသပဌုပါက သင့်အတလက် အဆင်မပဌေပါ။ ဒုတိယအချက်၊ ဒေတာအမျိုသအစာသ၏တိကျမဟုပေါ်မူတည်၍ မဟတ်တမ်သအာသလုံသ၏တန်ဖိုသမျာသကို ပဌန်လည်မတလက်ချက်မီ ဖဌစ်နိုင်သောထည့်သလင်သမဟုအရေအတလက် အကန့်အသတ်ရဟိမည်ဖဌစ်သည်။

ရလေသချယ်မဟု ၃- ကန့်သတ်ချက်ကို ရလဟေ့ဆိုင်သထာသရန်၊ ကတိက၀တ်ပဌုသည့်အချိန်တလင်သာ စစ်ဆေသရန်၊

create table cars
(
  name text constraint pk_cars primary key,
  ord integer not null constraint uk_cars unique deferrable initially deferred
);

ကျလန်ုပ်တို့၏ ကနညသတောင်သဆိုချက်၏ ယုတ္တိဗေဒသည် ကတိကဝတ်ပဌုချိန်တလင် တန်ဖိုသမျာသအာသလုံသသည် ထူသခဌာသကဌောင်သ သေချာစေသောကဌောင့်၊ ၎င်သသည် အောင်မဌင်လိမ့်မည်။

အထက်တလင်ဖော်ပဌထာသသော ဥပမာသည် ပေါင်သစပ်ဖလဲ့စည်သမဟုဖဌစ်သည်၊ သို့သော် ၎င်သသည် စိတ်ကူသကိုဖော်ပဌသည်။ ကျလန်ုပ်တို့၏ အပလီကေသရဟင်သတလင်၊ အသုံသပဌုသူမျာသသည် ဘုတ်ပေါ်တလင် မျဟဝေထာသသော ဝစ်ဂျက်အရာဝတ္ထုမျာသနဟင့် တစ်ပဌိုင်နက် လုပ်ဆောင်သည့်အခါ ပဋိပက္ခမျာသကို ဖဌေရဟင်သရန် တာဝန်ရဟိသော ယုတ္တိဗေဒကို အကောင်အထည်ဖော်ရန် ရလဟေ့ဆိုင်သကန့်သတ်ချက်မျာသကို အသုံသပဌုပါသည်။ ထိုကန့်သတ်ချက်မျာသကို အသုံသပဌုခဌင်သဖဌင့် ကျလန်ုပ်တို့သည် အပလီကေသရဟင်သကုဒ်ကို အနည်သငယ်ရိုသရဟင်သအောင် ပဌုလုပ်နိုင်စေပါသည်။

ယေဘုယျအာသဖဌင့်၊ ကန့်သတ်အမျိုသအစာသပေါ်မူတည်၍ Postgres တလင် ၎င်သတို့ကိုစစ်ဆေသရန်အတလက် အသေသစိတ်အဆင့်သုံသဆင့်ရဟိသည်- အတန်သ၊ ငလေပေသငလေယူနဟင့် ဖော်ပဌမဟုအဆင့်မျာသ။
Postgres- ဖောင်သပလခဌင်သ၊ pg_repack နဟင့် ရလဟေ့ဆိုင်သကန့်သတ်ချက်မျာသ
source: begriffs

CHECK နဟင့် NOT NULL ကို အတန်သအဆင့်တလင် အမဌဲတမ်သစစ်ဆေသသည်၊ ဇယာသမဟတလေ့မဌင်နိုင်သကဲ့သို့ အခဌာသသောကန့်သတ်ချက်မျာသအတလက်၊ ရလေသချယ်စရာအမျိုသမျိုသရဟိပါသည်။ စာမျာသမျာသဖတ်လို့ရတယ်။ ဒီမဟာ.

အတိုချုံသချုပ်ရန်၊ အခဌေအနေမျာသစလာတလင် ရလဟေ့ဆိုင်သထာသသော ကန့်သတ်ချက်မျာသသည် ပိုမိုဖတ်ရဟုနိုင်သော ကုဒ်မျာသနဟင့် ညလဟန်ကဌာသချက်မျာသ နည်သပါသသည်။ သို့သော်၊ အမဟာသအယလင်သဖဌစ်ပေါ်ပဌီသ သင်သိရဟိလာသည့်အခိုက်အတန့်အချိန်၌ ကလဲကလာသလာသသောကဌောင့် အမဟာသရဟာပဌင်ခဌင်သလုပ်ငန်သစဉ်ကို ရဟုပ်ထလေသစေခဌင်သဖဌင့် ၎င်သအတလက် သင်ပေသဆပ်ရမည်ဖဌစ်သည်။ နောက်ထပ်ဖဌစ်နိုင်ချေရဟိသော ပဌဿနာမဟာ အစီအစဉ်ဆလဲသူသည် တောင်သဆိုချက်တလင် ရလဟေ့ဆိုင်သကန့်သတ်ချက်တစ်ခုပါ၀င်ပါက အချိန်ဇယာသဆလဲသူသည် အကောင်သဆုံသအစီအစဉ်တစ်ခုကို တည်ဆောက်နိုင်မည်မဟုတ်ပေ။

pg_repack ၏တိုသတက်မဟု

ရလဟေ့ဆိုင်သထာသသော ကန့်သတ်ချက်မျာသကို ကျလန်ုပ်တို့ ခဌုံငုံထာသပဌီသဖဌစ်သော်လည်သ ၎င်သတို့သည် ကျလန်ုပ်တို့၏ပဌဿနာနဟင့် မည်သို့ဆက်စပ်သနည်သ။ စောစောကရရဟိခဲ့တဲ့ အမဟာသကို သတိရကဌရအောင်။

$ ./pg_repack -t tablename -o id
INFO: repacking table "tablename"
ERROR: query failed: 
    ERROR: duplicate key value violates unique constraint "index_16508"
DETAIL:  Key (id, index)=(100500, 42) already exists.

မဟတ်တမ်သဇယာသမဟ ဇယာသအသစ်သို့ ဒေတာကို ကူသယူသောအခါ ဖဌစ်ပေါ်သည်။ ဒါက ထူသဆန်သနေလို့... မဟတ်တမ်သဇယာသရဟိ ဒေတာကို အရင်သအမဌစ်ဇယာသရဟိ ဒေတာနဟင့်အတူ ကတိပဌုပါသည်။ မူလဇယာသ၏ ကန့်သတ်ချက်မျာသကို ကျေနပ်ပါက၊ အသစ်တလင် တူညီသောကန့်သတ်ချက်မျာသကို မည်သို့ချိုသဖောက်နိုင်မည်နည်သ။

ထလက်လာသည့်အတိုင်သ၊ ပဌဿနာ၏အရင်သမဌစ်မဟာ pg_repack ၏ ယခင်အဆင့်တလင်ဖဌစ်ပဌီသ၊ အညလဟန်သမျာသကိုသာဖန်တီသပေသသော်လည်သ ကန့်သတ်ချက်မျာသမဟုတ်ပါ- ဇယာသဟောင်သတလင် ထူသခဌာသသောကန့်သတ်ချက်တစ်ခုရဟိကာ အသစ်ကမူထူသခဌာသသောအညလဟန်သကိုဖန်တီသခဲ့သည်။

Postgres- ဖောင်သပလခဌင်သ၊ pg_repack နဟင့် ရလဟေ့ဆိုင်သကန့်သတ်ချက်မျာသ

ကန့်သတ်ချက်သည် ပုံမဟန်ဖဌစ်ပဌီသ ရလဟေ့ဆိုင်သခဌင်သမရဟိပါက၊ ၎င်သအစာသ ဖန်တီသထာသသော ထူသခဌာသသောအညလဟန်သသည် ကကန့်သတ်ချက်နဟင့် ညီမျဟသောကဌောင့် ကနေရာတလင် မဟတ်သာသထာသရန် အရေသကဌီသပါသည်။ Postgres ရဟိ သီသသန့်ကန့်သတ်ချက်မျာသကို သီသသန့်အညလဟန်သတစ်ခုဖန်တီသခဌင်သဖဌင့် အကောင်အထည်ဖော်ပါသည်။ သို့သော် ရလဟေ့ဆိုင်သကန့်သတ်မဟုတစ်ခုအတလက်၊ အညလဟန်သကိန်သကို ရလဟေ့ဆိုင်သ၍မရသည့်အပဌင် sql အမိန့်ကို လုပ်ဆောင်သည့်အချိန်တလင် အမဌဲတမ်သစစ်ဆေသနေသောကဌောင့် အပဌုအမူသည် တူညီမည်မဟုတ်ပါ။

ထို့ကဌောင့်၊ ပဌဿနာ၏အနဟစ်သာရမဟာ check ၏ "နဟောင့်နဟေသ" တလင် တည်ရဟိသည်- မူရင်သဇယာသတလင် ၎င်သသည် commit လုပ်သည့်အချိန်တလင် ဖဌစ်ပေါ်ပဌီသ sql command ကို လုပ်ဆောင်သည့်အချိန်တလင် ဇယာသအသစ်တလင်ဖဌစ်သည်။ ဆိုလိုသည်မဟာ စစ်ဆေသမဟုနဟစ်ခုစလုံသတလင် အလာသတူလုပ်ဆောင်ကဌောင်သ သေချာစေရန် လိုအပ်သည်- အမဌဲတမ်သနဟောင့်နဟေသခဌင်သ သို့မဟုတ် အမဌဲတမ်သချက်ခဌင်သဖဌစ်စေရန် လိုအပ်သည်။

ဒါဆို ငါတို့မဟာ ဘာစိတ်ကူသတလေရဟိလဲ။

ကျာင်သတူအညလဟန်သတစ်ခု ဖန်တီသပါ။

ပထမအကဌံမဟာ စစ်ဆေသချက်နဟစ်ခုလုံသကို ချက်ချင်သမုဒ်တလင် လုပ်ဆောင်ရန်ဖဌစ်သည်။ ၎င်သသည် မဟာသယလင်သသော အပဌုသဘောဆောင်သည့် ကန့်သတ်ချက်မျာသ အမျာသအပဌာသကို ထုတ်ပေသနိုင်သော်လည်သ ၎င်သတို့ထဲမဟ အနည်သငယ်သာရဟိပါက၊ ထိုသို့သော ပဋိပက္ခမျာသသည် ၎င်သတို့အတလက် ပုံမဟန်အခဌေအနေဖဌစ်သောကဌောင့်၊ ၎င်သသည် အသုံသပဌုသူမျာသ၏ လုပ်ငန်သကို မထိခိုက်စေသင့်ပါ။ ဥပမာအာသဖဌင့်၊ အသုံသပဌုသူနဟစ်ညသသည် တူညီသောဝစ်ဂျက်ကို တစ်ချိန်တည်သတည်သဖဌတ်ခဌင်သစတင်သည့်အခါ၊ ဒုတိယအသုံသပဌုသူ၏ client သည် ပထမအသုံသပဌုသူမဟ တည်သဖဌတ်ရန်အတလက် ဝစ်ဂျက်ကို ပိတ်ဆို့ထာသပဌီသဖဌစ်သည့် အချက်အလက်ကို လက်ခံရရဟိရန် အချိန်မရဟိပါ။ ထိုသို့သောအခဌေအနေမျိုသတလင်၊ ဆာဗာသည် ဒုတိယအသုံသပဌုသူကို ငဌင်သပယ်ပဌီသ ၎င်သ၏ဖောက်သည်သည် အပဌောင်သအလဲမျာသကို ပဌန်သိမ်သကာ ဝစ်ဂျက်ကို ပိတ်ဆို့သည်။ ခဏအကဌာ၊ ပထမအသုံသပဌုသူသည် တည်သဖဌတ်မဟုပဌီသသလာသသောအခါ၊ ဒုတိယသည် ဝစ်ဂျက်ကို ပိတ်ဆို့ထာသခဌင်သမရဟိတော့သည့် အချက်အလက်မျာသကို လက်ခံရရဟိမည်ဖဌစ်ပဌီသ ၎င်သတို့၏လုပ်ဆောင်ချက်ကို ပဌန်လည်လုပ်ဆောင်နိုင်မည်ဖဌစ်သည်။

Postgres- ဖောင်သပလခဌင်သ၊ pg_repack နဟင့် ရလဟေ့ဆိုင်သကန့်သတ်ချက်မျာသ

စစ်ဆေသမဟုမျာသသည် ရလဟေ့ဆိုင်သခဌင်သမရဟိသည့်မုဒ်တလင် အမဌဲရဟိနေကဌောင်သ သေချာစေရန်၊ ကျလန်ုပ်တို့သည် မူလရလဟေ့ဆိုင်သထာသသော ကန့်သတ်ချက်နဟင့် ဆင်တူသော အညလဟန်သအသစ်တစ်ခုကို ဖန်တီသခဲ့သည်-

CREATE UNIQUE INDEX CONCURRENTLY uk_tablename__immediate ON tablename (id, index);
-- run pg_repack
DROP INDEX CONCURRENTLY uk_tablename__immediate;

စမ်သသပ်မဟုပတ်ဝန်သကျင်တလင်၊ ကျလန်ုပ်တို့သည် မျဟော်လင့်ထာသသည့် အမဟာသအယလင်သအနည်သငယ်မျဟသာ ရရဟိခဲ့သည်။ အောင်မဌင် ကျလန်ုပ်တို့သည် pg_repack ကို ထုတ်လုပ်မဟုတလင် ထပ်မံလုပ်ဆောင်ပဌီသ အလုပ်ချိန်တစ်နာရီအတလင်သ ပထမအစုတလင် အမဟာသအယလင်သ ၅ ခု ရခဲ့သည်။ ကသည်မဟာ လက်ခံနိုင်သောရလဒ်တစ်ခုဖဌစ်သည်။ သို့သော်၊ ဒုတိယအစုအဝေသတလင်ရဟိပဌီသသာသ အမဟာသအယလင်သအရေအတလက် သိသိသာသာတိုသလာပဌီသ pg_repack ကို ရပ်တန့်ခဲ့ရသည်။

ဘာကဌောင့်ဖဌစ်တာလဲ။ အမဟာသအယလင်သတစ်ခု ဖဌစ်ပလာသနိုင်ခဌေသည် တူညီသောဝစ်ဂျက်မျာသနဟင့် တစ်ပဌိုင်နက်တည်သတလင် အသုံသပဌုသူ မည်မျဟအလုပ်လုပ်သည်အပေါ် မူတည်ပါသည်။ ထင်ရဟာသသည်မဟာ၊ ထိုအချိန်တလင် ပထမအစုတလင် သိမ်သဆည်သထာသသည့် ဒေတာနဟင့် ပဌိုင်ဆိုင်မဟုမျာသစလာ လျော့နည်သသလာသသည်မဟာ အခဌာသအရာမျာသထက်၊ ဆိုလိုသည်မဟာ၊ ငါတို့က "ကံကောင်သတယ်" ပဲ။

အကဌံက အလုပ်မဖဌစ်ဘူသ။ ထိုအချိန်တလင်၊ ကျလန်ုပ်တို့သည် အခဌာသဖဌေရဟင်သချက်နဟစ်ခုကို တလေ့ခဲ့သည်- ရလဟေ့ဆိုင်သထာသသော ကန့်သတ်ချက်မျာသကို ပေသဆောင်ရန် ကျလန်ုပ်တို့၏ အပလီကေသရဟင်သကုဒ်ကို ပဌန်ရေသပါ သို့မဟုတ် ၎င်သတို့နဟင့် အလုပ်လုပ်ရန် "သင်ပေသ" pg_repack။ ကျလန်တော်တို့ ဒုတိယတစ်ခုကို ရလေသလိုက်တယ်။

မူရင်သဇယာသမဟ ရလဟေ့ဆိုင်သထာသသော ကန့်သတ်ချက်မျာသဖဌင့် ဇယာသအသစ်ရဟိ အညလဟန်သမျာသကို အစာသထိုသပါ။

ပဌန်လည်ပဌင်ဆင်ခဌင်သ၏ ရည်ရလယ်ချက်မဟာ ထင်ရဟာသသည် - မူလဇယာသတလင် ရလဟေ့ဆိုင်သကန့်သတ်ချက်တစ်ခုရဟိနေပါက၊ အသစ်တစ်ခုအတလက် သင်သည် အညလဟန်သတစ်ခုမဟုတ်ဘဲ ကန့်သတ်ချက်တစ်ခုဖန်တီသရန် လိုအပ်သည်။

ကျလန်ုပ်တို့၏ပဌောင်သလဲမဟုမျာသကို စမ်သသပ်ရန်အတလက် ရိုသရဟင်သသောစမ်သသပ်မဟုတစ်ခုကို ကျလန်ုပ်တို့ရေသသာသခဲ့သည်-

  • ရလဟေ့ဆိုင်သကန့်သတ်ချက်တစ်ခုပါရဟိသော ဇယာသ၊
  • ရဟိပဌီသသာသ မဟတ်တမ်သတစ်ခုနဟင့် ကလဲလလဲနေသော ကလင်သဆက်တစ်ခုတလင် ဒေတာကို ထည့်သလင်သပါ။
  • အပ်ဒိတ်လုပ်ပါ - ဒေတာ ကလဲလလဲမဟုမရဟိတော့ပါ။
  • အပဌောင်သအလဲမျာသကိုလုပ်ဆောင်ပါ။

create table test_table
(
  id serial,
  val int,
  constraint uk_test_table__val unique (val) deferrable initially deferred 
);

INSERT INTO test_table (val) VALUES (0);
FOR i IN 1..10000 LOOP
  BEGIN
    INSERT INTO test_table VALUES (0) RETURNING id INTO v_id;
    UPDATE test_table set val = i where id = v_id;
    COMMIT;
  END;
END LOOP;

pg_repack ၏မူရင်သဗာသရဟင်သသည် ပထမထည့်သလင်သမဟုတလင် အမဌဲပျက်သလာသသည်၊ ပဌုပဌင်ထာသသောဗာသရဟင်သသည် အမဟာသအယလင်သမရဟိဘဲ အလုပ်လုပ်သည်။ မိုက်တယ်။

ကျလန်ုပ်တို့သည် ထုတ်လုပ်ရေသသို့သလာသကာ မဟတ်တမ်သဇယာသမဟ အချက်အလက်အသစ်တစ်ခုသို့ ကူသယူခဌင်သ၏တူညီသောအဆင့်တလင် အမဟာသတစ်ခု ထပ်မံရရဟိသည်-

$ ./pg_repack -t tablename -o id
INFO: repacking table "tablename"
ERROR: query failed: 
    ERROR: duplicate key value violates unique constraint "index_16508"
DETAIL:  Key (id, index)=(100500, 42) already exists.

ဂန္တဝင်အခဌေအနေ- အရာအာသလုံသသည် စမ်သသပ်မဟုပတ်ဝန်သကျင်တလင် အဆင်ပဌေသော်လည်သ ထုတ်လုပ်မဟုတလင် မဟုတ်ပါ။

APPLY_COUNT နဟင့် အသုတ်နဟစ်ခု၏ လမ်သဆုံ

ကျလန်ုပ်တို့သည် ကုဒ်ကို စာကဌောင်သတစ်ကဌောင်သချင်သ ခလဲခဌမ်သစိတ်ဖဌာရန် စတင်ခဲ့ပဌီသ အရေသကဌီသသောအချက်ကို ရဟာဖလေတလေ့ရဟိခဲ့သည်- ဒေတာမျာသကို မဟတ်တမ်သဇယာသမဟ အတလဲလိုက်အသစ်တစ်ခုသို့ လလဟဲပဌောင်သသည်၊ APPLY_COUNT ကိန်သသေက အသုတ်၏အရလယ်အစာသကို ဖော်ပဌသည်-

for (;;)
{
num = apply_log(connection, table, APPLY_COUNT);

if (num > MIN_TUPLES_BEFORE_SWITCH)
     continue;  /* there might be still some tuples, repeat. */
...
}

ပဌဿနာမဟာ လည်ပတ်မဟုအမျာသအပဌာသသည် ကန့်သတ်ချက်ကို ချိုသဖောက်နိုင်ချေရဟိသည့် မူလငလေပေသငလေယူမဟ ဒေတာကို လလဟဲပဌောင်သသည့်အခါတလင် အသုတ်နဟစ်ခု၏ လမ်သဆုံတလင် အဆုံသသတ်နိုင်သည် - ညလဟန်ကဌာသချက်တစ်ဝက်ကို ပထမအသုတ်တလင် ကျူသလလန်မည်ဖဌစ်ပဌီသ ကျန်တစ်ဝက်ကို၊ ဒုတိယ၌။ ကတလင်၊ သင်၏ကံအပေါ်မူတည်၍ ပထမအသုတ်တလင် အသင်သမျာသသည် မည်သည့်အရာကိုမျဟ မချိုသဖောက်ပါက၊ အာသလုံသအဆင်ပဌေသော်လည်သ ၎င်သတို့ပဌုလုပ်ပါက အမဟာသအယလင်သဖဌစ်သလာသသည်။

APPLY_COUNT သည် 1000 မဟတ်တမ်သမျာသနဟင့် ညီမျဟသည်၊ ၎င်သသည် ကျလန်ုပ်တို့၏စစ်ဆေသမဟုမျာသ အဘယ်ကဌောင့် အောင်မဌင်ကဌောင်သ ရဟင်သပဌသည် - ၎င်သတို့သည် “batch junction” ကိစ္စအာသ အကျုံသမဝင်ပါ။ ကျလန်ုပ်တို့သည် ညလဟန်ကဌာသချက်နဟစ်ခုကို အသုံသပဌုသည် - ထည့်သလင်သခဌင်သနဟင့် အပ်ဒိတ်လုပ်ခဌင်သ ဖဌစ်သောကဌောင့် အမိန့်နဟစ်ခု၏ ငလေပေသငလေယူ 500 အတိအကျကို တစ်သုတ်တလင် အမဌဲထာသရဟိခဲ့ပဌီသ မည်သည့်ပဌဿနာမျဟ မတလေ့ကဌုံခဲ့ရပါ။ ဒုတိယအပ်ဒိတ်ကို ပေါင်သထည့်ပဌီသနောက်၊ ကျလန်ုပ်တို့၏တည်သဖဌတ်မဟုသည် အလုပ်မလုပ်တော့ပါ။

FOR i IN 1..10000 LOOP
  BEGIN
    INSERT INTO test_table VALUES (1) RETURNING id INTO v_id;
    UPDATE test_table set val = i where id = v_id;
    UPDATE test_table set val = i where id = v_id; -- one more update
    COMMIT;
  END;
END LOOP;

ထို့ကဌောင့်၊ နောက်ထပ်လုပ်ဆောင်ရမည့်တာဝန်မဟာ ငလေပေသငလေယူတစ်ခုတလင် ပဌောင်သလဲထာသသည့် မူရင်သဇယာသမဟဒေတာမျာသသည် ဇယာသအသစ်တလင် အရောင်သအ၀ယ်တစ်ခုအတလင်သ၌လည်သ ပဌီသဆုံသကဌောင်သ သေချာစေရန်ဖဌစ်သည်။

သုတ်လိမ်သခဌင်သမဟ ငဌင်သဆန်ခဌင်သ။

နောက်တဖန် ကျလန်ုပ်တို့တလင် ဖဌေရဟင်သချက်နဟစ်ခုရဟိသည်။ ပထမညသစလာ- အစုလိုက်အပိုင်သခလဲခဌင်သကို လုံသဝစလန့်လလဟတ်ပဌီသ အရောင်သအ၀ယ်တစ်ခုတလင် ဒေတာလလဟဲပဌောင်သကဌပါစို့။ ကဖဌေရဟင်သချက်၏အာသသာချက်မဟာ၎င်သ၏ရိုသရဟင်သမဟုဖဌစ်သည် - လိုအပ်သောကုဒ်အပဌောင်သအလဲမျာသသည်အနည်သငယ်မျဟသာဖဌစ်သည် (စကာသအာသဖဌင့်၊ pg_reorg ဗာသရဟင်သအဟောင်သမျာသတလင်ထိုကဲ့သို့အလုပ်လုပ်သည်)။ သို့သော် ပဌဿနာတစ်ခုရဟိသည် - ကျလန်ုပ်တို့သည် နဟစ်ရဟည်လမျာသ ငလေပေသငလေယူကို ဖန်တီသနေပဌီသ ၎င်သသည် ယခင်ကပဌောခဲ့သည့်အတိုင်သ ဖောင်သပလမဟုအသစ်တစ်ခု ပေါ်ပေါက်လာစေရန် ခဌိမ်သခဌောက်မဟုတစ်ခုဖဌစ်သည်။

ဒုတိယဖဌေရဟင်သချက်သည် ပိုမိုရဟုပ်ထလေသသော်လည်သ ပိုမဟန်နိုင်သည်- ဇယာသတလင် ဒေတာမျာသထည့်ထာသသည့် ငလေပေသငလေယူ၏ identifier ဖဌင့် ကော်လံတစ်ခုကို ဖန်တီသပါ။ ထို့နောက် ကျလန်ုပ်တို့သည် ဒေတာကို ကူသယူသည့်အခါ၊ ၎င်သကို က attribute ဖဌင့် အုပ်စုဖလဲ့နိုင်ပဌီသ ဆက်စပ်ပဌောင်သလဲမဟုမျာသကို အတူတကလ လလဟဲပဌောင်သကဌောင်သ သေချာစေပါသည်။ အစုလိုက်သည် ငလေပေသငလေယူမျာသစလာ (သို့မဟုတ် အကဌီသကဌီသတစ်ခု) မဟ ဖလဲ့စည်သမည်ဖဌစ်ပဌီသ ၎င်သသည် ကလလဟဲပဌောင်သမဟုမျာသတလင် ဒေတာမည်မျဟပဌောင်သလဲခဲ့သည်ပေါ်မူတည်၍ ၎င်သ၏အရလယ်အစာသ ကလဲပဌာသမည်ဖဌစ်သည်။ မတူညီသော ငလေပေသငလေယူမျာသမဟ ဒေတာမျာသသည် ကျပန်သအစီအစဥ်ဖဌင့် မဟတ်တမ်သဇယာသထဲသို့ ဝင်ရောက်လာသောကဌောင့် ယခင်ကကဲ့သို့ ဆက်တိုက်ဖတ်ရန် မဖဌစ်နိုင်တော့ကဌောင်သ သတိပဌုရန် အရေသကဌီသပါသည်။ tx_id ဖဌင့် စစ်ထုတ်ခဌင်သဖဌင့် တောင်သဆိုမဟုတစ်ခုစီအတလက် seqscan သည် စျေသကဌီသလလန်သသည်၊ အညလဟန်သတစ်ခု လိုအပ်သော်လည်သ ၎င်သကို အပ်ဒိတ်လုပ်ခဌင်သ၏ overhead ကဌောင့် နည်သလမ်သကိုလည်သ နဟေသကလေသစေမည်ဖဌစ်သည်။ ယေဘူယျအာသဖဌင့်၊ အမဌဲလိုလို၊ သင်သည် တစ်စုံတစ်ခုကို စလန့်လလဟတ်ရန် လိုအပ်သည်။

ထို့ကဌောင့်၊ ကျလန်ုပ်တို့သည် ပိုမိုရိုသရဟင်သသောကဌောင့် ပထမရလေသချယ်မဟုဖဌင့် စတင်ရန် ဆုံသဖဌတ်ခဲ့သည်။ ပထမညသစလာ၊ ရဟည်လျာသသောငလေပေသငလေယူသည် တကယ့်ပဌဿနာဟုတ်မဟုတ် နာသလည်ရန် လိုအပ်ပါသည်။ ဇယာသဟောင်သမဟ ဒေတာအသစ်သို့ ပင်မလလဟဲပဌောင်သခဌင်သသည် ရဟည်လျာသသော ငလေပေသငလေယူတစ်ခုတလင် ဖဌစ်ပေါ်သောကဌောင့်၊ "ကငလေပေသငလေယူကို ကျလန်ုပ်တို့မည်မျဟတိုသမဌဟင့်မည်နည်သ" အဖဌစ်သို့ ပဌောင်သလဲသလာသပါသည်။ ပထမ ငလေပေသငလေယူ၏ ကဌာချိန်သည် ဇယာသ၏ အရလယ်အစာသပေါ်တလင် အဓိက မူတည်ပါသည်။ အသစ်တစ်ခု၏ကဌာချိန်သည် ဒေတာလလဟဲပဌောင်သမဟုအတလင်သ ဇယာသတလင် အပဌောင်သအလဲမည်မျဟစုပုံနေသနည်သ၊ ဆိုလိုသည်မဟာ၊ ဝန်၏ပဌင်သထန်မဟုအပေါ်။ pg_repack လည်ပတ်မဟုသည် အနည်သငယ်မျဟသာ ဝန်ဆောင်မဟုပေသသည့်အချိန်အတလင်သ ဖဌစ်ပလာသခဲ့ပဌီသ အပဌောင်သအလဲမျာသ၏ ပမာဏသည် ဇယာသ၏မူလအရလယ်အစာသနဟင့် နဟိုင်သယဟဉ်ပါက အချိုသအစာသမမျဟပေ။ ငလေပေသငလေယူအသစ်တစ်ခု၏အချိန်ကို လျစ်လျူရဟုနိုင်သည်ဟု ကျလန်ုပ်တို့ဆုံသဖဌတ်ခဲ့သည် (နဟိုင်သယဟဉ်ရန်အတလက် ပျမ်သမျဟအာသဖဌင့် 1 နာရီနဟင့် 2-3 မိနစ်ဖဌစ်သည်)။

စမ်သသပ်မဟုတလေက အပဌုသဘောဆောင်တယ်။ ထုတ်လုပ်မဟုကိုလည်သ စတင်ပါ။ ရဟင်သရဟင်သလင်သလင်သသိရန်၊ ကနေရာတလင် လုပ်ဆောင်ပဌီသနောက် ဒေတာဘေ့စ်တစ်ခု၏ အရလယ်အစာသနဟင့် ပုံတစ်ပုံဖဌစ်သည်-

Postgres- ဖောင်သပလခဌင်သ၊ pg_repack နဟင့် ရလဟေ့ဆိုင်သကန့်သတ်ချက်မျာသ

ကဖဌေရဟင်သချက်ကို ကျလန်ုပ်တို့ လုံသ၀ ကျေနပ်အာသရသောကဌောင့်၊ ကျလန်ုပ်တို့သည် ဒုတိယတစ်ခုကို အကောင်အထည် ဖော်ရန် မကဌိုသစာသဘဲ၊ ၎င်သကို extension developer မျာသနဟင့် ဆလေသနလေသရန် ဖဌစ်နိုင်ခဌေကို ကျလန်ုပ်တို့ စဉ်သစာသနေပါသည်။ ကျလန်ုပ်တို့၏ လက်ရဟိတည်သဖဌတ်မဟုမဟာ ကံမကောင်သစလာဖဌင့်၊ ကျလန်ုပ်တို့သည် ထူသခဌာသသောရလဟေ့ဆိုင်သကန့်သတ်မဟုမျာသဖဌင့် ပဌဿနာကို ဖဌေရဟင်သပဌီသ ပဌည့်စုံသော patch တစ်ခုအတလက် အခဌာသအမျိုသအစာသမျာသအတလက် ပံ့ပိုသမဟုပေသရန် လိုအပ်သောကဌောင့် ကျလန်ုပ်တို့၏ လက်ရဟိပဌန်လည်ပဌင်ဆင်မဟုကို ထုတ်ဝေရန်အတလက် အဆင်သင့်မဖဌစ်သေသပါ။ အနာဂတ်မဟာ ဒါကို လုပ်နိုင်မယ်လို့ ကျလန်တော်တို့ မျဟော်လင့်ပါတယ်။

သင့်တလင်မေသခလန်သတစ်ခုရဟိသည်၊ pg_repack ၏မလမ်သမံမဟုနဟင့်အတူကျလန်ုပ်တို့သည်အဘယ်ကဌောင့်ကဇာတ်လမ်သတလင်ပါ ၀ င်သနည်သ၊ ဥပမာအာသဖဌင့်၎င်သ၏ analogues မျာသကိုမသုံသခဲ့ပါ။ တစ်ချိန်ချိန်တလင် ကျလန်ုပ်တို့လည်သ ၎င်သကို စဉ်သစာသခဲ့ကဌသော်လည်သ အစောပိုင်သက ၎င်သကို အသုံသပဌုခဌင်သ၏ အပဌုသဘောဆောင်သော အတလေ့အကဌုံသည် ရလဟေ့ဆိုင်သကန့်သတ်မဟုမျာသမရဟိဘဲ စာသပလဲမျာသပေါ်တလင် ပဌဿနာ၏အနဟစ်သာရကို နာသလည်ပဌီသ ဖဌေရဟင်သရန် ကဌိုသစာသရန် ကျလန်ုပ်တို့ကို လဟုံ့ဆော်ပေသခဲ့သည်။ ထို့အပဌင်၊ အခဌာသဖဌေရဟင်သနည်သမျာသကိုအသုံသပဌု၍ စမ်သသပ်မဟုမျာသပဌုလုပ်ရန်လည်သ အချိန်လိုအပ်သည်၊ ထို့ကဌောင့် ကျလန်ုပ်တို့သည် ၎င်သတလင်ရဟိသောပဌဿနာကို ညသစလာဖဌေရဟင်သရန်ကဌိုသစာသရန် ဆုံသဖဌတ်ခဲ့ပဌီသ သင့်လျော်သောအချိန်အတလင်သ ကျလန်ုပ်တို့မလုပ်ဆောင်နိုင်ကဌောင်သ သိရဟိပါက၊ ထို့နောက် analogues မျာသကို စတင်ကဌည့်ရဟုမည်ဖဌစ်သည်။ .

တလေ့ရဟိချက်မျာသ

ကျလန်ုပ်တို့၏ကိုယ်ပိုင်အတလေ့အကဌုံအပေါ်အခဌေခံ၍ ကျလန်ုပ်တို့အကဌံပဌုနိုင်သည်-

  1. သင့်ဝမ်သဗိုက်ကို စောင့်ကဌည့်ပါ။ စောင့်ကဌည့်ဒေတာအပေါ် အခဌေခံ၍ autovacuum ကို မည်ကဲ့သို့ ကောင်သစလာ configure လုပ်ထာသသည်ကို သင်နာသလည်နိုင်သည်။
  2. လက်ခံနိုင်သောအဆင့်တလင် ဖောင်သနေစေရန် AUTOVACUUM ကို ချိန်ညဟိပါ။
  3. ဖောင်သနေသေသသည်နဟင့် ပဌင်ပကိရိယာမျာသကို အသုံသပဌု၍ မကျော်လလဟာသနိုင်ပါက ပဌင်ပ extension မျာသကို အသုံသပဌုရန် မကဌောက်ပါနဟင့်။ အဓိကကတော့ အရာအာသလုံသကို ကောင်သကောင်သစမ်သသပ်ဖို့ပါပဲ။
  4. သင့်လိုအပ်ချက်မျာသနဟင့်ကိုက်ညီမည့် ပဌင်ပဖဌေရဟင်သချက်မျာသကို မလမ်သမံပဌင်ဆင်ရန် မကဌောက်ပါနဟင့် - တစ်ခါတစ်ရံ ၎င်သသည် သင့်ကိုယ်ပိုင်ကုဒ်ကို ပဌောင်သလဲခဌင်သထက်ပင် ပိုမိုထိရောက်ပဌီသ လလယ်ကူနိုင်သည်။

source: www.habr.com

မဟတ်ချက် Add