PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

အစီရင်ခံစာတလင် ခလင့်ပဌုနိုင်သော နည်သလမ်သအချို့ကို တင်ပဌထာသပါသည်။ တစ်နေ့လျဟင် သန်သနဟင့်ချီသော SQL queries မျာသ၏ စလမ်သဆောင်ရည်ကို စောင့်ကဌည့်ပါ။နဟင့် စောင့်ကဌည့်ထာသသော PostgreSQL ဆာဗာမျာသ ရာနဟင့်ချီ ရဟိပါသည်။

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


ဘယ်သူတလေ စိတ်ဝင်စာသလဲ။ သီသခဌာသပဌဿနာမျာသနဟင့် အမျိုသမျိုသသော optimization နည်သပညာမျာသကို ခလဲခဌမ်သစိတ်ဖဌာခဌင်သ။ SQL မေသမဌန်သမဟုမျာသနဟင့် PostgreSQL ရဟိ ပုံမဟန် DBA ပဌဿနာမျာသကို ဖဌေရဟင်သခဌင်သ - သင်လည်သ လုပ်ဆောင်နိုင်သည်။ ဆောင်သပါသမျာသကို ဆက်တိုက်ဖတ်ပါ။ ကအကဌောင်သအရာအပေါ်။

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)
ငါ့နာမည်က Kirill Borovikov ဖဌစ်ပဌီသ၊ ငါကိုယ်စာသပဌုတယ်။ Tensor ကုမ္ပဏီ. အထူသသဖဌင့်၊ ကျလန်ုပ်သည် ကျလန်ုပ်တို့၏ ကုမ္ပဏီရဟိ databases မျာသနဟင့် အလုပ်လုပ်ရာတလင် အထူသကျလမ်သကျင်ပါသည်။

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

ယေဘုယျအာသဖဌင့် Tensor သည် ကျလန်ုပ်တို့၏ဖောက်သည်တစ်သန်သအတလက်ဖဌစ်သည်။ VLSI သည် ကျလန်ုပ်တို့၏လျဟောက်လလဟာဖဌစ်သည်။: ကော်ပိုရိတ်လူမဟုရေသကလန်ရက်၊ ဗီဒီယိုဆက်သလယ်ရေသအတလက် ဖဌေရဟင်သချက်၊ ပဌည်တလင်သပဌည်ပ စာရလက်စာတမ်သစီသဆင်သမဟုအတလက်၊ စာရင်သကိုင်နဟင့် သိုလဟောင်ရုံမျာသအတလက် စာရင်သအင်သစနစ်မျာသ၊... ဆိုလိုသည်မဟာ ပေါင်သစည်သစီသပလာသရေသစီမံခန့်ခလဲမဟုအတလက် ပေါင်သစည်သထာသသော လုပ်ငန်သစီမံခန့်ခလဲမဟုအတလက် တူညီသော “ကဌီသမာသသောပေါင်သစပ်မဟု” တစ်ခု၊ ပဌည်တလင်သစီမံကိန်သမျာသ။

၎င်သတို့အာသလုံသ ပုံမဟန်အတိုင်သ ဖလံ့ဖဌိုသတိုသတက်လာစေရန်အတလက် နိုင်ငံတစ်ဝဟမ်သတလင် ဖလံ့ဖဌိုသရေသစင်တာ ၁၀ ခုရဟိပဌီသ ၎င်သတို့တလင် နောက်ထပ်တစ်ခုရဟိသည်။ developer 1000.

ကျလန်ုပ်တို့သည် 2008 ခုနဟစ်ကတည်သက PostgreSQL နဟင့် အလုပ်လုပ်ခဲ့ပဌီသ ကျလန်ုပ်တို့လုပ်ဆောင်သည့်အရာမျာသ - သုံသစလဲသူဒေတာ၊ ကိန်သဂဏန်သ၊ ခလဲခဌမ်သစိတ်ဖဌာမဟု၊ ပဌင်ပသတင်သအချက်အလက်စနစ်မျာသမဟ ဒေတာမျာသ- 400TB ထက်ပိုပါတယ်။. ထုတ်လုပ်မဟုတစ်ခုတည်သတလင် ဆာဗာပေါင်သ 250 ခန့်ရဟိပဌီသ၊ စုစုပေါင်သတလင် ကျလန်ုပ်တို့စောင့်ကဌည့်သည့်ဒေတာဘေ့စ်ဆာဗာ 1000 ခန့်ရဟိပါသည်။

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

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

အချို့သော DBMS မျာသသည် အရိပ်အမဌလက်မျာသကို လက်ခံသည်- "မဟုတ်ပါ၊ ကဇယာသနဟစ်ခုကို ထိုကဲ့သို့သော တန်သစီတစ်ခုတလင် ချိတ်ဆက်ပါ" ၊ သို့သော် PostgreSQL သည် ၎င်သကို မလုပ်နိုင်ပါ။ ကသည်မဟာ ထိပ်တန်သ developer မျာသ၏ သတိရဟိသော အနေအထာသဖဌစ်သည်- " developer မျာသအာသ အရိပ်အမဌလက်အချို့ကို အသုံသပဌုခလင့်ပေသခဌင်သထက် query optimizer ကို ပဌီသစေချင်ပါသည်။"

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

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

ယေဘူယျအာသဖဌင့်၊ developer [DBA သို့] တလင် မည်သည့်ဂန္တဝင်ပဌဿနာမျာသ ရဟိတတ်သနည်သ။ “ဒီမဟာ ကျလန်တော်တို့ တောင်သဆိုချက် ပဌီသသလာသပါပဌီ။ အရာအာသလုံသသည် ကျလန်ုပ်တို့နဟင့်အတူ နဟေသကလေသနေပါသည်။အရာအာသလုံသ တလဲလောင်သဖဌစ်နေပဌီ... တစ်ခုခုတော့ ဒုက္ခရောက်နေပဌီ!"

