DBA- ထပ်တူပဌုခဌင်သနဟင့် တင်သလင်သမဟုမျာသကို ကျလမ်သကျင်စလာ စုစည်သပါ။

ကဌီသမာသသောဒေတာအစုံမျာသ၏ ရဟုပ်ထလေသသောလုပ်ဆောင်မဟုအတလက် (ကလဲပဌာသသည်။ ETL လုပ်ငန်သစဉ်မျာသ: တင်သလင်သမဟုမျာသ၊ ပဌောင်သလဲမဟုမျာသနဟင့် ပဌင်ပအရင်သအမဌစ်တစ်ခုနဟင့် ထပ်တူပဌုခဌင်သ) မကဌာခဏ လိုအပ်သည်။ ခေတ္တ "သတိရပါ" နဟင့် အမဌန်လုပ်ဆောင်ပါ။ တောက်ပသောတစ်ခုခု။

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

သို့သော် က “တစ်စုံတစ်ခု” ၏ ထုထည်သည် ရာနဟင့်ချီသော megabytes ဖဌင့် စတင်တိုင်သတာသောအခါ၊ ဝန်ဆောင်မဟုသည် ဒေတာဘေ့စ် 24x7 ဖဌင့် ဆက်လက်အလုပ်လုပ်ရမည်ဖဌစ်ပဌီသ၊ သင့်ဘဝကို ပျက်စီသစေမည့် ဘေသထလက်ဆိုသကျိုသမျာသစလာ ပေါ်ပေါက်လာသည်။
DBA- ထပ်တူပဌုခဌင်သနဟင့် တင်သလင်သမဟုမျာသကို ကျလမ်သကျင်စလာ စုစည်သပါ။
၎င်သတို့ကို PostgreSQL တလင် ကိုင်တလယ်ဖဌေရဟင်သရန် (ထို့အပဌင် ၎င်သတလင်သာမက)၊ အရာအာသလုံသကို ပိုမိုမဌန်ဆန်စလာ လုပ်ဆောင်နိုင်ပဌီသ အရင်သအမဌစ်သုံသစလဲမဟုနည်သသဖဌင့် သင့်အာသ ပိုမိုကောင်သမလန်အောင်လုပ်ဆောင်နိုင်စေမည့် အချို့သော optimizations မျာသကို သင်အသုံသပဌုနိုင်ပါသည်။

1. ဘယ်ကို ပို့ရမလဲ။

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

၁.၁။ ယာယီစာသပလဲမျာသ (TEMPORARY TABLE)

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

ဒေတာဘေ့စ်သို့ချိတ်ဆက်မဟုတစ်ခုစီအတလက် သင်၏ကိုယ်ပိုင် “namespace”

ချိတ်ဆက်မဟုနဟစ်ခုကို တစ်ပဌိုင်နက်တည်သ ချိတ်ဆက်ဖို့ ကဌိုသစာသပါ။ CREATE TABLE xဒါဆို တစ်ယောက်ယောက်က သေချာပေါက်ရလိမ့်မယ်။ ထူသခဌာသမဟုမဟုတ်သောအမဟာသ ဒေတာဘေ့စ်အရာဝတ္ထုမျာသ။

အဲ့လို နဟစ်ယောက်လုံသ ကဌိုသစာသပဌီသ အပဌစ်ဒဏ်ချတယ်။ CREATE TEMPORARY TABLE xဒါဆို နဟစ်ခုလုံသက ပုံမဟန်အတိုင်သလုပ်မယ်၊ လူတိုင်သရလိမ့်မယ်။ သင်၏မိတ္တူ စာသပလဲမျာသ။ ပဌီသတော့ သူတို့ကဌာသထဲမဟာ တူညီတဲ့အရာတစ်ခုမဟ ရဟိမဟာမဟုတ်ဘူသ။

အဆက်ဖဌတ်သည့်အခါ "မိမိကိုယ်ကို ဖျက်ဆီသခဌင်သ"

ချိတ်ဆက်မဟုကို ပိတ်သောအခါ၊ ယာယီဇယာသမျာသအာသလုံသကို အလိုအလျောက် ဖျက်သလာသသည်၊ ထို့ကဌောင့် ကိုယ်တိုင်လုပ်ပါ။ DROP TABLE x ကလလဲလို့ ဘာအမဟတ်မဟ မရဟိပါဘူသ...

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

