PostgreSQL Query Profiler- အစီအစဉ်နဟင့် စုံစမ်သမဟု မည်ကဲ့သို့ ကိုက်ညီမည်နည်သ။

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

PostgreSQL Query Profiler- အစီအစဉ်နဟင့် စုံစမ်သမဟု မည်ကဲ့သို့ ကိုက်ညီမည်နည်သ။
... သက်ဆိုင်ရာ အစီအစဉ် ဆုံမဟတ်မျာသအတလက် ဆက်စပ်မဟုရဟိသော အရိပ်အမဌလက်မျာသဖဌင့် လဟပစလာ ဒီဇိုင်သဆလဲထာသသော မေသခလန်သတစ်ခုသို့ ...

PostgreSQL Query Profiler- အစီအစဉ်နဟင့် စုံစမ်သမဟု မည်ကဲ့သို့ ကိုက်ညီမည်နည်သ။
ကစာစု၏ ဒုတိယပိုင်သကို သူ၏ မဟတ်တမ်သတလင် ဖော်ပဌထာသသည်။ PGConf.Russia 2020 တလင် အစီရင်ခံစာ ဒါကိုဘယ်လိုလုပ်ရမလဲဆိုတာ ပဌောပဌမယ်။

ပုံမဟန်မေသမဌန်သမဟု စလမ်သဆောင်ရည် ပဌဿနာမျာသနဟင့် ၎င်သတို့၏ ဖဌေရဟင်သချက်မျာသကို ဆောင်သပါသတလင် တလေ့ရဟိနိုင်သည်၊ ပထမပိုင်သ၏ စာသာသမဟတ်တမ်သကို "နာမကျန်သဖဌစ်နေသော SQL မေသခလန်သမျာသအတလက် ချက်ပဌုတ်နည်သမျာသ".



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

သစ်လုံသမဟဆလဲထုတ်သည့် တောင်သဆိုချက်သည် ပုံစံမပဌသော “စာရလက်” ဖဌင့် အလလန်ရုပ်ဆိုသပဌီသ အဆင်မပဌေဖဌစ်နေပုံရသည်။
PostgreSQL Query Profiler- အစီအစဉ်နဟင့် စုံစမ်သမဟု မည်ကဲ့သို့ ကိုက်ညီမည်နည်သ။

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

ဒါကို တစ်နည်သနည်သနဲ့ ပိုလဟအောင် ဆလဲကဌည့်ရအောင်။
PostgreSQL Query Profiler- အစီအစဉ်နဟင့် စုံစမ်သမဟု မည်ကဲ့သို့ ကိုက်ညီမည်နည်သ။

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

Query syntax tree

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

ဘာဖဌစ်လို့လဲဆိုတော့ ငါတို့မဟာရဟိတယ်။ စနစ်၏ core သည် NodeJS တလင်အလုပ်လုပ်သည်။ပဌီသတော့ အဲဒါအတလက် module တစ်ခုလုပ်တယ်၊ မင်သလုပ်နိုင်တယ်။ GitHub တလင်ရဟာပါ။. အမဟန်မဟာ၊ ၎င်သတို့သည် PostgreSQL parser ကိုယ်တိုင်၏ အတလင်သပိုင်သသို့ “စည်သနဟောင်မဟုမျာသ” ကို တိုသချဲ့ထာသသည်။ ဆိုလိုသည်မဟာ သဒ္ဒါသည် ရိုသရိုသ binary compiled ဖဌစ်ပဌီသ ၎င်သကို NodeJS မဟ binding လုပ်ထာသသည်။ အခဌာသသူမျာသ၏ module မျာသကိုအခဌေခံအဖဌစ်ကျလန်ုပ်တို့ယူခဲ့သည် - ကနေရာတလင်ကဌီသမာသသောလျဟို့ဝဟက်ချက်မရဟိပါ။