အကဌောင်သရင်သမျာသသည် အမဌဲတမ်သနီသပါသတူညီသည်-

  • ထိရောက်မဟုမရဟိသော query algorithm
    ဆော့ဖ်ဝဲရေသသာသသူ- "ယခုကျလန်ုပ်သည် JOIN မဟတစ်ဆင့် SQL တလင် စာသပလဲ 10 လုံသကို ပေသပါသည်။ သို့သော် အံ့ဩစရာမျာသ ဖဌစ်ပေါ်လာခဌင်သမရဟိပါ၊ ထိုကဲ့သို့သော ကလဲပဌာသမဟုရဟိသော မည်သည့်စနစ်မဆို (တစ်ခုမဟ ဇယာသကလက် ၁၀ ခု) သည် အမဌဲတမ်သ အမဟာသအယလင်သတစ်မျိုသကို ပေသပါသည်။ [ဆောင်သပါသ]
  • မသက်ဆိုင်သောစာရင်သဇယာသ
    ကအချက်သည် ကဌီသမာသသောဒေတာအစုံကို ဆာဗာပေါ်သို့ သင် “လောင်သ” သောအခါ၊ တောင်သဆိုချက်တစ်ခုပဌုလုပ်ပဌီသ သင့်တက်ဘလက်ကို “လိင်ဆက်ဆံခဌင်သ” ပေသသောအခါတလင် ကအချက်သည် အလလန်သက်ဆိုင်ပါသည်။ မနေ့က မဟတ်တမ်သ 10 ခုရဟိပဌီသ ဒီနေ့ 10 သန်သရဟိပေမယ့် PostgreSQL က ဒါကို သတိမပဌုမိသေသတဲ့အတလက် အဲဒါကို ပဌောပဌဖို့ လိုပါတယ်။ [ဆောင်သပါသ]
  • အရင်သအမဌစ်မျာသပေါ်တလင် "ပလပ်"
    ဒစ်၊ မန်မိုရီ သို့မဟုတ် ပရိုဆက်ဆာ စလမ်သဆောင်ရည် မလုံလောက်သော အာသနည်သဆာဗာတလင် ကဌီသမာသပဌီသ လေသလံသော ဒေတာဘေ့စ်တစ်ခုကို သင် ထည့်သလင်သထာသသည်။ ဒါပါပဲ... တစ်နေရာရာမဟာ သင်ခုန်လို့မရတော့တဲ့ စလမ်သဆောင်ရည်မျက်နဟာကျက်တစ်ခုရဟိတယ်။
  • ပိတ်ဆို့ခဌင်သ။
    ကအရာသည် ခက်ခဲသောအချက်ဖဌစ်သည်၊ သို့သော် ၎င်သတို့သည် အမျိုသမျိုသသော ပဌုပဌင်မလမ်သမံထာသသော မေသခလန်သမျာသ (ထည့်သလင်သရန်၊ အပ်ဒိတ်လုပ်ခဌင်သ၊ ဖျက်ခဌင်သ) အတလက် အသက်ဆိုင်ဆုံသဖဌစ်သည် - ကအရာသည် သီသခဌာသကဌီသမာသသောအကဌောင်သအရာဖဌစ်သည်။

အစီအစဉ်တစ်ခုရယူခဌင်သ။

...အခဌာသအရာအာသလုံသအတလက်၊ အစီအစဉ်တစ်ခုလိုတယ်။! ဆာဗာအတလင်သ ဘာတလေဖဌစ်နေလဲဆိုတာကို ကဌည့်ဖို့ လိုပါတယ်။

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

PostgreSQL အတလက် query execution plan သည် စာသာသကိုယ်စာသပဌုမဟုတလင် query execution algorithm ၏သစ်ပင်ဖဌစ်သည်။ အစီအစဉ်ရေသဆလဲသူမဟ ခလဲခဌမ်သစိတ်ဖဌာမဟုရလဒ်အရ အထိရောက်ဆုံသဖဌစ်ကဌောင်သ တလေ့ရဟိရသည့် အယ်လဂိုရီသမ် အတိအကျဖဌစ်သည်။

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

စုံစမ်သမေသမဌန်သမဟု အစီအစဉ်ကို ရယူရန် အလလယ်ဆုံသနည်သလမ်သမဟာ ထုတ်ပဌန်ချက်ကို အကောင်အထည်ဖော်ရန် ဖဌစ်သည်။ EXPLAIN. အစစ်အမဟန် attribute မျာသအာသလုံသကို ရယူရန်၊ ဆိုလိုသည်မဟာ အခဌေခံပေါ်တလင် query တစ်ခုကို အမဟန်တကယ်လုပ်ဆောင်ရန်၊ EXPLAIN (ANALYZE, BUFFERS) SELECT ....

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

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

တောင်သဆိုချက်အာသ ဆာဗာပေါ်တလင် လုပ်ဆောင်သည့်အချိန်တလင် ဖဌစ်ပျက်ခဲ့သည်ကို အတိအကျနာသလည်ရန်အတလက် စမတ်လူမျာသက ရေသသာသခဲ့သည်။ auto_explain module. ၎င်သသည် အသုံသအမျာသဆုံသ PostgreSQL ဖဌန့်ဝေမဟုမျာသ အာသလုံသနီသပါသတလင် ရဟိနေပဌီသ config ဖိုင်တလင် ရိုသရဟင်သစလာ အသက်သလင်သနိုင်သည်။

အချို့သော တောင်သဆိုချက်သည် သင်ပဌောထာသသည့် ကန့်သတ်ချက်ထက် ပိုရဟည်သည်ကို သိရဟိပါက၊ ၎င်သသည် လုပ်ဆောင်သည်။ ကတောင်သဆိုချက်၏ အစီအစဉ်၏ "လျဟပ်တစ်ပဌက်ဓာတ်ပုံ" နဟင့် ၎င်သတို့ကို မဟတ်တမ်သတလင် တလဲရေသပါ။.

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

အခု အာသလုံသအဆင်ပဌေနေပုံရတယ်၊ ငါတို့က မဟတ်တမ်သကိုသလာသပဌီသ ဟိုမဟာကဌည့်... [စာသာသခဌေစလပ်]။ ဒါပေမယ့် 11ms လောက် အချိန်ယူရတဲ့အတလက် အဲဒါက အရမ်သကောင်သတဲ့ အစီအစဉ်ကလလဲလို့ ကျလန်တော်တို့က ဘာမဟ မပဌောနိုင်ပါဘူသ။

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

ဒါပေမယ့် ရဟင်သရဟင်သလင်သလင်သမသိရရင်တောင် အဆင်မပဌေရင်တောင် အခဌေခံကျတဲ့ ပဌဿနာတလေ ပိုမျာသပါတယ်။

  • node ကိုညလဟန်ပဌသည်။ သစ်ပင်ခလဲတစ်ခုလုံသ၏ အရင်သအမဌစ်ပေါင်သစု သူ့အောက်မဟာ။ ဆိုလိုသည်မဟာ၊ ကအထူသညလဟန်သကိန်သစကန်ဖတ်ခဌင်သအတလက် အချိန်မည်မျဟသုံသစလဲခဲ့သည်ကို ၎င်သအောက်တလင် ရဟာဖလေတလေ့ရဟိနိုင်မည်မဟုတ်ပေ။ ကျလန်ုပ်တို့သည် အတလင်သတလင် "ကလေသမျာသ" နဟင့် အခဌေအနေဆိုင်ရာ ပဌောင်သလဲမဟုမျာသ၊ CTE မျာသ ရဟိမရဟိ - နဟင့် ကအရာအာသလုံသကို "ကျလန်ုပ်တို့၏စိတ်ထဲတလင်" နုတ်ရန် တက်ကဌလစလာကဌည့်ရဟုရပါမည်။
  • ဒုတိယအချက်- node တလင်ဖော်ပဌထာသသောအချိန်သည် single node လည်ပတ်ချိန်. ဥပမာအာသဖဌင့်၊ ဇယာသမဟတ်တမ်သမျာသမဟတစ်ဆင့် ကလင်သဆက်တစ်ခုအာသ ကဌိမ်ဖန်မျာသစလာပဌုလုပ်ခဌင်သကဌောင့် က node အာသ လုပ်ဆောင်ပါက၊ ထို့နောက် loops—က node ၏ စက်ဝန်သမျာသ—အစီအစဉ်တလင် တိုသလာပါသည်။ ဒါပေမယ့် အဏုမဌူဗုံသ ကလပ်မျက်ချိန်ဟာ အစီအစဉ်အရ အတူတူပါပဲ။ ဆိုလိုသည်မဟာ၊ က node ကိုစုစုပေါင်သမည်မျဟကဌာအောင်လုပ်ဆောင်ခဲ့သည်ကိုနာသလည်ရန်အတလက်၊ သင်သည်အရာတစ်ခုနဟင့်တစ်ခုထပ်၍ "သင်၏ခေါင်သ၌" ကိုထပ်ပလာသရန်လိုအပ်သည်။

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