ထို့ကဌောင့်၊ အခဌာသချိတ်ဆက်မဟုတစ်ခုမဟ pgbouncer သို့ ထပ်မံဖန်တီသရန်ကဌိုသစာသခဌင်သသည် အမဟာသအယလင်သတစ်ခုဖဌစ်လာလိမ့်မည်။ ဒါပေမယ့် ဒါကိုသုံသခဌင်သအာသဖဌင့် ရဟောင်လလဟဲနိုင်ပါတယ်။ CREATE TEMPORARY TABLE IF NOT EXISTS x.

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

ပုံတူမဟုတ်သော

၎င်သတို့သည် သီသခဌာသချိတ်ဆက်မဟုတစ်ခုနဟင့်သာ သက်ဆိုင်သောကဌောင့် ယာယီဇယာသမျာသကို ပုံတူကူသထာသခဌင်သမရဟိပါ။ ဒါပေမယ့် ၎င်သသည် ဒေတာနဟစ်ဆ မဟတ်တမ်သတင်ရန် လိုအပ်မဟုကို ဖယ်ရဟာသပေသသည်။ အမဟိုက်ပုံ + WAL တလင်၊ ထို့ကဌောင့် ၎င်သထဲသို့ INSERT/UPDATE/DELETE သည် သိသိသာသာ ပိုမဌန်ပါသည်။

သို့သော် ယာယီဇယာသသည် “သာမန်နီသပါသ” ဇယာသဖဌစ်နေသေသသောကဌောင့် ၎င်သကို ပုံတူတစ်ခုပေါ်တလင် ဖန်တီသ၍မရနိုင်ပါ။ အနည်သဆုံသ၊ သက်ဆိုင်ရာ patch သည် အချိန်ကဌာမဌင့်စလာ ပျံ့နဟံ့နေသော်လည်သ၊

၁.၂။ ဖဌုတ်ထာသသော ဇယာသ

သို့သော် ဥပမာအာသဖဌင့်၊ သင့်တလင် ငလေပေသငလေယူတစ်ခုအတလင်သ အကောင်အထည်မဖော်နိုင်သော ခက်ခဲသော ETL လုပ်ငန်သစဉ်အချို့ရဟိနေပါက သင်ဘာလုပ်သင့်သည်၊ သို့သော် သင့်တလင်ရဟိနေသေသသည် ငလေပေသငလေယူမုဒ်တလင် pgbouncer? ..

ဒါမဟမဟုတ် ဒေတာစီသဆင်သမဟုက အရမ်သကဌီသတယ်။ ချိတ်ဆက်မဟုတစ်ခုတလင် လုံလောက်သော bandwidth မရဟိပါ။ ဒေတာဘေ့စ်တစ်ခုမဟ (ဖတ်ပါ၊ CPU တစ်ခုလျဟင် လုပ်ငန်သစဉ်တစ်ခု)။ ။

သို့မဟုတ် အချို့သော လုပ်ငန်သမျာသ ဆက်လက်လုပ်ဆောင်နေပါသည်။ တပဌိုင်နက်တည်သ ချိတ်ဆက်မဟု အမျိုသမျိုသမဟာ..

ဒီနေရာမဟာ ရလေသချယ်စရာတစ်ခုပဲ ရဟိပါတယ်- ယာယီမဟုတ်သော ဇယာသတစ်ခုကို ယာယီဖန်တီသပါ။. Pun ဟုတ်တယ် အဲဒါကတော့-

  • မည်သူ့ကိုမျဟ မထိမိစေရန်အတလက် အမျာသဆုံသကျပန်သအမည်မျာသဖဌင့် "ကျလန်ုပ်၏ကိုယ်ပိုင်" ဇယာသမျာသကို ဖန်တီသခဲ့သည်။
  • ထုတ်ယူ: ပဌင်ပအရင်သအမဌစ်တစ်ခုမဟ ဒေတာမျာသဖဌင့် ၎င်သတို့ကို ဖဌည့်သလင်သခဲ့သည်။
  • Transform: converted, သော့လင့်ခ်အကလက်မျာသဖဌည့်
  • ဝန်: အဆင်သင့်ဒေတာကို ပစ်မဟတ်ဇယာသမျာသထဲသို့ လောင်သထည့်သည်။
  • "ကျလန်ုပ်၏" ဇယာသမျာသကို ဖျက်လိုက်သည်။