ကျလန်ုပ်တို့၏လုပ်ဆောင်ချက်အတလက် ထည့်သလင်သမဟုအဖဌစ် တောင်သဆိုချက်၏ကိုယ်ထည်ကို ကျလန်ုပ်တို့ကျလေသမလေသသည် - အထလက်တလင် ကျလန်ုပ်တို့သည် JSON အရာဝတ္ထုပုံစံဖဌင့် ခလဲခဌမ်သစိတ်ဖဌာထာသသော အထာသအသိုသစ်ပင်ကို ရရဟိပါသည်။
PostgreSQL Query Profiler- အစီအစဉ်နဟင့် စုံစမ်သမဟု မည်ကဲ့သို့ ကိုက်ညီမည်နည်သ။

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

မဌေပုံထုတ်ခဌင်သ စုံစမ်သမေသမဌန်သခဌင်သ နဟင့် အစီအစဥ် ဆုံမဟတ်မျာသ

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

ရိုသရဟင်သသော ဥပမာတစ်ခုကို ကဌည့်ကဌပါစို့ - ကျလန်ုပ်တို့တလင် CTE တစ်ခုကို ထုတ်ပေသပဌီသ ၎င်သမဟ နဟစ်ကဌိမ် ဖတ်ပဌသော query တစ်ခုရဟိသည်။ သူဒီလိုအစီအစဥ်တစ်ခုထုတ်ပေသတယ်။
PostgreSQL Query Profiler- အစီအစဉ်နဟင့် စုံစမ်သမဟု မည်ကဲ့သို့ ကိုက်ညီမည်နည်သ။

CTE

ဂရုတစိုက်ကဌည့်လျဟင် ဗာသရဟင်သ 12 အထိ (သို့မဟုတ် ၎င်သကို သော့ချက်စာလုံသဖဌင့် စတင်သည်။ MATERIALIZED) ဖလဲ့စည်သမဟု CTE သည် အစီအစဉ်ရေသဆလဲသူအတလက် လုံသဝအတာသအဆီသတစ်ခုဖဌစ်သည်။.
PostgreSQL Query Profiler- အစီအစဉ်နဟင့် စုံစမ်သမဟု မည်ကဲ့သို့ ကိုက်ညီမည်နည်သ။

ဆိုလိုတာက တောင်သဆိုချက်ထဲမဟာ တစ်နေရာရာမဟာ CTE မျိုသဆက်နဲ့ အစီအစဉ်ရဲ့ တစ်နေရာရာမဟာ ဆုံချက်တစ်ခုကို တလေ့ရင်၊ CTEဒါဆို ဒီ node တလေက တစ်ခုနဲ့တစ်ခု "တိုက်" မဟာ သေချာပါတယ်၊ ငါတို့က အဲဒါတလေကို ချက်ချင်သပေါင်သစပ်လို့ရတယ်။

ခရေပလင့်နဟင့် ပဌဿနာ: CTEs မျာသကို nested လုပ်နိုင်ပါသည်။
PostgreSQL Query Profiler- အစီအစဉ်နဟင့် စုံစမ်သမဟု မည်ကဲ့သို့ ကိုက်ညီမည်နည်သ။
အလလန်ညံ့ဖျင်သသော အသိုက်မျာသရဟိပဌီသ နာမည်တူမျာသပင် ရဟိပါသည်။ ဥပမာအာသဖဌင့်, သင်သည်အထဲမဟာနိုင်ပါတယ်။ CTE A အောင် CTE Xအထဲမဟာ နဲ့ အတူတူပါပဲ။ CTE B ထပ်လုပ်ပါ။ CTE X:

WITH A AS (
  WITH X AS (...)
  SELECT ...
)
, B AS (
  WITH X AS (...)
  SELECT ...
)
...

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

ပဌည်ထောင်စု

အကယ်၍ ကျလန်ုပ်တို့တလင် သော့ချက်စာလုံသတစ်ခုရဟိလျဟင် UNION [ALL] (နမူနာနဟစ်ခုပါဝင်သည့် အော်ပရေတာ)၊ ထို့နောက် အစီအစဉ်တလင် ၎င်သသည် node တစ်ခုနဟင့်တစ်ခု သက်ဆိုင်သည်။ Appendသို့မဟုတ် အချို့ Recursive Union.
PostgreSQL Query Profiler- အစီအစဉ်နဟင့် စုံစမ်သမဟု မည်ကဲ့သို့ ကိုက်ညီမည်နည်သ။

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

  (...) -- #1
