မိုက်ခရိုဝန်ဆောင်မဟုဗိသုကာတလင် လုပ်ငန်သဆောင်ရလက်မဟုခလဲခဌမ်သစိတ်ဖဌာချက်- အကူအညီနဟင့် Postgres FDW ကို အချက်ပဌပါ။

Microservice Architecture သည် ကကမ္ဘာရဟိ အရာအာသလုံသကဲ့သို့ပင် ၎င်သ၏ အာသသာချက် အာသနည်သချက်မျာသရဟိသည်။ အချို့သော လုပ်ငန်သစဉ်မျာသသည် ၎င်သနဟင့်အတူ ပိုမိုလလယ်ကူလာပဌီသ အချို့သော လုပ်ငန်သစဉ်မျာသသည် ပိုမိုခက်ခဲသည်။ အပဌောင်သအလဲ၏ အရဟိန်အဟုန်နဟင့် ပိုမိုကောင်သမလန်သော ချဲ့ထလင်နိုင်စေရန်အတလက်၊ သင်သည် အနစ်နာခံမဟုမျာသ ပဌုလုပ်ရန် လိုအပ်ပါသည်။ ၎င်သတို့ထဲမဟတစ်ခုမဟာ ခလဲခဌမ်သစိတ်ဖဌာမဟု၏ ရဟုပ်ထလေသမဟု တိုသလာခဌင်သဖဌစ်သည်။ အကယ်၍ monolith တလင် လုပ်ငန်သဆောင်ရလက်မဟုဆိုင်ရာ ခလဲခဌမ်သစိတ်ဖဌာမဟုအာသလုံသကို ခလဲခဌမ်သစိတ်ဖဌာပုံတူတစ်ခုသို့ SQL queries မျာသအဖဌစ်သို့ လျဟော့ချနိုင်ပါက၊ ထို့နောက် multiservice ဗိသုကာတစ်ခုတလင် ဝန်ဆောင်မဟုတစ်ခုစီတလင် ၎င်သ၏ကိုယ်ပိုင်ဒေတာဘေ့စ်ရဟိပဌီသ query တစ်ခုလုပ်ဆောင်၍မရနိုင်ကဌောင်သ ထင်ရသည် (သို့မဟုတ် ဖဌစ်နိုင်ပါသလာသ။) ကျလန်ုပ်တို့၏ကုမ္ပဏီတလင် လုပ်ငန်သလည်ပတ်မဟုဆိုင်ရာ ခလဲခဌမ်သစိတ်ဖဌာမဟုပဌဿနာကို ကျလန်ုပ်တို့ဖဌေရဟင်သပုံနဟင့် ကဖဌေရဟင်သနည်သဖဌင့် ကျလန်ုပ်တို့ မည်သို့နေထိုင်တတ်လာသည်ကို စိတ်ဝင်စာသသူမျာသအတလက် - ကဌိုဆိုပါသည်။