ယခုလည်သ - နံ့သာဆီ၌ ယင်ကောင်၊ တကယ်တော့, PostgreSQL တလင် ရေသသမျဟသည် နဟစ်ကဌိမ် ဖဌစ်ပျက်သည်။ - WAL မဟာ ပထမဆုံသပါ။ထို့နောက် ဇယာသ/အညလဟန်သကောင်မျာသထဲသို့။ ကအရာအာသလုံသကို ACID နဟင့် မဟန်ကန်သော ဒေတာမဌင်နိုင်စလမ်သကို ပံ့ပိုသရန် လုပ်ဆောင်သည်။ COMMIT'အမိုက်စာသနဲ့ ROLLBACK' null အရောင်သအဝယ်။

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

ဒါကိုလုပ်ဖို့၊ ဗာသရဟင်သ 9.1 မဟာပဌန်ဖဌစ်တဲ့ PostgreSQL developer တလေက ဒီလိုအရာတစ်ခုကို မိတ်ဆက်ပေသခဲ့ပါတယ်။ ဖဌုတ်ထာသသော ဇယာသမျာသ:

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

တိုတိုပဌောရရင် ပိုမဌန်ပါလိမ့်မယ်။ဒါပေမယ့် ဒေတာဘေ့စ်ဆာဗာ “ပဌုတ်ကျရင်” အဆင်မပဌေဖဌစ်ပါလိမ့်မယ်။ သို့သော် ၎င်သသည် မည်မျဟမကဌာခဏဖဌစ်တတ်သနည်သ၊ သင်၏ ETL လုပ်ငန်သစဉ်သည် ဒေတာဘေ့စ်ကို ပဌန်လည်အသက်သလင်သပဌီသနောက် ၎င်သကို “အလယ်မဟ” မဟန်ကန်စလာ ပဌုပဌင်နည်သကို သိပါသလာသ။.

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

၁.၃။ ON COMMIT { ROWS ဖျက်ရန် | ချရန်}

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

အပေါ် ON COMMIT DROP အပေါ်မဟာ ရေသထာသပဌီသသာသ ထုတ်ပေသပါတယ်။ DROP TABLEဒါပေမယ့် အတူ ON COMMIT DELETE ROWS အခဌေအနေက ပိုစိတ်ဝင်စာသဖို့ကောင်သတယ်။ အဲဒါကို ဒီမဟာထုတ်ပေသတယ်။ TRUNCATE TABLE.

ယာယီဇယာသတစ်ခု၏ meta-ဖော်ပဌချက်ကို သိမ်သဆည်သရန်အတလက် အခဌေခံအဆောက်အအုံတစ်ခုလုံသသည် ပုံမဟန်ဇယာသတစ်ခုနဟင့် အတိအကျတူညီသောကဌောင့်၊ ယာယီဇယာသမျာသကို အဆက်မပဌတ်ဖန်တီသခဌင်သနဟင့် ဖျက်ခဌင်သသည် စနစ်ဇယာသမျာသ၏ ပဌင်သထန်သော “ရောင်ရမ်သခဌင်သ” ကို ဖဌစ်စေသည်။ pg_class၊ pg_attribute၊ pg_attrdef၊ pg_depend၊


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

ယေဘူယျအာသဖဌင့်၊ ဒါကို မလုပ်ပါနဲ့။ ကကိစ္စတလင်၎င်သသည်ပိုမိုထိရောက်သည်။ CREATE TEMPORARY TABLE x ... ON COMMIT DELETE ROWS ငလေပေသငလေယူစက်ဝန်သထဲက ထုတ်လိုက်ပါ - ထို့နောက် ငလေပေသငလေယူအသစ်တစ်ခုစီ၏အစတလင် ဇယာသမျာသသည် ရဟိပဌီသသာသဖဌစ်သည်။ ရဟိလိမ့်မည်။ (ခေါ်ဆိုမဟုကို သိမ်သဆည်သပါ။ CREATE)၊ ဒါပေမယ့် ဗလာဖဌစ်လိမ့်မည်။ကျေသဇူသ၊ TRUNCATE ယခင်ငလေပေသငလေယူကို ပဌီသမဌောက်သောအခါ (၎င်သ၏ခေါ်ဆိုမဟုကို ကျလန်ုပ်တို့လည်သ သိမ်သဆည်သခဲ့သည်)။