UNION ALL
  (...) -- #2
UNION ALL
  (...) -- #3

Append
  -> ... #1
  -> ... #2
  -> ... #3

ခရေပလင့်နဟင့် ပဌဿနာ: recursive sampling မျိုသဆက်အတလင်သ (WITH RECURSIVE) တစ်ခုထက်ပိုနိုင်သည်။ UNION. ဒါပေမယ့် နောက်ဆုံသတစ်ခုပဌီသရင် နောက်ဆုံသတစ်တုံသကသာ အမဌဲတမ်သ ပဌန်လဟည့်ပတ်နေတယ်။ UNION. အထက်ဖော်ပဌပါအရာအာသလုံသသည် တစ်ခုတည်သဖဌစ်သော်လည်သ ကလဲပဌာသသည်။ UNION:

WITH RECURSIVE T AS(
  (...) -- #1
UNION ALL
  (...) -- #2, тут кПМчается геМерацОя стартПвПгП сПстПяМОя рекурсОО
UNION ALL
  (...) -- #3, тПлькП этПт блПк рекурсОвМый О ЌПжет сПЎержать ПбращеМОе к T
)
...

သင်သည်ထိုကဲ့သို့သောဥပမာမျာသကို "ထလက်" နိုင်ရန်လိုအပ်သည်။ ဒီဥပမာမဟာ ကျလန်တော်မဌင်ပါတယ်။ UNION- ကျလန်ုပ်တို့၏ တောင်သဆိုချက်တလင် အပိုင်သ ၃ ပိုင်သရဟိသည်။ အရဟက်ကဌီသ၊ UNION ကိုက်ညီ Append-node နဟင့် အခဌာသ - Recursive Union.
PostgreSQL Query Profiler- အစီအစဉ်နဟင့် စုံစမ်သမဟု မည်ကဲ့သို့ ကိုက်ညီမည်နည်သ။

ဒေတာဖတ်-ရေသ

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

စုံစမ်သမဟု ရဟုထောင့်မဟ ကဌည့်လျဟင် ၎င်သသည် ဇယာသ သို့မဟုတ် CTE ဖဌစ်သည်ကို ကျလန်ုပ်တို့ မသိသော်လည်သ ၎င်သတို့ကို တူညီသော node မဟ သတ်မဟတ်ပေသထာသသည်။ RangeVar. “ဖတ်ရဟုနိုင်မဟု” ၏ စည်သကမ်သချက်မျာသအရ၊ ၎င်သသည် မျဟမျဟတတ ကန့်သတ်ထာသသော node မျာသဖဌစ်သည်-

  • Seq Scan on [tbl]
  • Bitmap Heap Scan on [tbl]
  • Index [Only] Scan [Backward] using [idx] on [tbl]
  • CTE Scan on [cte]
  • Insert/Update/Delete on [tbl]

အစီအစဉ်၏ဖလဲ့စည်သပုံနဟင့်မေသမဌန်သချက်ကိုကျလန်ုပ်တို့သိသည်၊ လုပ်ကလက်မျာသ၏စာပေသစာယူကိုကျလန်ုပ်တို့သိသည်၊ အရာဝတ္ထုမျာသ၏အမည်မျာသကိုကျလန်ုပ်တို့သိသည် - ကျလန်ုပ်တို့သည်တစ် ဩှ နဟင့်တစ် ဩှ နဟိုင်သယဟဉ်မဟုပဌုလုပ်သည်။
PostgreSQL Query Profiler- အစီအစဉ်နဟင့် စုံစမ်သမဟု မည်ကဲ့သို့ ကိုက်ညီမည်နည်သ။

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

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