မိုက်ခရိုဝန်ဆောင်မဟုဗိသုကာတလင် လုပ်ငန်သဆောင်ရလက်မဟုခလဲခဌမ်သစိတ်ဖဌာချက်- အကူအညီနဟင့် Postgres FDW ကို အချက်ပဌပါ။
ကျလန်ုပ်၏အမည်မဟာ Pavel Sivash ဖဌစ်ပဌီသ၊ DomClick တလင် ကျလန်ုပ်သည် ခလဲခဌမ်သစိတ်ဖဌာမဟုဒေတာဂိုဒေါင်ကို ထိန်သသိမ်သရန် တာဝန်ရဟိသောအဖလဲ့တလင် အလုပ်လုပ်ပါသည်။ သမရိုသကျအာသဖဌင့်၊ ကျလန်ုပ်တို့၏လုပ်ဆောင်မဟုမျာသကို ဒေတာအင်ဂျင်နီယာအဖဌစ် ခလဲခဌာသသတ်မဟတ်နိုင်သော်လည်သ၊ တကယ်တမ်သတလင်၊ လုပ်ငန်သဆောင်တာမျာသသည် ပိုမိုကျယ်ပဌန့်ပါသည်။ ဒေတာအင်ဂျင်နီယာ၊ သင်၏ကိုယ်ပိုင်ကိရိယာမျာသ၏ ဒေတာခလဲခဌမ်သစိတ်ဖဌာမဟုနဟင့် ဖလံ့ဖဌိုသတိုသတက်မဟုအတလက် ကိရိယာမျာသ၏ ပံ့ပိုသမဟုနဟင့် လိုက်လျောညီထလေဖဌစ်စေရန်အတလက် ETL/ELT စံနဟုန်သရဟိပါသည်။ အထူသသဖဌင့်၊ လုပ်ငန်သလည်ပတ်မဟုအစီရင်ခံခဌင်သအတလက်၊ ကျလန်ုပ်တို့တလင် monolith တစ်ခုရဟိသည်ကို "ဟန်ဆောင်" ရန် ဆုံသဖဌတ်ခဲ့ပဌီသ ဆန်သစစ်သူမျာသအာသ ၎င်သတို့လိုအပ်သောဒေတာအာသလုံသပါရဟိသော ဒေတာဘေ့စ်တစ်ခုပေသလိုက်ပါ။