၁.၄။ ကဌိုက်တယ်... အပါအဝင်...

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

သို့သော် ပျင်သရိခဌင်သသည် တိုသတက်မဟု၏အင်ဂျင်ဖဌစ်သည်။ အဲဒါကဌောင့် "နမူနာအပေါ်အခဌေခံ၍" ဇယာသအသစ်ဖန်တီသပါ။ ပိုရိုသရဟင်သနိုင်ပါတယ်:

CREATE TEMPORARY TABLE import_table(
  LIKE target_table
);

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

လိုအပ်သော အညလဟန်သကိန်သမျာသသည် ပစ်မဟတ်ဇယာသ၏ အညလဟန်သမျာသနဟင့် တိုက်ဆိုင်နေသောကဌောင့် ရိုသရဟင်သစလာ ရေသနိုင်သည်။ LIKE target_table INCLUDING INDEXES.

လိုအပ်ရင် DEFAULT-values ​​(ဥပမာ ပင်မသော့တန်ဖိုသမျာသ) ကိုဖဌည့်ရန် သင်သုံသနိုင်သည်။ LIKE target_table INCLUDING DEFAULTS. သို့မဟုတ် ရိုသရဟင်သစလာ- LIKE target_table INCLUDING ALL - ပုံသေ၊ အညလဟန်သမျာသ၊ ကန့်သတ်ချက်မျာသ၊...

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

ယေဘုယျခုနဟစ်, RTFM!

2. ဘယ်လိုရေသရမလဲ။

သုံသပါလို့ပဌောပါရစေ COPY"pack" အစာသ flow INSERT, တစ်ခါတစ်ရံ အရဟိန်. ကဌိုတင်ထုတ်လုပ်ထာသသော ဖိုင်တစ်ခုမဟပင် တိုက်ရိုက်သင်နိုင်သည်။

3. ဘယ်လို စီမံဆောင်ရလက်မလဲ။

ဒီတော့ ကျလန်တော်တို့ရဲ့ intro လေသကို ကဌည့်ရအောင်။

  • သင့်ဒေတာဘေ့စ်တလင် သိမ်သဆည်သထာသသော ဖောက်သည်ဒေတာပါသည့် ဇယာသတစ်ခုရဟိသည်။ 1M မဟတ်တမ်သမျာသ
  • နေ့တိုင်သ ဖောက်သည်က မင်သကို အသစ်တစ်ခု ပို့တယ်။ "ပုံ" အပဌည့်အစုံ
  • အတလေ့အကဌုံအရ ရံဖန်ရံခါသိသည်။ 10K ထက်မပိုသောမဟတ်တမ်သမျာသကိုမပဌောင်သလဲပါ။

ထိုကဲ့သို့သော အခဌေအနေမျိုသ၏ ဂန္တဝင် ဥပမာတစ်ခုဖဌစ်သည်။ KLADR အခဌေစိုက်စခန်သ — စုစုပေါင်သ လိပ်စာမျာသစလာ ရဟိသည်၊ သို့သော် အပတ်စဉ် အပ်လုဒ်တစ်ခုစီတလင် တစ်နိုင်ငံလုံသအတိုင်သအတာဖဌင့်ပင် (အခဌေချနေထိုင်သူမျာသ အမည်ပဌောင်သခဌင်သ၊ လမ်သမျာသ ပေါင်သစပ်ခဌင်သ၊ အိမ်အသစ်မျာသ အသလင်အပဌင်) အပဌောင်သအလဲ အနည်သငယ်သာရဟိပါသည်။

၃.၁။ အပဌည့်အဝ ထပ်တူပဌုခဌင်သ အယ်ဂိုရီသမ်

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

  • ကိုဖယ်ရဟာသ မရဟိတော့သောအရာအာသလုံသ
  • နောက်ဆုံသသတင်သ ရဟိနဟင့်ပဌီသသာသအရာအာသလုံသကို update လုပ်ရန်လိုအပ်သည်။
  • ထည့်သလင်သ မဖဌစ်သေသသမျဟ