PostgreSQL က ၎င်သကို သူ့ဘာသာသူ ထည့်သည်။ အဲဒါကို နာသလည်ဖို့ပဲလိုတယ်။ အဲဒီလို နာမည်ပေသရုံပါပဲ။ ကျလန်ုပ်တို့အတလက်၊ အစီအစဉ်နဟင့် နဟိုင်သယဟဉ်ရန် ရည်ရလယ်ချက်အတလက်၊ ၎င်သသည် အဓိပ္ပါယ်မရဟိပါ၊ ၎င်သကို ကနေရာတလင် ရိုသရဟင်သစလာ ထည့်သလင်သထာသသည်။ သူ့ကို ဂရုမစိုက်ရအောင်။

ဒုတိယ တာဝန် "ကဌယ်ပလင့်": အကယ်၍ ကျလန်ုပ်တို့သည် အပိုင်သပိုင်သခလဲထာသသောဇယာသမဟ ဖတ်နေပါက၊ ကျလန်ုပ်တို့သည် node တစ်ခုရလိမ့်မည်။ Append သို့မဟုတ် Merge Append"ကလေသမျာသ" အမျာသအပဌာသပါ ၀ င်မည့်၊ တစ်ခုချင်သစီသည်တစ်နည်သနည်သဖဌင့်ဖဌစ်လိမ့်မည်။ Scan'om't table-section မဟ Seq Scan, Bitmap Heap Scan သို့မဟုတ် Index Scan. မည်သို့ပင်ဆိုစေကာမူ က "ကလေသမျာသ" သည် ရဟုပ်ထလေသသောမေသခလန်သမျာသမဟုတ်ပါ - ကသည်မဟာ ကဆုံမဟတ်မျာသကို မည်သို့ခလဲခဌာသနိုင်မည်နည်သ။ Append တလင် UNION.
PostgreSQL Query Profiler- အစီအစဉ်နဟင့် စုံစမ်သမဟု မည်ကဲ့သို့ ကိုက်ညီမည်နည်သ။

ကျလန်ုပ်တို့လည်သ ထိုထုံသမျာသကို နာသလည်ပဌီသ ၎င်သတို့ကို "တစ်ပုံတည်သ" စုစည်သပဌီသ ပဌောပါ- "သင် megatable မဟဖတ်သမျဟအရာအာသလုံသသည်ကတလင်နဟင့်သစ်ပင်အောက်တလင်ရဟိသည်။".

"ရိုသရဟင်သ" ဒေတာလက်ခံခဌင်သ nodes

PostgreSQL Query Profiler- အစီအစဉ်နဟင့် စုံစမ်သမဟု မည်ကဲ့သို့ ကိုက်ညီမည်နည်သ။

Values Scan အစီအစဉ်တလင် ကိုက်ညီပါသည်။ VALUES တောင်သဆိုမဟု၌။

Result မပါဘဲတောင်သဆိုမဟုတစ်ခုဖဌစ်သည်။ FROM ကဲ့သို့ SELECT 1. ဒါမဟမဟုတ် တမင်တကာ လလဲမဟာသတဲ့ အသုံသအနဟုန်သတလေ ရဟိနေတဲ့အခါ WHERE-block (ထိုအခါ attribute ပေါ်လာသည်။ One-Time Filter):

EXPLAIN ANALYZE
SELECT * FROM pg_class WHERE FALSE; -- ОлО 0 = 1

Result  (cost=0.00..0.00 rows=0 width=230) (actual time=0.000..0.000 rows=0 loops=1)
  One-Time Filter: false

Function Scan နာမည်တူ SRF မျာသအတလက် "မဌေပုံ"