သို့သော် ကျလန်ုပ်တို့တလင် developer 1000 ရဟိပဌီသ ၎င်သတို့တစ်ညသစီအာသ ကအတလေ့အကဌုံကို သင်မပဌောပဌနိုင်ပါ။ ငါ မင်သသိတယ် ဒါပေမယ့် ဟိုမဟာ တစ်ယောက်ယောက်က မသိတော့ဘူသ။ သူ သင်ယူနိုင်သည်ဖဌစ်စေ မသင်ဖဌစ်နိုင်သော်လည်သ ယခုအလုပ်လုပ်ရန် လိုအပ်ပဌီသ ကအတလေ့အကဌုံကို သူဘယ်မဟာရမည်နည်သ။

စိတ်ကူသနဲ့ စီစဉ်ပါ။

ထို့ကဌောင့် ကပဌဿနာမျာသကို ကိုင်တလယ်ဖဌေရဟင်သရန် လိုအပ်ကဌောင်သ ကျလန်ုပ်တို့ သဘောပေါက်ပါသည်။ အစီအစဥ်ကို ကောင်သစလာမဌင်ယောင်ခဌင်သ။. [ဆောင်သပါသ]

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

ကျလန်ုပ်တို့သည် “ဈေသကလက်ကိုဖဌတ်၍” ညသစလာသလာသသည် - မည်ကဲ့သို့ရဟိသည်ကိုကဌည့်ရန် အင်တာနက်ပေါ်တလင် ကဌည့်ကဌပါစို့။

သို့သော် အနည်သနဟင့်အမျာသ ဖဌစ်ထလန်သနေသော “တိုက်ရိုက်” ဖဌေရဟင်သနည်သမျာသ အလလန်နည်သပါသကဌောင်သ တလေ့ရသည် - စာသာသအရ တစ်ခုတည်သသော၊ ရဟင်သပဌ.depesz.com Hubert Lubaczewski မဟ "feed" အကလက်တလင် အစီအစဉ်၏ စာသာသကို ကိုယ်စာသပဌုသည့် အကလက်ကို ထည့်သလင်သသောအခါ၊ ခလဲခဌမ်သစိတ်ဖဌာထာသသော ဒေတာပါသည့် ဇယာသတစ်ခုကို သင့်အာသ ပဌသသည်-

  • node ၏ကိုယ်ပိုင်လုပ်ဆောင်ချိန်
  • သစ်ပင်ခလဲတစ်ခုလုံသအတလက် စုစုပေါင်သအချိန်
  • စာရင်သအင်သအရ မျဟော်လင့်ထာသသည့် မဟတ်တမ်သမျာသ ပဌန်လည်ရယူခဲ့သည်။
  • node body က သူ့ဟာသူ

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

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

ဒါပေမယ့် ပဌဿနာလေသတလေလည်သ ရဟိတယ်။

ပထမညသစလာ၊ "copy-paste" ၏ကဌီသမာသသောပမာဏ။ သစ်လုံသတစ်ပိုင်သကို ယူ၍ ထိုနေရာ၌ ကပ်လျက်၊ အထပ်ထပ်၊

ဒုတိယအ ဒေတာဖတ်ရဟုမဟုပမာဏကို ခလဲခဌမ်သစိတ်ဖဌာခဌင်သမရဟိပါ။ - တူညီသော buffers အထလက် EXPLAIN (ANALYZE, BUFFERS)၊ ငါတို့ဒီမဟာမတလေ့ဘူသ။ သူသည် ၎င်သတို့ကို မည်သို့ခလဲခဌမ်သရမည်ကို မသိ၊ ၎င်သတို့ကို နာသလည်ပဌီသ ၎င်သတို့နဟင့် လုပ်ဆောင်ရမည်ကို ရိုသရဟင်သစလာ မသိပေ။ သင်သည် ဒေတာအမျာသအပဌာသကို ဖတ်ပဌီသ disk နဟင့် memory cache ကို လလဲမဟာသစလာခလဲဝေယူနေနိုင်သည်ကို သိရဟိသောအခါ ကအချက်အလက်သည် အလလန်အရေသကဌီသပါသည်။

တတိယအနုတ်လက္ခဏာကတော့ ဒီပရောဂျက်ရဲ့ ဖလံ့ဖဌိုသတိုသတက်မဟု အလလန်အာသနည်သပါတယ်။ ကုဒ်မျာသသည် အလလန်သေသငယ်သည်၊ ခဌောက်လလျဟင် တစ်ကဌိမ်၊ ကုဒ်သည် Perl တလင်ရဟိနေပါက ကောင်သပါတယ်။

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

သို့သော် ကအရာအာသလုံသသည် "သီချင်သစာသာသမျာသ" ဖဌစ်သည်၊ ကျလန်ုပ်တို့သည် ကအရာဖဌင့် တစ်နည်သနည်သဖဌင့် နေထိုင်နိုင်သော်လည်သ ကဝန်ဆောင်မဟုမဟ ကျလန်ုပ်တို့ကို လလန်စလာလလဲသလာသစေသည့် အရာတစ်ခုရဟိပါသည်။ ကအရာမျာသသည် Common Table Expression (CTE) နဟင့် InitPlan/SubPlan ကဲ့သို့သော ဒိုင်နိုက်နမစ် node အမျိုသမျိုသကို ခလဲခဌမ်သစိတ်ဖဌာရာတလင် အမဟာသအယလင်သမျာသဖဌစ်သည်။

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

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

နောက်တော့ ငါတို့ကိုယ်တိုင်ရေသဖို့ အချိန်ရောက်ပဌီဆိုတာ သိလိုက်ရတယ်။ ဆော့ဖ်ဝဲရေသသာသသူတိုင်သက "ယခုကျလန်ုပ်တို့ကိုယ်တိုင်ရေသပါမည်၊ အလလန်လလယ်ကူလိမ့်မည်!"