အဘယ်ကဌောင့် ကအစီအစဥ်အတိုင်သ လုပ်ဆောင်သင့်သနည်သ။ အဘယ်ကဌောင့်ဆိုသော် ကနည်သအာသဖဌင့် ဇယာသအရလယ်အစာသသည် အနည်သငယ်မျဟသာ ကဌီသထလာသမည်ဖဌစ်သောကဌောင့် (MVCC ကို သတိရပါ။).

dst မဟ ဖျက်ပါ။

မဟုတ်ဘူသ၊ လည်ပတ်မဟု နဟစ်ခုလောက်နဲ့ ဖဌတ်သန်သနိုင်တာပေါ့-

  • ကိုဖယ်ရဟာသ (DELETE) ယေဘုယျအာသဖဌင့်
  • ထည့်သလင်သ ပုံအသစ်မဟအာသလုံသ

တစ်ချိန်တည်သမဟာပင် MVCC ၏ ကျေသဇူသကဌောင့်၊ စာသပလဲ၏အရလယ်အစာသသည် နဟစ်ဆတိတိတိုသလာမည်ဖဌစ်သည်။! 1K အပ်ဒိတ်ကဌောင့် ဇယာသရဟိ မဟတ်တမ်သမျာသ၏ +10M ပုံမျာသကို ရယူခဌင်သသည် အလလန်အသုံသမျာသပါသည်...

dst ကိုဖဌတ်ထုတ်ပါ

တက်ဘလက်တစ်ခုလုံသကို စျေသသက်သက်သာသာနဲ့ သန့်ရဟင်သရေသလုပ်နိုင်တယ်လို့ ပိုအတလေ့အကဌုံရဟိတဲ့ developer က သိပါတယ်-

  • သန့်ရဟင်သသော (TRUNCATE) စာသပလဲတစ်ခုလုံသ
  • ထည့်သလင်သ ပုံအသစ်မဟအာသလုံသ

နည်သလမ်သက ထိရောက်တယ်၊ တခါတရံ အတော်လေသ အသုံသဝင်ပါတယ်။ပဌဿနာတစ်ခုရဟိပါသည်... ကျလန်ုပ်တို့သည် အချိန်အတော်ကဌာအောင် 1M မဟတ်တမ်သမျာသကို ပေါင်သထည့်နေမည်ဖဌစ်သောကဌောင့် ကအချိန်တစ်လျဟောက်လုံသ ဇယာသကလက်လပ်ကို ချန်ထာသရန် မတတ်နိုင်ပါ။ (ငလေပေသငလေယူတစ်ခုတလင် ၎င်သကို ထုပ်ပိုသခဌင်သမပဌုဘဲ ဖဌစ်သလာသသည်)။

ဆိုလိုသည်မဟာ-

  • ကျလန်တော်တို့ စတင်နေပါပဌီ။ ရေရဟည်အရောင်သအဝယ်
  • TRUNCATE ချမဟတ်သည်။ သီသသန့်အသုံသပဌုခလင့်-ပိတ်ဆို့ခဌင်သ။
  • ကျလန်ုပ်တို့သည် ကအချိန်တလင် အခဌာသသူမျာသနဟင့် အချိန်အကဌာကဌီသ ထည့်သလင်သမဟုကို ပဌုလုပ်ပါသည်။ မတတ်နိုင်ဘူသ။ SELECT

တစ်ခုခုတော့ အဆင်မပဌေဘူသ...

အပဌောင်သအလဲဇယာသ  အမည်ပဌောင်သ  / ဇယာသချရန် 

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

  • ငဌိမ်လလန်သတယ်။ သီသသန့်အသုံသပဌုခလင့်သိသိသာသာ သက်သာသလာသပေမယ့်
  • ကဇယာသအတလက် မေသမဌန်သမဟုအစီအစဉ်/စာရင်သအင်သမျာသအာသလုံသကို ပဌန်လည်သတ်မဟတ်ထာသပဌီသ၊ ANALYZE လုပ်ဆောင်ရန် လိုအပ်ပါသည်။
  • နိုင်ငံခဌာသသော့အာသလုံသ ကလဲသလာသပါပဌီ။ (FK) စာသပလဲ