သို့သော် အစုလိုက်အပဌုံလိုက် စုံစမ်သမဟုမျာသဖဌင့် အရာအာသလုံသသည် ပိုမိုရဟုပ်ထလေသသည် - ကံမကောင်သစလာဖဌင့်၊ ၎င်သတို့သည် အမဌဲတမ်သအဖဌစ်သို့ ပဌောင်သလဲသလာသခဌင်သမရဟိပေ။ InitPlan/SubPlan. တခါတရံ အဖဌစ်သို့ ပဌောင်သသလာသကဌသည်။ ... Join သို့မဟုတ် ... Anti Joinအထူသသဖဌင့် သင်ကဌိုက်တဲ့အရာတစ်ခုကို ရေသပါ။ WHERE NOT EXISTS .... ကနေရာတလင် ၎င်သတို့ကို ပေါင်သစည်သရန် အမဌဲတမ်သ မဖဌစ်နိုင်ပါ - အစီအစဉ်၏ စာသာသတလင် အစီအစဉ်၏ node မျာသနဟင့် သက်ဆိုင်သည့် အော်ပရေတာမျာသ မရဟိပါ။

တဖန် တာဝန် "ကဌယ်ပလင့်": အချို့ VALUES တောင်သဆိုမဟု၌။ ကကိစ္စတလင်နဟင့် အစီအစဉ်တလင် သင်သည် node အမျာသအပဌာသကို ရရဟိမည်ဖဌစ်သည်။ Values Scan.
PostgreSQL Query Profiler- အစီအစဉ်နဟင့် စုံစမ်သမဟု မည်ကဲ့သို့ ကိုက်ညီမည်နည်သ။

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

ဒေတာအပဌောင်သအလဲနဲ့

ကျလန်ုပ်တို့၏တောင်သဆိုမဟုတလင် အရာအာသလုံသကို ခလဲထုတ်လိုက်ပုံပေါ်သည် - ကျန်တာအာသလုံသပါပဲ။ Limit.
PostgreSQL Query Profiler- အစီအစဉ်နဟင့် စုံစမ်သမဟု မည်ကဲ့သို့ ကိုက်ညီမည်နည်သ။

သို့သော် ကနေရာတလင် အရာအာသလုံသသည် ရိုသရဟင်သသည် - ထိုကဲ့သို့သော nodes မျာသဖဌစ်သည်။ Limit, Sort, Aggregate, WindowAgg, Unique တောင်သဆိုချက်တလင် သက်ဆိုင်ရာ အော်ပရေတာမျာသထံ “မဌေပုံ” ကို တစ်ပုံမဟတစ်ပုံ၊ ကနေရာတလင် "ကဌယ်မျာသ" သို့မဟုတ် အခက်အခဲမျာသ မရဟိပါ။
PostgreSQL Query Profiler- အစီအစဉ်နဟင့် စုံစမ်သမဟု မည်ကဲ့သို့ ကိုက်ညီမည်နည်သ။

JOIN

ပေါင်သစည်သလိုသောအခါတလင် အခက်အခဲမျာသ ဖဌစ်ပေါ်လာသည်။ JOIN သူတို့အချင်သချင်သကဌာသ။ ဒါက အမဌဲတမ်သမဖဌစ်နိုင်ပေမယ့် ဖဌစ်နိုင်တယ်။
PostgreSQL Query Profiler- အစီအစဉ်နဟင့် စုံစမ်သမဟု မည်ကဲ့သို့ ကိုက်ညီမည်နည်သ။

query parser ၏အမဌင်မဟ၊ ကျလန်ုပ်တို့တလင် node တစ်ခုရဟိသည်။ JoinExprဘယ်ညာ၊ ကလေသ နဟစ်ယောက်တိတိရဟိသည်။ ကသည်မဟာ သင့် JOIN ၏ "အထက်" နဟင့် တောင်သဆိုချက်တလင် ၎င်သကို "အောက်တလင်" ရေသထာသသည့်အရာဖဌစ်သည်။