ဝဘ်ဝန်ဆောင်မဟုမျာသအတလက် ပုံမဟန်အစုတစ်ခုယူထာသသည်- Node.js + Express ကိုအခဌေခံထာသသော core၊ လဟပသောပုံမျာသမျာသအတလက် Bootstrap နဟင့် D3.js ကိုအသုံသပဌုထာသသည်။ ကျလန်ုပ်တို့၏မျဟော်လင့်ချက်မျာသသည် အပဌည့်အဝတရာသမျဟတသည် - ကျလန်ုပ်တို့သည် 2 ပတ်အတလင်သ ပထမဆုံသ နမူနာကို ရရဟိခဲ့ပါသည်။

  • စိတ်ကဌိုက်အစီအစဉ် parser
    ဆိုလိုသည်မဟာ၊ ယခု ကျလန်ုပ်တို့သည် PostgreSQL မဟထုတ်လုပ်သော မည်သည့်အစီအစဉ်ကိုမဆို ပိုင်သခဌာသနိုင်ပဌီဖဌစ်သည်။
  • dynamic nodes မျာသ၏ မဟန်ကန်သော ခလဲခဌမ်သစိတ်ဖဌာမဟု - CTE Scan၊ InitPlan၊ SubPlan
  • ကဌာသခံဖဌန့်ဖဌူသမဟုခလဲခဌမ်သစိတ်ဖဌာခဌင်သ။ - ဒေတာစာမျက်နဟာမျာသကို မမ်မိုရီမဟဖတ်သည့်နေရာ၊ ဒေသဆိုင်ရာ ကက်ရဟ်၊ ဒစ်ခ်မဟ နေရာတလင်
  • ရဟင်သလင်သမဟုရခဲ့ပါတယ်။
    ကအရာအာသလုံသကို မဟတ်တမ်သတလင် “တူှ” ရန်မဟုတ်သော်လည်သ ပုံတလင် “အညံ့ဆုံသလင့်ခ်” ကို ချက်ချင်သကဌည့်ရန်။

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

syntax highlighting ပါ၀င်သော ကကဲ့သို့သော အရာတစ်ခု ကျလန်ုပ်တို့ရရဟိသည်။ သို့သော် မျာသသောအာသဖဌင့် ကျလန်ုပ်တို့၏ developer မျာသသည် အစီအစဉ်၏ ပဌီသပဌည့်စုံသောကိုယ်စာသပဌုမဟုဖဌင့် အလုပ်မလုပ်တော့ဘဲ ပိုတိုသောပုံစံဖဌင့် လုပ်ဆောင်ကဌသည်။ နောက်ဆုံသတလင်၊ ကျလန်ုပ်တို့သည် နံပါတ်မျာသအာသလုံသကို ခလဲခဌမ်သစိတ်ဖဌာပဌီသ ၎င်သတို့ကို ဘယ်ညာ ချလိုက်ပဌီသ အလယ်တလင် ပထမစာကဌောင်သကိုသာ ချန်ထာသခဲ့သည်၊ ၎င်သသည် မည်သို့သော node အမျိုသအစာသဖဌစ်သည်- CTE စကင်န်၊ CTE မျိုသဆက် သို့မဟုတ် Seq Scan အချို့ကို နိမိတ်လက္ခဏာအရ သိရသည်။

ကသည်မဟာ ကျလန်ုပ်တို့ ခေါ်ဆိုသော အတိုကောက် ကိုယ်စာသပဌုမဟု ဖဌစ်သည်။ အစီအစဉ်ပုံစံပုံစံ.

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

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

ကျလန်ုပ်တို့သည် node ကိုညလဟန်ပဌပဌီသကဌည့်ပါ - Seq Scan သည် စုစုပေါင်သအချိန်၏လေသပုံတစ်ပုံထက်နည်သပဌီသ ကျန် 3/4 ကို CTE Scan ဖဌင့်ယူဆောင်သလာသပါသည်။ ထိတ်လန့်! သင့်မေသမဌန်သချက်မျာသတလင် ၎င်သတို့ကိုတက်ကဌလစလာအသုံသပဌုပါက CTE Scan ၏ "မီသနဟုန်သ" နဟင့်ပတ်သက်သော သေသငယ်သောမဟတ်ချက်တစ်ခုဖဌစ်သည်။ ၎င်သတို့သည် အလလန်မဌန်သည်မဟုတ်ပါ - ၎င်သတို့သည် ပုံမဟန်စာသပလဲစကင်ဖတ်ခဌင်သထက်ပင် ယုတ်ညံ့ပါသည်။ [ဆောင်သပါသ] [ဆောင်သပါသ]

ဒါပေမယ့် ပုံမဟန်အာသဖဌင့်တော့ Seq Scan လုပ်တဲ့ အချိန်ရဲ့ ထက်ဝက်ကျော်က Seq Scan “စာသတယ်” ဆိုတာကို ချက်ခဌင်သထောက်ပဌတဲ့အခါ၊ ပုံမဟန်အာသဖဌင့်တော့ ဒီပုံတလေက ပိုစိတ်ဝင်စာသစရာကောင်သပဌီသ ပိုရဟုပ်ထလေသပါတယ်။ ထို့အပဌင်၊ အတလင်သတလင် Filter တစ်မျိုသမျိုသရဟိပါသည်၊ မဟတ်တမ်သမျာသစလာကို လလဟင့်ပစ်ထာသပါသည်... ကပုံကို developer ထံ တိုက်ရိုက်လလဟင့်နိုင်ပဌီသ "Vasya၊ ဒီမဟာ အရာအာသလုံသက မင်သအတလက် မကောင်သပါဘူသ။ တလေသကဌည့်ပါ၊ တစ်ခုခုမဟာသနေပဌီ!”

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

သဘာဝအာသဖဌင့်၊ အချို့သော “ထလန်ခဌစ်မျာသ” ပါ၀င်သည်။

ပထမဆုံသတလေ့တာက လဟည့်ပတ်မဟုပဌဿနာပါ။ အစီအစဉ်ရဟိ node တစ်ခုစီ၏ အချိန်ကို 1 ÎŒs တိကျမဟုဖဌင့် ညလဟန်ပဌသည်။ နဟင့် node cycles အရေအတလက် 1000 ကျော်လလန်သောအခါ - ကလပ်မျက်ပဌီသနောက် PostgreSQL သည် "တိကျမဟုအတလင်သ" ကိုပိုင်သခဌာသပဌီသ ပဌန်လည်တလက်ချက်သောအခါတလင် စုစုပေါင်သအချိန် "0.95ms နဟင့် 1.05ms အကဌာသတစ်နေရာ" ကိုရရဟိသည်။ မိုက်ခရိုစက္ကန့်မျာသအထိ ရေတလက်သည့်အခါ၊ အဆင်ပဌေသော်လည်သ ၎င်သသည် [မီလီ] စက္ကန့်မျာသပဌီသသောအခါ၊ "မည်မျဟသုံသစလဲသော" အစီအစဉ်၏ ဆုံမဟတ်မျာသသို့ အရင်သအမဌစ်မျာသကို "ဖဌုန်သခဌင်သ" သောအခါတလင် ကအချက်အလက်ကို ထည့်သလင်သစဉ်သစာသရပါမည်။

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

ဒုတိယအချက်၊ ပိုရဟုပ်ထလေသသည်မဟာ အရင်သအမဌစ်မျာသ (ထိုကဌာသခံမျာသ) မျာသအကဌာသ ရလေ့လျာသနေသော node မျာသကဌာသတလင် ဖဌန့်ဖဌူသမဟုဖဌစ်သည်။ ဒါက နမူနာပုံစံရဲ့ ပထမ 2 ပတ်နဲ့ နောက်ထပ် 4 ပတ်အတလက် ကုန်ကျစရိတ်ပါ။

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

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