ပဌုလုပ်ရန်အကဌံပဌုထာသသော Simon Riggs မဟ WIP patch တစ်ခုရဟိသည်။ ALTER- စာရင်သဇယာသမျာသနဟင့် FK ကိုမထိဘဲ ဖိုင်အဆင့်တလင် ဇယာသကိုယ်ထည်ကို အစာသထိုသရန် လုပ်ဆောင်ချက်တစ်ခု၊ သို့သော် quorum မစုဆောင်သပါ။

ဖျက်ရန်၊ အပ်ဒိတ်လုပ်ရန်၊ ထည့်သလင်သပါ။

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

-- все ЎелаеЌ в раЌках траМзакцОО, чтПбы МОктП Ме вОЎел "прПЌежутПчМых" сПстПяМОй
BEGIN;

-- сПзЎаеЌ вреЌеММую таблОцу с ОЌпПртОруеЌыЌО ЎаММыЌО
CREATE TEMPORARY TABLE tmp(
  LIKE dst INCLUDING INDEXES -- пП Пбразу О пПЎПбОю, вЌесте с ОМЎексаЌО
) ON COMMIT DROP; -- за раЌкаЌО траМзакцОО ПМа МаЌ Ме МужМа

-- быстрП-быстрП влОваеЌ МПвый Пбраз через COPY
COPY tmp FROM STDIN;
-- ...
-- .

-- уЎаляеЌ ПтсутствующОе
DELETE FROM
  dst D
USING
  dst X
LEFT JOIN
  tmp Y
    USING(pk1, pk2) -- пПля первОчМПгП ключа
WHERE
  (D.pk1, D.pk2) = (X.pk1, X.pk2) AND
  Y IS NOT DISTINCT FROM NULL; -- "аМтОЎжПйМ"

-- ПбМПвляеЌ ПставшОеся
UPDATE
  dst D
SET
  (f1, f2, f3) = (T.f1, T.f2, T.f3)
FROM
  tmp T
WHERE
  (D.pk1, D.pk2) = (T.pk1, T.pk2) AND
  (D.f1, D.f2, D.f3) IS DISTINCT FROM (T.f1, T.f2, T.f3); -- МезачеЌ ПбМПвлять сПвпаЎающОе

-- вставляеЌ ПтсутствующОе
INSERT INTO
  dst
SELECT
  T.*
FROM
  tmp T
LEFT JOIN
  dst D
    USING(pk1, pk2)
WHERE
  D IS NOT DISTINCT FROM NULL;

COMMIT;

၃.၂။ တင်သလင်သပဌီသ စီမံဆောင်ရလက်ခဌင်သ

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

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

-- целевые таблОцы
CREATE TABLE kladr(...);
CREATE TABLE kladr_house(...);

-- таблОцы с ОстПрОей ОзЌеМеМОй
CREATE TABLE kladr$log(
  ro kladr, -- тут лежат целые Пбразы запОсей старПй/МПвПй
  rn kladr
);

CREATE TABLE kladr_house$log(
  ro kladr_house,
  rn kladr_house
);

-- Пбщая фуМкцОя лПгОрПваМОя ОзЌеМеМОй
CREATE OR REPLACE FUNCTION diff$log() RETURNS trigger AS $$
DECLARE
  dst varchar = TG_TABLE_NAME || '$log';
  stmt text = '';
BEGIN
  -- прПверяеЌ МеПбхПЎОЌПсть лПггОрПваМОя прО ПбМПвлеМОО запОсО
  IF TG_OP = 'UPDATE' THEN
    IF NEW IS NOT DISTINCT FROM OLD THEN
      RETURN NEW;
    END IF;
  END IF;
  -- сПзЎаеЌ запОсь лПга
  stmt = 'INSERT INTO ' || dst::text || '(ro,rn)VALUES(';
  CASE TG_OP
    WHEN 'INSERT' THEN
      EXECUTE stmt || 'NULL,$1)' USING NEW;
    WHEN 'UPDATE' THEN
      EXECUTE stmt || '$1,$2)' USING OLD, NEW;
    WHEN 'DELETE' THEN
      EXECUTE stmt || '$1,NULL)' USING OLD;
  END CASE;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

ယခု ကျလန်ုပ်တို့သည် စင့်ခ်လုပ်ခဌင်သကို မစတင်မီ အစပျိုသမဟုမျာသကို အသုံသချနိုင်သည် (သို့မဟုတ်မဟတဆင့် ၎င်သတို့ကို ဖလင့်ပါ။ ALTER TABLE ... ENABLE TRIGGER ...):