ယေဘူယျအာသဖဌင့်၊ ကျလန်ုပ်တို့သည် မတူညီသောရလေသချယ်မဟုမျာသကို ထည့်သလင်သစဉ်သစာသသည်။ ပဌည့်စုံကောင်သမလန်သော repository တစ်ခုကို တည်ဆောက်ရန် ဖဌစ်နိုင်သည် - ကျလန်ုပ်တို့ပင် ကဌိုသစာသခဲ့ကဌသော်လည်သ ရိုသရိုသသာသသာသ ပဌောရလျဟင် သိုလဟောင်ရုံတစ်ခု တည်ဆောက်ခဌင်သ နဟေသကလေသသော လုပ်ငန်သစဉ်မျာသနဟင့် မကဌာခဏ ယုတ္တိဗေဒဆိုင်ရာ အပဌောင်သအလဲမျာသကို ပေါင်သစပ်၍ ၎င်သကို ပဌောင်သလဲမဟုမျာသ ပဌုလုပ်နိုင်ခဌင်သ မရဟိပါ (တစ်စုံတစ်ညသ အောင်မဌင်ပါက၊ ၊ လုပ်နည်သကို comment မဟာရေသပါ။ “ယောက်ျာသလေသတလေ၊ စပါသအုံသတလေကို လေ့လာပဌီသ ခလဲခဌမ်သစိတ်ဖဌာပုံတူတလေဆီ သလာသပါ” လို့ လေ့လာသူတလေကို ပဌောဖို့ဖဌစ်နိုင်ပေမယ့် ဒါဟာ စုဆောင်သမဟုအတလက် နောက်ထပ်လိုအပ်ချက်တစ်ခုဖဌစ်ပဌီသ ဖဌစ်နိုင်ရင် ဒါကို ရဟောင်ရဟာသသင့်တယ်လို့ ထင်ရပါတယ်။ ကျလန်ုပ်တို့သည် FDW (Foreign Data Wrapper) နည်သပညာကို အသုံသပဌုရန် ဆုံသဖဌတ်ခဲ့သည်- အခဌေခံအာသဖဌင့်၊ ၎င်သသည် SQL စံနဟုန်သတလင်ရဟိသော စံသတ်မဟတ်ချက်တစ်ခုဖဌစ်ပဌီသ ၎င်သ၏ကိုယ်ပိုင်အင်တာဖေ့စ်သည် ပိုမိုအဆင်ပဌေစေပါသည်။ အဲဒါကို အခဌေခံပဌီသ ဖဌေရဟင်သချက်တစ်ခု လုပ်ခဲ့ပဌီသ နောက်ဆုံသမဟာ ပဌေလည်သလာသခဲ့ပဌီသ အဲဒါကို ဖဌေရဟင်သခဲ့ပါတယ်။ ၎င်သ၏အသေသစိတ်အချက်မျာသသည် သီသခဌာသဆောင်သပါသတစ်ခု၏ ခေါင်သစဉ်ဖဌစ်သည်၊ မျာသစလာအကဌောင်သပဌောချင်သောကဌောင့်ဖဌစ်သည်- ဒေတာဘေ့စ်အစီအစဉ်မျာသကို တစ်ပဌိုင်တည်သလုပ်ဆောင်ခဌင်သမဟ ကိုယ်ရေသကိုယ်တာအချက်အလက်မျာသကို ထိန်သချုပ်ခဌင်သနဟင့် လူတစ်ညသချင်သစီမဟ ခလဲထုတ်ခဌင်သအထိ၊ ကဖဌေရဟင်သချက်သည် စစ်မဟန်သော ခလဲခဌမ်သစိတ်ဖဌာသောဒေတာဘေ့စ်မျာသနဟင့် သိုလဟောင်ရာနေရာမျာသအတလက် အစာသထိုသခဌင်သမဟုတ်ပါ၊ ၎င်သသည် သီသခဌာသပဌဿနာတစ်ခုသာ ဖဌေရဟင်သပေသကဌောင်သကိုလည်သ ကဌိုတင်စာရင်သသလင်သထာသရန် လိုအပ်ပါသည်။

ထိပ်တန်သအဆင့်တလင်၎င်သသည်ကကဲ့သို့သောပုံရသည်။

မိုက်ခရိုဝန်ဆောင်မဟုဗိသုကာတလင် လုပ်ငန်သဆောင်ရလက်မဟုခလဲခဌမ်သစိတ်ဖဌာချက်- အကူအညီနဟင့် Postgres FDW ကို အချက်ပဌပါ။
အသုံသပဌုသူမျာသသည် ၎င်သတို့၏ အလုပ်ဒေတာကို သိမ်သဆည်သနိုင်သည့် PostgreSQL ဒေတာဘေ့စ်တစ်ခု ရဟိပဌီသ အရေသအကဌီသဆုံသမဟာ ဝန်ဆောင်မဟုအာသလုံသ၏ ခလဲခဌမ်သစိတ်ဖဌာပုံတူမျာသကို FDW မဟတစ်ဆင့် ကဒေတာဘေ့စ်သို့ ချိတ်ဆက်ထာသသည်။ ၎င်သသည် မျာသစလာသောဒေတာဘေ့စ်မျာသသို့ စုံစမ်သမေသမဌန်သမဟုတစ်ခုကို ရေသသာသနိုင်စေသည်၊ ၎င်သသည် မည်သည့်အရာဖဌစ်သည်ကို အရေသမကဌီသပါ - PostgreSQL၊ MySQL၊ MongoDB သို့မဟုတ် အခဌာသအရာမျာသ (ဖိုင်၊ API၊ သင့်လျော်သော wrapper ရုတ်တရက်မရဟိပါက၊ သင်ကိုယ်တိုင်ရေသနိုင်သည်)။ ကောင်သပဌီ၊ အရာအာသလုံသကောင်သပုံရသည်။ ငါတို့ လမ်သခလဲနေတာလာသ။

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

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

ရိုသရဟင်သသောမေသခလန်သနဟင့် ၎င်သနဟင့်အတူ အစီအစဉ်တစ်ခု

Postgres သည် အဝေသထိန်သဆာဗာတစ်ခုပေါ်တလင် အတန်သဇယာသ 6 သန်သကို မည်ကဲ့သို့မေသမဌန်သသည်ကိုပဌသရန်၊ ရိုသရဟင်သသောအစီအစဉ်ကို ကဌည့်ကဌပါစို့။

explain analyze verbose  
SELECT count(1)
FROM fdw_schema.table;

Aggregate  (cost=418383.23..418383.24 rows=1 width=8) (actual time=3857.198..3857.198 rows=1 loops=1)
  Output: count(1)
  ->  Foreign Scan on fdw_schema."table"  (cost=100.00..402376.14 rows=6402838 width=0) (actual time=4.874..3256.511 rows=6406868 loops=1)
        Output: "table".id, "table".is_active, "table".meta, "table".created_dt
        Remote SQL: SELECT NULL FROM fdw_schema.table
Planning time: 0.986 ms
Execution time: 3857.436 ms

VERBOSE ကဌေညာချက်ကို အသုံသပဌုခဌင်သဖဌင့် အဝေသထိန်သဆာဗာသို့ ပေသပို့မည့် query နဟင့် ထပ်မံလုပ်ဆောင်ခဌင်သအတလက် ကျလန်ုပ်တို့ ရရဟိမည့်ရလဒ်မျာသ (RemoteSQL line) ကို ကဌည့်ရဟုနိုင်စေပါသည်။

နောက်ထပ်နည်သနည်သသလာသကဌည့်ရအောင်၊ ကျလန်ုပ်တို့၏တောင်သဆိုမဟုတလင် စစ်ထုတ်မဟုမျာသစလာထည့်ပါ- တစ်ခုအတလက် ရေနံချောင်သ အကလက်၊ တစ်ခုပဌီသတစ်ခု Timestamp ကဌာသကာလ နဟင့် တစ်ခုပဌီသတစ်ခု jsonb.

explain analyze verbose
SELECT count(1)
FROM fdw_schema.table 
WHERE is_active is True
AND created_dt BETWEEN CURRENT_DATE - INTERVAL '7 month' 
AND CURRENT_DATE - INTERVAL '6 month'
AND meta->>'source' = 'test';

Aggregate  (cost=577487.69..577487.70 rows=1 width=8) (actual time=27473.818..25473.819 rows=1 loops=1)
  Output: count(1)
  ->  Foreign Scan on fdw_schema."table"  (cost=100.00..577469.21 rows=7390 width=0) (actual time=31.369..25372.466 rows=1360025 loops=1)
        Output: "table".id, "table".is_active, "table".meta, "table".created_dt
        Filter: (("table".is_active IS TRUE) AND (("table".meta ->> 'source'::text) = 'test'::text) AND ("table".created_dt >= (('now'::cstring)::date - '7 mons'::interval)) AND ("table".created_dt <= ((('now'::cstring)::date)::timestamp with time zone - '6 mons'::interval)))
        Rows Removed by Filter: 5046843
        Remote SQL: SELECT created_dt, is_active, meta FROM fdw_schema.table
Planning time: 0.665 ms
Execution time: 27474.118 ms

ကသည်မဟာ မေသခလန်သမျာသရေသသာသသည့်အခါ အာရုံစိုက်ရမည့်အချက်ဖဌစ်သည်။ စစ်ထုတ်မဟုမျာသကို ဝေသလံခေါင်သီသောဆာဗာသို့ လလဟဲပဌောင်သမပေသခဲ့ပါ၊ ဆိုလိုသည်မဟာ ၎င်သကိုလုပ်ဆောင်ရန်အတလက် Postgres သည် စက်တလင်သရဟိ စစ်ထုတ်ခဌင်သ (Filter row) နဟင့် ပေါင်သစပ်လုပ်ဆောင်ရန်အတလက် အတန်သပေါင်သ 6 သန်သကို ဆလဲထုတ်ပါသည်။ အောင်မဌင်မဟု၏သော့ချက်မဟာ စစ်ထုတ်မဟုမျာသကို အဝေသထိန်သစက်သို့ လလဟဲပဌောင်သနိုင်ရန် query တစ်ခုရေသရန်ဖဌစ်ပဌီသ လိုအပ်သောအတန်သမျာသကိုသာ လက်ခံ၍ စုစည်သထာသခဌင်သဖဌစ်သည်။

အဲဒါ booleanshit တစ်ချို့ပါ။

boolean fields ဖဌင့် အရာအာသလုံသသည် ရိုသရဟင်သပါသည်။ မူလတောင်သဆိုချက်တလင် ပဌဿနာမဟာ အော်ပရေတာကဌောင့်ဖဌစ်သည်။ is. အဲဒါနဲ့ အစာသထိုသရင် =ထို့နောက် ကျလန်ုပ်တို့သည် အောက်ပါရလဒ်ကို ရရဟိပါသည်။

explain analyze verbose
SELECT count(1)
FROM fdw_schema.table
WHERE is_active = True
AND created_dt BETWEEN CURRENT_DATE - INTERVAL '7 month' 
AND CURRENT_DATE - INTERVAL '6 month'
AND meta->>'source' = 'test';

Aggregate  (cost=508010.14..508010.15 rows=1 width=8) (actual time=19064.314..19064.314 rows=1 loops=1)
  Output: count(1)
  ->  Foreign Scan on fdw_schema."table"  (cost=100.00..507988.44 rows=8679 width=0) (actual time=33.035..18951.278 rows=1360025 loops=1)
        Output: "table".id, "table".is_active, "table".meta, "table".created_dt
        Filter: ((("table".meta ->> 'source'::text) = 'test'::text) AND ("table".created_dt >= (('now'::cstring)::date - '7 mons'::interval)) AND ("table".created_dt <= ((('now'::cstring)::date)::timestamp with time zone - '6 mons'::interval)))
        Rows Removed by Filter: 3567989
        Remote SQL: SELECT created_dt, meta FROM fdw_schema.table WHERE (is_active)
Planning time: 0.834 ms
Execution time: 19064.534 ms

သင်တလေ့မဌင်ရသည့်အတိုင်သ၊ စစ်ထုတ်မဟုသည် အဝေသထိန်သဆာဗာသို့ ပျံသန်သသလာသပဌီသ လုပ်ဆောင်ချိန်ကို 27 စက္ကန့်မဟ 19 စက္ကန့်သို့ လျဟော့ချခဲ့သည်။

သတိပဌုသင့်သည်မဟာ အော်ပရေတာဖဌစ်သည်။ is operator နဲ့ မတူပါဘူသ။ = Null value နဲ့ အလုပ်လုပ်နိုင်လို့ပါ။ ဆိုလိုတာက မမဟန်ပါ။ False နဟင့် Null တန်ဖိုသမျာသကို filter တလင်ထာသခဲ့ပါမည်။ != မဟန်ပါတယ်။ False values ​​တလေပဲကျန်လိမ့်မယ်။ ထို့ကဌောင့် အော်ပရေတာ အစာသထိုသသည့်အခါ၊ မဖဌစ် OR အော်ပရေတာနဟင့်အတူ အခဌေအနေနဟစ်ခုကို filter သို့ ကူသသလာသသင့်သည်၊ ဥပမာ၊ WHERE (col != True) OR (col သည် null).

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

အချိန်တံဆိပ်တုံသ? hz

ယေဘူယျအာသဖဌင့်၊ သင်သည် အဝေသထိန်သဆာဗာမျာသပါ၀င်သည့် တောင်သဆိုချက်တစ်ခုကို မဟန်ကန်စလာရေသနည်သဖဌင့် မကဌာခဏ စမ်သသပ်ရန် လိုအပ်ပဌီသ ၎င်သမဟ ဘာကဌောင့် ထိုသို့ဖဌစ်ရခဌင်သ၏ ရဟင်သလင်သချက်ကို ရဟာဖလေပါ။ ယင်သနဟင့်ပတ်သက်သည့် အချက်အလက်အနည်သငယ်သာ အင်တာနက်ပေါ်တလင် တလေ့ရဟိနိုင်သည်။ ထို့ကဌောင့်၊ စမ်သသပ်မဟုမျာသတလင် သတ်မဟတ်ထာသသော ရက်စလဲစစ်ထုတ်မဟုသည် အဝေသမဟဆာဗာသို့ ပေါက်ကလဲသံကဌီသဖဌင့် ပျံသလာသသည်ကို ကျလန်ုပ်တို့တလေ့ရဟိခဲ့သော်လည်သ၊ ကျလန်ုပ်တို့သည် ရက်စလဲကို ဒိုင်သနမစ်ဖဌင့် သတ်မဟတ်လိုသောအခါတလင်၊ ဥပမာ၊ ယခု() သို့မဟုတ် CURRENT_DATE၊ ထိုသို့မဖဌစ်ပါ။ ကျလန်ုပ်တို့၏နမူနာတလင်၊ ဖန်တီသထာသသော_at ကော်လံတလင် လလန်ခဲ့သော 1 လတိတိ ဒေတာပါ၀င်သည် (CURRENT_DATE - ကဌာသကာလ '7 လ' နဟင့် CURRENT_DATE - ကဌာသကာလ '6 လ')။ ဒီကိစ္စမဟာ ငါတို့ဘာလုပ်ခဲ့လဲ။

explain analyze verbose
SELECT count(1)
FROM fdw_schema.table 
WHERE is_active is True
AND created_dt >= (SELECT CURRENT_DATE::timestamptz - INTERVAL '7 month') 
AND created_dt <(SELECT CURRENT_DATE::timestamptz - INTERVAL '6 month')
AND meta->>'source' = 'test';

Aggregate  (cost=306875.17..306875.18 rows=1 width=8) (actual time=4789.114..4789.115 rows=1 loops=1)
  Output: count(1)
  InitPlan 1 (returns $0)
    ->  Result  (cost=0.00..0.02 rows=1 width=8) (actual time=0.007..0.008 rows=1 loops=1)
          Output: ((('now'::cstring)::date)::timestamp with time zone - '7 mons'::interval)
  InitPlan 2 (returns $1)
    ->  Result  (cost=0.00..0.02 rows=1 width=8) (actual time=0.002..0.002 rows=1 loops=1)
          Output: ((('now'::cstring)::date)::timestamp with time zone - '6 mons'::interval)
  ->  Foreign Scan on fdw_schema."table"  (cost=100.02..306874.86 rows=105 width=0) (actual time=23.475..4681.419 rows=1360025 loops=1)
        Output: "table".id, "table".is_active, "table".meta, "table".created_dt
        Filter: (("table".is_active IS TRUE) AND (("table".meta ->> 'source'::text) = 'test'::text))
        Rows Removed by Filter: 76934
        Remote SQL: SELECT is_active, meta FROM fdw_schema.table WHERE ((created_dt >= $1::timestamp with time zone)) AND ((created_dt < $2::timestamp with time zone))
Planning time: 0.703 ms
Execution time: 4789.379 ms

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

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

ရက်စလဲစစ်ထုတ်မဟုကို ၎င်သ၏မူရင်သတန်ဖိုသသို့ ပဌန်ကဌပါစို့။

Freddy vs. Jsonb

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

explain analyze verbose
SELECT count(1)
FROM fdw_schema.table 
WHERE is_active is True
AND created_dt BETWEEN CURRENT_DATE - INTERVAL '7 month' 
AND CURRENT_DATE - INTERVAL '6 month'
AND meta @> '{"source":"test"}'::jsonb;

Aggregate  (cost=245463.60..245463.61 rows=1 width=8) (actual time=6727.589..6727.590 rows=1 loops=1)
  Output: count(1)
  ->  Foreign Scan on fdw_schema."table"  (cost=1100.00..245459.90 rows=1478 width=0) (actual time=16.213..6634.794 rows=1360025 loops=1)
        Output: "table".id, "table".is_active, "table".meta, "table".created_dt
        Filter: (("table".is_active IS TRUE) AND ("table".created_dt >= (('now'::cstring)::date - '7 mons'::interval)) AND ("table".created_dt <= ((('now'::cstring)::date)::timestamp with time zone - '6 mons'::interval)))
        Rows Removed by Filter: 619961
        Remote SQL: SELECT created_dt, is_active FROM fdw_schema.table WHERE ((meta @> '{"source": "test"}'::jsonb))
Planning time: 0.747 ms
Execution time: 6727.815 ms

အော်ပရေတာမျာသကို စစ်ထုတ်မည့်အစာသ၊ သင်သည် အော်ပရေတာတစ်ခု၏ရဟေ့မဟောက်တလင် အသုံသပဌုရမည်ဖဌစ်သည်။ jsonb မတူဘူှ။ မူရင်သ 7 အစာသ 29 စက္ကန့်။ ယခုအချိန်အထိ ၎င်သသည် စစ်ထုတ်မဟုမျာသမဟတစ်ဆင့် ထုတ်လလဟင့်ခဌင်သအတလက် တစ်ခုတည်သသော အောင်မဌင်သောရလေသချယ်မဟုဖဌစ်သည်။ jsonb အဝေသထိန်သဆာဗာအတလက်၊ သို့သော် ကနေရာတလင် ကန့်သတ်ချက်တစ်ခုကို ထည့်သလင်သစဉ်သစာသရန် အရေသကဌီသသည်- ကျလန်ုပ်တို့သည် ဒေတာဘေ့စ်၏ ဗာသရဟင်သ 9.6 ကို အသုံသပဌုနေသော်လည်သ ဧပဌီလကုန်တလင် နောက်ဆုံသစမ်သသပ်မဟုမျာသကို အပဌီသသတ်ပဌီသ ဗာသရဟင်သ 12 သို့ ပဌောင်သရလဟေ့ရန် စီစဉ်ထာသပါသည်။ ကျလန်ုပ်တို့ အပ်ဒိတ်လုပ်ပဌီသသည်နဟင့်၊ မျဟော်လင့်ချက်မျာသစလာရဟိသည့် အပဌောင်သအလဲမျာသစလာ ရဟိနေသောကဌောင့်၊ ၎င်သကို သက်ရောက်မဟုရဟိစေမည့် အကဌောင်သမဟာ json_path၊ CTE အပဌုအမူအသစ်၊ တလန်သချခဌင်သ (ဗာသရဟင်သ 10 ကတည်သက ရဟိပဌီသသာသ)။ ငါတကယ်စမ်သကဌည့်ချင်တယ်ကလာ။

သူ့ကို ပဌီသအောင်လုပ်ပါ။

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

explain analyze verbose
SELECT count(1)
FROM fdw_schema.table 
WHERE is_active = True
AND created_dt >= (SELECT CURRENT_DATE::timestamptz - INTERVAL '7 month') 
AND created_dt <(SELECT CURRENT_DATE::timestamptz - INTERVAL '6 month')
AND meta @> '{"source":"test"}'::jsonb;

Aggregate  (cost=322041.51..322041.52 rows=1 width=8) (actual time=2278.867..2278.867 rows=1 loops=1)
  Output: count(1)
  InitPlan 1 (returns $0)
    ->  Result  (cost=0.00..0.02 rows=1 width=8) (actual time=0.010..0.010 rows=1 loops=1)
          Output: ((('now'::cstring)::date)::timestamp with time zone - '7 mons'::interval)
  InitPlan 2 (returns $1)
    ->  Result  (cost=0.00..0.02 rows=1 width=8) (actual time=0.003..0.003 rows=1 loops=1)
          Output: ((('now'::cstring)::date)::timestamp with time zone - '6 mons'::interval)
  ->  Foreign Scan on fdw_schema."table"  (cost=100.02..322041.41 rows=25 width=0) (actual time=8.597..2153.809 rows=1360025 loops=1)
        Output: "table".id, "table".is_active, "table".meta, "table".created_dt
        Remote SQL: SELECT NULL FROM fdw_schema.table WHERE (is_active) AND ((created_dt >= $1::timestamp with time zone)) AND ((created_dt < $2::timestamp with time zone)) AND ((meta @> '{"source": "test"}'::jsonb))
Planning time: 0.820 ms
Execution time: 2279.087 ms

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

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

ဂရုစိုက်တဲ့အတလက်ကျေသဇူသတင်ပါတယ်! မင်သရဲ့အတလေ့အကဌုံတလေအကဌောင်သ မေသခလန်သတလေ၊ မဟတ်ချက်တလေ၊ ဇာတ်လမ်သတလေကို မဟတ်ချက်တလေမဟာ ကဌာသချင်ပါတယ်။

source: www.habr.com

မဟတ်ချက် Add