အစီအစဥ်အမဌင်အရ၊ ၎င်သတို့သည် အချို့သော သာသစဉ်မဌေသဆက် နဟစ်ညသဖဌစ်သည်။ * Loop/* Join-node ။ Nested Loop, Hash Anti Joinဟီသ... - တစ်ခုခုပေါ့။

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

ငါတို့ရဲ့ syntax tree ကိုယူရအောင်၊ ငါတို့အစီအစဉ်ကိုယူ၊ အဲဒါတလေကိုကဌည့်ရအောင်... အလာသတူမဟုတ်ဘူသ!
PostgreSQL Query Profiler- အစီအစဉ်နဟင့် စုံစမ်သမဟု မည်ကဲ့သို့ ကိုက်ညီမည်နည်သ။

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

ကျလန်ုပ်တို့တလင် B နဟင့် C ကလေသမျာသ တစ်ပဌိုင်နက်တည်သရဟိသော node မျာသရဟိသည်ကို သတိပဌုကဌပါစို့ - ကျလန်ုပ်တို့သည် မည်သည့်နည်သနဟင့်မျဟ ဂရုမစိုက်ပါ။ ၎င်သတို့ကို ပေါင်သစပ်ပဌီသ node ၏ပုံကို လဟန်ကဌည့်ကဌပါစို့။
PostgreSQL Query Profiler- အစီအစဉ်နဟင့် စုံစမ်သမဟု မည်ကဲ့သို့ ကိုက်ညီမည်နည်သ။

ထပ်ကဌည့်ရအောင်။ ယခု ကျလန်ုပ်တို့တလင် ကလေသ A နဟင့် အတလဲမျာသ (B + C) ပါရဟိသည် - ၎င်သတို့နဟင့်လည်သ လိုက်ဖက်ပါသည်။
PostgreSQL Query Profiler- အစီအစဉ်နဟင့် စုံစမ်သမဟု မည်ကဲ့သို့ ကိုက်ညီမည်နည်သ။

မိုက်တယ်! ငါတို့က ဒီနဟစ်ယောက်ပဲ ပေါ်လာတာ။ JOIN အစီအစဉ် node မျာသနဟင့် တောင်သဆိုမဟုမဟ အောင်မဌင်စလာ ပေါင်သစပ်ခဲ့သည်။

ကံမကောင်သစလာပဲ၊ ဒီပဌဿနာကိုအမဌဲမဖဌေရဟင်သနိုင်ပါ။
PostgreSQL Query Profiler- အစီအစဉ်နဟင့် စုံစမ်သမဟု မည်ကဲ့သို့ ကိုက်ညီမည်နည်သ။

ဥပမာအာသဖဌင့် တောင်သဆိုမဟုတစ်ခု၌ A JOIN B JOIN Cအစီအစဉ်တလင် ညသစလာပထမအနေဖဌင့် “အပဌင်ဘက်” ဆုံမဟတ် A နဟင့် C တို့ကို ချိတ်ဆက်ထာသသည်။ သို့သော် တောင်သဆိုချက်တလင် ထိုသို့သောအော်ပရေတာမရဟိပါ၊ ကျလန်ုပ်တို့တလင် မီသမောင်သထိုသပဌစရာဘာမျဟမရဟိ၊ အရိပ်အမဌလက်တင်ပဌစရာမရဟိပါ။ စာရေသတဲ့အခါ "ကော်မာ" နဲ့ အတူတူပါပဲ။ A, B.

သို့သော်၊ ကိစ္စအမျာသစုတလင်၊ node မျာသအာသလုံသနီသပါသကို "ချိတ်" နိုင်ပဌီသ JavaScript ကုဒ်ကိုခလဲခဌမ်သစိတ်ဖဌာသောအခါတလင် Google Chrome ကဲ့သို့စာသာသအရ၊ ကပရိုဖိုင်ကိုဘယ်ဘက်တလင်အချိန်မီရနိုင်သည်။ စာကဌောင်သတစ်ခုစီနဟင့် ထုတ်ပဌန်ချက်တစ်ခုစီသည် "execute" လုပ်ရန် အချိန်မည်မျဟကဌာသည်ကို သင်မဌင်နိုင်သည်။
PostgreSQL Query Profiler- အစီအစဉ်နဟင့် စုံစမ်သမဟု မည်ကဲ့သို့ ကိုက်ညီမည်နည်သ။

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

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

PostgreSQL Query Profiler- အစီအစဉ်နဟင့် စုံစမ်သမဟု မည်ကဲ့သို့ ကိုက်ညီမည်နည်သ။

source: www.habr.com

မဟတ်ချက် Add