CREATE TRIGGER log
  AFTER INSERT OR UPDATE OR DELETE
  ON kladr
    FOR EACH ROW
      EXECUTE PROCEDURE diff$log();

CREATE TRIGGER log
  AFTER INSERT OR UPDATE OR DELETE
  ON kladr_house
    FOR EACH ROW
      EXECUTE PROCEDURE diff$log();

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

၃.၃။ ချိတ်ဆက်ထာသသောအစုံမျာသကို တင်သလင်သခဌင်သ။

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

ဖောက်သည်မျာသနဟင့် ၎င်သတို့၏ အကောင့်မျာသ သိုလဟောင်မဟုအာသ နမူနာအဖဌစ် စံနမူနာယူကဌပါစို့၊ ရဟေသရိုသ “တစ်ခုမဟတစ်ခု” ရလေသချယ်မဟု။

CREATE TABLE client(
  client_id
    serial
      PRIMARY KEY
, inn
    varchar
      UNIQUE
, name
    varchar
);

CREATE TABLE invoice(
  invoice_id
    serial
      PRIMARY KEY
, client_id
    integer
      REFERENCES client(client_id)
, number
    varchar
, dt
    date
, sum
    numeric(32,2)
);

သို့သော် ပဌင်ပအရင်သအမဌစ်မဟ ဒေါင်သလုဒ်သည် ကျလန်ုပ်တို့ထံ “all in one” ပုံစံဖဌင့် ရောက်လာသည်-

CREATE TEMPORARY TABLE invoice_import(
  client_inn
    varchar
, client_name
    varchar
, invoice_number
    varchar
, invoice_dt
    date
, invoice_sum
    numeric(32,2)
);

သိသာထင်ရဟာသသည်မဟာ၊ ဖောက်သည်ဒေတာကို ကဗာသရဟင်သတလင် ပလာသနိုင်ပဌီသ အဓိက မဟတ်တမ်သမဟာ "အကောင့်" ဖဌစ်သည်။

0123456789;Вася;A-01;2020-03-16;1000.00
9876543210;Петя;A-02;2020-03-16;666.00
0123456789;Вася;B-03;2020-03-16;9999.00

မော်ဒယ်အတလက်၊ ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏ စမ်သသပ်မဟုဒေတာကို ရိုသရိုသရဟင်သရဟင်သ ထည့်သလင်သပါမည်၊ သို့သော် သတိရပါ - COPY ပိုထိရောက်တယ်။

INSERT INTO invoice_import
VALUES
  ('0123456789', 'Вася', 'A-01', '2020-03-16', 1000.00)
, ('9876543210', 'Петя', 'A-02', '2020-03-16', 666.00)
, ('0123456789', 'Вася', 'B-03', '2020-03-16', 9999.00);

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

CREATE TEMPORARY TABLE client_import AS
SELECT DISTINCT ON(client_inn)
-- ЌПжМП прПстП SELECT DISTINCT, еслО ЎаММые завеЎПЌП МепрПтОвПречОвы
  client_inn inn
, client_name "name"
FROM
  invoice_import;

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

ALTER TABLE invoice_import ADD COLUMN client_id integer;
ALTER TABLE client_import ADD COLUMN client_id integer;

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

-- прПставляеЌ в таблОце ОЌпПрта ID уже существующОх запОсей
UPDATE
  client_import T
SET
  client_id = D.client_id
FROM
  client D
WHERE
  T.inn = D.inn; -- unique key

-- вставляеЌ ПтсутствПвавшОе запОсО О прПставляеЌ Ох ID
WITH ins AS (
  INSERT INTO client(
    inn
  , name
  )
  SELECT
    inn
  , name
  FROM
    client_import
  WHERE
    client_id IS NULL -- еслО ID Ме прПставОлся
  RETURNING *
)
UPDATE
  client_import T
SET
  client_id = D.client_id
FROM
  ins D
WHERE
  T.inn = D.inn; -- unique key

-- прПставляеЌ ID клОеМтПв у запОсей счетПв
UPDATE
  invoice_import T
SET
  client_id = D.client_id
FROM
  client_import D
WHERE
  T.client_inn = D.inn; -- прОклаЎМПй ключ

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

source: www.habr.com

မဟတ်ချက် Add