အစီအစဉ်ကို ကဌည့်ရဟုပဌီသ နာသလည်ပါသည် - ထူသဆန်သသည်မဟာ၊ ကျလန်ုပ်တို့တလင် Seq Scan တလင် "သုံသစလဲသည်" 3 ခု (ဒေတာစာမျက်နဟာမျာသ)၊ CTE Scan တလင် နောက်ထပ် 1 ခုနဟင့် ဒုတိယ CTE Scan တလင် နောက်ထပ် 2 ခုရဟိသည်။ ဆိုလိုသည်မဟာ၊ အရာအာသလုံသကို ရိုသရိုသရဟင်သရဟင်သ ပေါင်သလိုက်လျဟင် 6 ရလိမ့်မည်၊ သို့သော် တက်ဘလက်မဟ ကျလန်ုပ်တို့သည် 3 သာဖတ်သည်။ CTE Scan သည် မည်သည့်နေရာမဟ မဖတ်သော်လည်သ process memory နဟင့် တိုက်ရိုက်အလုပ်လုပ်သည်။ ဆိုလိုသည်မဟာ ကနေရာတလင် တစ်စုံတစ်ခု မဟာသယလင်သနေသည်မဟာ ထင်ရဟာသသည်။

အမဟန်မဟာ၊ Seq Scan မဟ တောင်သဆိုထာသသည့် ဒေတာ စာမျက်နဟာ ၃ စောင်စလုံသမဟာ၊ ပထမ ၁ စောင်က 3st CTE Scan ကို တောင်သဆိုခဲ့ပဌီသ၊ ထို့နောက် စာမျက်နဟာ ၂ နဟင့် နောက်ထပ် ၂ စောင်ကို သူ့ထံ ဖတ်ပဌခဲ့ကဌောင်သ ထလက်ပေါ်လာပါသည်။ စာမျက်နဟာ 1 သည် ဒေတာကို ဖတ်ခဲ့သည်၊ 1 မဟုတ်ပါ။

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

ပဌီသတော့ ဒီပုံက အစီအစဥ်ကို အကောင်အထည်ဖော်တာက သစ်ပင်မဟုတ်တော့ဘဲ accyclic graph တစ်မျိုသမျိုသကို နာသလည်လာစေပါတယ်။ ပဌီသတော့ "အစက ဘယ်ကလာသလဲ" ကို နာသလည်နိုင်စေရန် ကကဲ့သို့သော ပုံတစ်ပုံရဟိသည်။ ဆိုလိုသည်မဟာ၊ ကနေရာတလင် ကျလန်ုပ်တို့သည် pg_class မဟ CTE တစ်ခုကို ဖန်တီသခဲ့ပဌီသ ၎င်သကို နဟစ်ကဌိမ်တိုင်တိုင် တောင်သဆိုခဲ့ပဌီသ၊ ကျလန်ုပ်တို့၏ အချိန်အာသလုံသနီသပါသကို ဒုတိယအကဌိမ် တောင်သဆိုသောအခါတလင် ဌာနခလဲတလင် ကုန်ဆုံသခဲ့သည်။ 2st entry ကိုဖတ်ခဌင်သသည် တက်ဘလက်မဟ 101st entry ကိုဖတ်ရုံထက်ပိုမိုစျေသကဌီသကဌောင်သရဟင်သလင်သသည်။

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

ကျလန်တော်တို့ ခဏလောက် အသက်ရဟူသလင်သတယ်။ သူတို့က "အခု နီယို၊ မင်သ ကလန်ဖူသကို သိတယ်။ ယခု ကျလန်ုပ်တို့၏အတလေ့အကဌုံသည် သင့်ဖန်သာသပဌင်ပေါ်တလင် မဟန်ကန်နေပဌီဖဌစ်သည်။ အခုသုံသလို့ရတယ်။" [ဆောင်သပါသ]

မဟတ်တမ်သ စုစည်သမဟု

ကျလန်ုပ်တို့၏ developer 1000 သည် သက်ပဌင်သတစ်ချက်ချလိုက်သည်။ သို့သော် ကျလန်ုပ်တို့တလင် ရာနဟင့်ချီသော "တိုက်ခိုက်ရေသ" ဆာဗာမျာသသာရဟိသည်ကို နာသလည်ထာသပဌီသ developer မျာသဘက်မဟ က "ကော်ပီကူသထည့်ခဌင်သ" အာသလုံသကို လုံသဝအဆင်ပဌေမည်မဟုတ်ပါ။ ငါတို့ကိုယ်တိုင် စုဆောင်သရမယ်ဆိုတာ သိလာတယ်။

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

ယေဘူယျအာသဖဌင့်၊ ကိန်သဂဏန်သအချက်အလက်မျာသကို စုဆောင်သနိုင်သည့် စံ module တစ်ခုရဟိသော်လည်သ၊ ၎င်သကို config တလင် activated လုပ်ရန် လိုအပ်သည် မော်ဂျူသ pg_stat_statements. ဒါပေမယ့် သူက ငါတို့နဲ့ မကိုက်ညီဘူသ။

ပထမညသစလာ၊ ၎င်သသည် တူညီသောဒေတာဘေ့စ်အတလင်သ မတူညီသောအစီအစဥ်မျာသကို အသုံသပဌု၍ တူညီသောမေသခလန်သမျာသထံ တာဝန်ပေသသည်။ ကလဲပဌာသခဌာသနာသသော QueryIds. အဲဒါကို အရင်လုပ်ရင် SET search_path = '01'; SELECT * FROM user LIMIT 1;ပဌီသတော့ SET search_path = '02'; တူညီသော တောင်သဆိုချက်၊ ထို့နောက် က module ၏ စာရင်သအင်သမျာသသည် မတူညီသော မဟတ်တမ်သမျာသ ရဟိလိမ့်မည် ဖဌစ်ပဌီသ၊ အစီအစဉ်မျာသကို ထည့်သလင်သစဉ်သစာသခဌင်သမရဟိဘဲ ကတောင်သဆိုမဟု ပရိုဖိုင်၏ ဆက်စပ်မဟုတလင် ယေဘုယျ စာရင်သအင်သမျာသကို ကျလန်ုပ် စုဆောင်သနိုင်မည် မဟုတ်ပါ။

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

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

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

ထို့ကဌောင့် ကျလန်ုပ်တို့သည် ကော်ပီကူသထည့်ရန် ဆုံသဖဌတ်ပဌီသ စတင်ရေသသာသခဲ့သည်။ စုဆောင်သ.

စုဆောင်သသူသည် SSH မဟတစ်ဆင့် ချိတ်ဆက်ကာ၊ အသိအမဟတ်ပဌုလက်မဟတ်ကို အသုံသပဌု၍ ဒေတာဘေ့စ်နဟင့် ဆာဗာသို့ လုံခဌုံသောချိတ်ဆက်မဟုကို ထူထောင်ပေသသည်၊ tail -F မဟတ်တမ်သဖိုင်တလင် ၎င်သကို “တလယ်ကပ်”။ ဒါကဌောင့် ဒီ session မဟာ မဟတ်တမ်သဖိုင်တစ်ခုလုံသ၏ ပဌီသပဌည့်စုံသော "မဟန်" တစ်ခုကို ကျလန်ုပ်တို့ရရဟိသည်။ဆာဗာမဟထုတ်ပေသသော၊ ဆာဗာပေါ်ရဟိ ဝန်သည် အနည်သငယ်မျဟသာဖဌစ်ပါသည်၊ ကျလန်ုပ်တို့သည် ထိုနေရာတလင် မည်သည့်အရာကိုမျဟ ခလဲခဌမ်သစိတ်ဖဌာခဌင်သမရဟိသောကဌောင့်၊ ကျလန်ုပ်တို့သည် အသလာသအလာကို ထင်ဟပ်နေပါသည်။

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

ထို့ကဌောင့်၊ ကျလန်ုပ်တို့သည် ချိတ်ဆက်မဟုနဟစ်ခုကို “ဆန့်တန်သ” သည်- ပထမတစ်ခုက မဟတ်တမ်သကို သူ့ဘာသာသူ “နာသဆင်” ရန်၊ ၎င်သကို ကျလန်ုပ်တို့ထံ ယူဆောင်သလာသပဌီသ၊ ဒုတိယမဟာ အခဌေကို အခါအာသလျော်စလာ မေသရန်။ "သို့သော် oid 123 ပါသော ဆိုင်သဘုတ်ကို ပိတ်ဆို့ထာသကဌောင်သ မဟတ်တမ်သက ပဌသသည်" သို့သော် ၎င်သသည် developer အတလက် ဘာမဟ အဓိပ္ပာယ်မရဟိပါ၊ ဒေတာဘေ့စ်ကို မေသပါက "ဘာပဲဖဌစ်ဖဌစ် OID = 123 ဆိုတာ ဘာပဲဖဌစ်ဖဌစ်?" ထို့ကဌောင့် ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့ကိုယ်တိုင် မသိသေသသော အခဌေအမဌစ်ကို အခါအာသလျော်စလာ မေသပါသည်။

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

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

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

သို့သော် ရိုသရဟင်သစလာ "လောင်သခဌင်သ" ဒေတာသည် ကျလန်ုပ်တို့၏နည်သပညာမဟုတ်ပါ။ ဆာဗာတစ်ရာတလင် တစ်စက္ကန့်လျဟင် တောင်သဆိုမဟု 50k ခန့်ရဟိပါက၊ ၎င်သသည် တစ်နေ့လျဟင် မဟတ်တမ်သ 100-150GB ထုတ်ပေသမည်ဖဌစ်သည်။ ထို့ကဌောင့် ကျလန်ုပ်တို့သည် အခဌေကို ဂရုတစိုက် “ဖဌတ်” ရမည်။

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

နောက်တစ်ချက်ကတော့ ကျလန်တော်တို့ သင်ယူခဲ့တာ (အတင်သအကဌပ်)၊ သုံသပဌီသရေသရတာ အရမ်သမဌန်တယ်။ COPY. ဒါတင်မကဘူသ။ COPYဘာလို့လဲဆိုတော့ သူက ထက်မဌန်တယ်။ INSERTပိုမဌန်တယ်။

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

တတိယအချက် - စလဲစလဲလန်သလန်သ အစပျိုသမဟုမျာသ အသီသသီသ နဟင့် နိုင်ငံခဌာသသော့မျာသကို စလန့်လလဟတ်ပါ။. ဆိုလိုသည်မဟာ၊ ကျလန်ုပ်တို့တလင် ရည်ညလဟန်သသမာဓိ လုံသဝမရဟိပါ။ အကဌောင်သမဟာ သင့်တလင် FKs တစ်စုံပါသော ဇယာသတစ်ခုရဟိပဌီသ အကယ်၍ "ကနေရာတလင် FK မဟ ကိုသကာသသော မဟတ်တမ်သမဟတ်တမ်သဖဌစ်ပါသည်" ဟု သင်ပဌောပါက၊ ထို့နောက် ၎င်သကို ထည့်သလင်သသည့်အခါ PostgreSQL၊ ဘာမဟမကျန်တော့ဘဲ ရိုသသာသစလာ ဘယ်လိုယူရမလဲ SELECT 1 FROM master_fk1_table WHERE ... သင်ထည့်သလင်သရန်ကဌိုသစာသနေသည့် အထောက်အထာသဖဌင့် - ကမဟတ်တမ်သရဟိနေခဌင်သရဟိမရဟိ စစ်ဆေသရန်၊ သင်၏ထည့်သလင်သခဌင်သဖဌင့် ကနိုင်ငံခဌာသကီသကို "မချိုသဖျက်ပါ" ဟူ၍သာ စစ်ဆေသပါ။

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

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

ယခု သင့်တလင် သတ်မဟတ်ထာသသော host မဟဖဌတ်သန်သခဲ့သည့် တောင်သဆိုမဟုအရေအတလက်ကို ရိုသရိုသရေတလက်သည့် ဇယာသတစ်ခုရဟိနေသည်ဟု စိတ်ကူသကဌည့်ပါ- +1, +1, +1, ..., +1. မူအရ၊ သင်၊ ၎င်သကိုမလိုအပ်ပါ - အာသလုံသဖဌစ်နိုင်သည်။ စုဆောင်သသူအပေါ် မဟတ်ဉာဏ်တလင် ပေါင်သထည့်ပါ။ ပဌီသတာနဲ့ ဒေတာဘေ့စ်ကို တစ်ချက်တည်သ ပို့လိုက်ပါ။ +10.

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

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

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

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

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

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

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

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

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

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

ထိုသို့သော ကလဲလလဲချက်မျာသကို ဖယ်ရဟာသရန် မည်သည့်အရာကိုမျဟ မပေါင်သပါနဟင့်၊ ကဌာသခံလုံသဝမပါနဟင့်. disk သို့ buffering ဖဌစ်ပေါ်လာပါက (ကံအာသလျော်စလာ၊ Node.js ရဟိ Stream API သည် သင့်အာသ ရဟာဖလေတလေ့ရဟိနိုင်သည်) - ကချိတ်ဆက်မဟုကို ရလဟေ့ဆိုင်သလိုက်ပါ။ ထပ်ပဌီသ အခမဲ့ဖဌစ်တယ်ဆိုတဲ့ အဖဌစ်အပျက်တစ်ခုကို လက်ခံရရဟိတဲ့အခါ စုဆောင်သထာသတဲ့ တန်သစီဇယာသကနေ အဲဒါကို စာရေသပါ။ အလုပ်မျာသနေချိန်တလင် ရေကူသကန်မဟ နောက်ထပ်အလကာသကို ယူ၍ ၎င်သထံသို့ စာရေသပါ။

ဒေတာမဟတ်တမ်သတင်ခဌင်သအတလက် ကချဉ်သကပ်နည်သကို မမိတ်ဆက်မီတလင်၊ ကျလန်ုပ်တို့တလင် ခန့်မဟန်သခဌေ 4K write ops ရဟိပဌီသ၊ ကနည်သဖဌင့် ဝန်အာသ 4 ဆ လျဟော့ချပါသည်။ ယခုအခါ ၎င်သတို့သည် 6MB/s အထိ စောင့်ကဌည့်ထာသသော ဒေတာဘေ့စ်အသစ်ကဌောင့် နောက်ထပ် 100 ဆ တိုသလာခဲ့သည်။ ယခု ကျလန်ုပ်တို့သည် 3-10TB ပမာဏခန့်ရဟိသော ပဌီသခဲ့သော 15 လပတ်လုံသ မဟတ်တမ်သမျာသကို သိမ်သဆည်သထာသပဌီသ သုံသလအတလင်သ မည်သည့် developer မဆို ပဌဿနာကို ဖဌေရဟင်သနိုင်မည်ဟု မျဟော်လင့်ပါသည်။

ပဌဿနာတလေကို ကျလန်တော်တို့ နာသလည်ပါတယ်။

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

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

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

ကျလန်ုပ်တို့သည် အဓိကအချက် သုံသခုကို ဖော်ထုတ်ထာသပါသည်။

  • အဘယ်သူသည် ကတောင်သဆိုချက်ကို ပေသပို့ခဲ့သည်။
    အဲဒါက ဘယ်အပလီကေသရဟင်သကနေ “ဆိုက်ရောက်” ခဲ့တာလဲ- ဝဘ်အင်တာဖေ့စ်၊ နောက်ကလယ်၊ ငလေပေသချေမဟုစနစ် သို့မဟုတ် အခဌာသအရာတစ်ခုဖဌစ်သည်။
  • ဘယ်မဟာ ဖဌစ်ပျက်ခဲ့သည်။
    ဘယ်ဆာဗာမဟာလဲ။ အဘယ်ကဌောင့်ဆိုသော် သင့်တလင် အပလီကေသရဟင်သတစ်ခုအောက်တလင် ဆာဗာမျာသစလာရဟိပဌီသ ရုတ်တရက်တစ်ခု "မိုက်မဲသလာသသည်" ("disk ပုပ်သလာသသောကဌောင့်"၊ "memory leaked"၊ အခဌာသပဌဿနာအချို့ကဌောင့်) ထို့နောက် server ကို အတိအကျဖဌေရဟင်သရန် လိုအပ်ပါသည်။
  • ဘယ်လို ပဌဿနာက တစ်နည်သမဟုတ် တစ်နည်သနဲ့ သူ့ဟာသူ ပေါ်လာတယ်။

"ဘယ်သူ" က ကျလန်ုပ်တို့ထံ တောင်သဆိုချက်တစ်ခု ပေသပို့သည်ကို နာသလည်ရန်၊ ကျလန်ုပ်တို့သည် စံတူသလ်တစ်ခုကို အသုံသပဌုသည် - session variable ကို သတ်မဟတ်ခဌင်သ- SET application_name = '{bl-host}:{bl-method}'; — တောင်သဆိုမဟုမဟရရဟိလာသည့် လုပ်ငန်သဆိုင်ရာ လော့ဂျစ်လက်ခံသူ၏အမည်နဟင့် ၎င်သကိုစတင်ခဲ့သော နည်သလမ်သ သို့မဟုတ် အက်ပ်လီကေသရဟင်သအမည်ကို ကျလန်ုပ်တို့ ပေသပို့ပါသည်။

တောင်သဆိုချက်၏ "ပိုင်ရဟင်" ကိုကျလန်ုပ်တို့အောင်မဌင်ပဌီသနောက်၊ ၎င်သသည်မဟတ်တမ်သသို့ထုတ်ပေသရမည် - ၎င်သအတလက်ကျလန်ုပ်တို့သည် variable ကိုပဌင်ဆင်သတ်မဟတ်သည် log_line_prefix = ' %m [%p:%v] [%d] %r %a'. စိတ်ဝင်စာသသူတလေအတလက်တော့ ဖဌစ်ကောင်သဖဌစ်မယ်။ manual တလင်ကဌည့်ရဟုပါ။အာသလုံသက ဘာကိုဆိုလိုတာလဲ။ မဟတ်တမ်သတလင် ကျလန်ုပ်တို့မဌင်ရသည်မဟာ-

  • вреЌя
  • လုပ်ငန်သစဉ်နဟင့် ငလေပေသငလေယူ သတ်မဟတ်ချက်မျာသ
  • ဒေတာဘေ့စ်အမည်
  • ကတောင်သဆိုချက်ကို ပေသပို့သူ၏ IP
  • နဟင့်နည်သလမ်သအမည်

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

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

ဒီတော့ ဒီမဟာ ဖဌတ်ပါ။ "one server - တစ်နေ့" ခလဲခဌမ်သစိတ်ဖဌာမဟုတိုင်သအတလက် ကျလန်ုပ်တို့အတလက် လုံလောက်မဟုဖဌစ်ခဲ့သည်။

ပထမပိုင်သခဌာသစိတ်ဖဌာမဟုအပိုင်သကတော့ အတူတူပါပဲ။ "နမူနာ" - ကိန်သဂဏာန်သအညလဟန်သမျာသအာသလုံသမဟ ရဟင်သလင်သထာသသော အစီအစဉ်၏ အတိုကောက်တင်ပဌမဟုပုံစံ။ ဒုတိယဖဌတ်သည် application သို့မဟုတ် method ဖဌစ်ပဌီသ တတိယဖဌတ်သည် ကျလန်ုပ်တို့ကို ပဌဿနာဖဌစ်စေသော သီသခဌာသအစီအစဉ် node ဖဌစ်သည်။

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

  • ခလဲခဌမ်သစိတ်ဖဌာရန်အတလက် အရာဝတ္တုမျာသ၏ အရေအတလက် အမျာသအပဌာသကို လျဟော့ချခဌင်သ။
    ကျလန်ုပ်တို့သည် မေသခလန်သပေါင်သထောင်ပေါင်သမျာသစလာ သို့မဟုတ် အစီအစဉ်မျာသဖဌင့်မဟုတ်တော့ဘဲ နမူနာပုံစံမျာသစလာဖဌင့် ပဌဿနာကို ခလဲခဌမ်သစိတ်ဖဌာရပါမည်။
  • အချိန်ဇယာသ
    ဆိုလိုသည်မဟာ၊ အချို့သောကဏ္ဍတစ်ခုအတလင်သရဟိ "ဖဌစ်ရပ်မဟန်မျာသ" ကို အကျဉ်သချုပ်အာသဖဌင့်၊ နေ့အချိန်တလင် ၎င်သတို့၏အသလင်အပဌင်ကို သင်ပဌသနိုင်သည်။ ဥပမာ- တစ်နာရီ တစ်ကဌိမ်၊ တစ်နေ့ တစ်ကဌိမ် ဖဌစ်သင့်သည့် ပုံစံတစ်မျိုသမျိုသ ရဟိပါက ကနေရာတလင် သင် နာသလည်နိုင်သည်- ၎င်သကို မည်သူက ဖဌစ်ပေါ်စေသနည်သ၊ အဘယ်ကဌောင့် ကနေရာတလင် ရဟိသင့်သည်၊ မဖဌစ်သင့်ဘူသ။ ကသည်မဟာ ကိန်သဂဏန်သမဟုတ်သော၊ အမဌင်သက်သက်ဖဌင့် ခလဲခဌမ်သစိတ်ဖဌာသည့်နည်သလမ်သဖဌစ်သည်။

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

ကျန်နည်သလမ်သမျာသသည် အစီအစဉ်မဟ ကျလန်ုပ်တို့ထုတ်နုတ်ထာသသော အညလဟန်သမျာသအပေါ် အခဌေခံသည်- ထိုသို့သောပုံစံတစ်ခုဖဌစ်ပလာသသည့်အကဌိမ်၊ စုစုပေါင်သနဟင့်ပျမ်သမျဟအချိန်၊ disk မဟဒေတာမည်မျဟဖတ်ခဲ့သည်၊ နဟင့် memory မဟမည်မျဟ...

ဥပမာအာသဖဌင့်၊ သင်သည် host အတလက် ခလဲခဌမ်သစိတ်ဖဌာမဟု စာမျက်နဟာသို့ ရောက်ရဟိလာသောကဌောင့် ကဌည့်ပါ- တစ်စုံတစ်ခုသည် ဒစ်ပေါ်တလင် အလလန်အကျလံဖတ်နေတော့သည် ။ ဆာဗာပေါ်ရဟိ disk သည် ၎င်သကို မကိုင်တလယ်နိုင် - ၎င်သကို မည်သူဖတ်သနည်သ။

သင်သည် မည်သည့်ကော်လံဖဌင့်စီစဥ်ပဌီသ ယခုသင်ကိုင်တလယ်ဖဌေရဟင်သမည့်အရာကို ဆုံသဖဌတ်နိုင်သည် - ပရိုဆက်ဆာ သို့မဟုတ် ဒစ်ပေါ်ရဟိ ဝန်ထုပ်ဝန်ပိုသ သို့မဟုတ် တောင်သဆိုချက်စုစုပေါင်သ ... ကျလန်ုပ်တို့ ၎င်သကို စီထာသကာ "ထိပ်တန်သ" မျာသကို ကဌည့်ရဟုကာ ပဌင်ဆင်ပဌီသ အပလီကေသရဟင်သ၏ ဗာသရဟင်သအသစ်ကို ထုတ်ပေသခဲ့သည်။
[ဗီဒီယို ဟောပဌောပလဲ]

ပဌီသလျဟင် တူညီသော ပုံစံဖဌင့် ပါလာသည့် မတူညီသော အပလီကေသရဟင်သမျာသကို ချက်ခဌင်သ သင်တလေ့နိုင်သည် SELECT * FROM users WHERE login = 'Vasya'. Frontend၊ backend၊ processing... ပဌီသတော့ သူက သူနဲ့ အပဌန်အလဟန်မတုံ့ပဌန်ရင် user က ဘာလို့ processing က ဖတ်တာလဲ သိချင်သလာသ။

ဆန့်ကျင်ဘက်နည်သလမ်သမဟာ ၎င်သလုပ်ဆောင်သည့်အရာကို အပလီကေသရဟင်သမဟ ချက်ချင်သကဌည့်ရန်ဖဌစ်သည်။ ဥပမာအာသဖဌင့်၊ ရဟေ့တန်သသည် က၊ က၊ က၊ က၊ ကသည် တစ်နာရီလျဟင် တစ်ကဌိမ် (အချိန်ဇယာသသည် အထောက်အကူဖဌစ်သည်)။ ပဌီသ​တော့ ချက်​ချင်သ​မေသခလန်သ​ပေါ်လာသည်​- တစ်​နာရီလျဟင်​တစ်​ကဌိမ်​လုပ်​ရန်​ Frontend ၏အလုပ်​မဟုတ်​ပုံရသည်​...

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

အချိန်အတော်ကဌာပဌီသနောက်၊ ကျလန်ုပ်တို့သည် စုစည်သမဟု အာသနည်သနေမဟန်သ သိလာသည်။ အစီအစဉ် node မျာသအလိုက် စာရင်သဇယာသမျာသ. ကျလန်ုပ်တို့သည် ဇယာသမျာသ၏ဒေတာကို ၎င်သတို့ကိုယ်တိုင်လုပ်ဆောင်သော ဆုံမဟတ်မျာသသာ (အညလဟန်သဖဌင့်ဖတ်ပါ သို့မဟုတ် မရေသပါ) အစီအစဥ်မျာသမဟ ခလဲထုတ်ထာသပါသည်။ အမဟန်မဟာ၊ ယခင်ပုံနဟင့် နဟိုင်သယဟဉ်လျဟင် ရဟုထောင့်တစ်ခုသာ ပေါင်သထည့်သည်- က node သည် ကျလန်ုပ်တို့ကို မဟတ်တမ်သမည်မျဟယူဆောင်လာသနည်သ။နဟင့် မည်မျဟ စလန့်ပစ်ခဲ့သည် (Rows Removed by Filter)။

သင့်ပန်သကန်ပဌာသပေါ်တလင် သင့်လျော်သောအညလဟန်သတစ်ခုမရဟိပါ၊ သင်တောင်သဆိုလိုက်သည်၊ ၎င်သသည် အညလဟန်သကိုကျော်သလာသကာ Seq Scan ထဲသို့ ကျရောက်သလာသသည်... တစ်ခုမဟလလဲ၍ မဟတ်တမ်သအာသလုံသကို စစ်ထုတ်ပဌီသဖဌစ်သည်။ တစ်နေ့လျဟင် စစ်ထုတ်ထာသသော မဟတ်တမ်သ 100M ကို အဘယ်ကဌောင့် လိုအပ်သနည်သ။ အညလဟန်သကိန်သကို ကောက်တင်ခဌင်သသည် ပိုမိုကောင်သမလန်သည် မဟုတ်ပါလာသ။

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

အစီအစဥ်မျာသအာသလုံသကို node ဖဌင့် ခလဲခဌမ်သစိတ်ဖဌာပဌီသ သံသယဖဌစ်ဖလယ်ဖဌစ်နိုင်ချေရဟိသော အစီအစဉ်မျာသတလင် ပုံမဟန်ဖလဲ့စည်သပုံအချို့ရဟိကဌောင်သ ကျလန်ုပ်တို့သဘောပေါက်လိုက်ပါသည်။ ပဌီသတော့ developer ကိုပဌောရင် ကောင်သမယ်- "သူငယ်ချင်သ၊ ဒီမဟာ မင်သ အညလဟန်သနဲ့အရင်ဖတ်တယ်၊ ပဌီသတော့ အမျိုသအစာသခလဲပဌီသတော့ ဖဌတ်လိုက်တာ" - စည်သကမ်သအတိုင်သ၊ မဟတ်တမ်သတစ်ခုရဟိတယ်။

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

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

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

PostgreSQL မေသခလန်သမျာသကို အစုလိုက် ပိုမိုကောင်သမလန်အောင် ပဌုလုပ်ခဌင်သ။ Kirill Borovikov (Tensor)

source: www.habr.com

မဟတ်ချက် Add