PostgreSQL Antipatterns- Registry ကို လမ်သညလဟန်ခဌင်သ။

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

ဆိုလိုသည်မဟာ ဒေတာဘေ့စ်တလင် ဆိုင်သဘုတ်တစ်ခုရဟိသည်။ eventsပဌီသတော့ သူမမဟာ လယ်ကလင်သတစ်ခုရဟိတယ်။ ts - ကမဟတ်တမ်သမျာသကို စနစ်တကျပဌသလိုသည့်အချိန်အတိအကျ။

CREATE TABLE events(
  id
    serial
      PRIMARY KEY
, ts
    timestamp
, data
    json
);

CREATE INDEX ON events(ts DESC);

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

#0။ "ငါက ငါ့အမေရဲ့ အဆိုသမဌင်သမာသပဲ"

cur.execute("SELECT * FROM events;")
rows = cur.fetchall();
rows.sort(key=lambda row: row.ts, reverse=True);
limit = 26
print(rows[offset:offset+limit]);

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

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

#၁။ အော့ဖ်ဆက်

SELECT
  ...
FROM
  events
ORDER BY
  ts DESC
LIMIT 26 OFFSET $1; -- 26 - запОсей Ма страМОце, $1 - МачалП страМОцы

နံပါတ် ၂၆ က ဘယ်ကလာတာလဲ။ ကသည်မဟာ ဖန်သာသပဌင်တစ်ခုအာသ ဖဌည့်ရန် အနီသစပ်ဆုံသ အရေအတလက်ဖဌစ်သည်။ ပို၍တိကျသည်မဟာ၊ ပဌသထာသသော မဟတ်တမ်သ 26 ခု နဟင့် 25 သည် နမူနာတလင် အနည်သဆုံသ နောက်ထပ် တစ်ခုခု ရဟိနေကဌောင်သ အချက်ပဌပဌီသ ရဟေ့ဆက်ရန် အဓိပ္ပာယ် ရဟိပါသည်။

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

အက်ပလီကေသရဟင်သမျက်နဟာပဌင်တလင်ရဟိနေစဉ်၊ registry ကိုကဌည့်ရဟုခဌင်သကိုမဌင်သာသော“ စာမျက်နဟာမျာသ” မျာသအကဌာသပဌောင်သခဌင်သအဖဌစ်လုပ်ဆောင်သည်၊ မည်သူမျဟသံသယဖဌစ်စရာကိုအကဌာကဌီသသတိမထာသမိပါ။ အဆင်ပဌေစေရန်အတလက် ရုန်သကန်မဟုတလင် UI/UX သည် အင်တာဖေ့စ်ကို "အဆုံသမဲ့ scroll" အဖဌစ် ပဌန်လည်ဖန်တီသရန် ဆုံသဖဌတ်သည် - ဆိုလိုသည်မဟာ၊ အသုံသပဌုသူသည် အပေါ်နဟင့်အောက် ရလဟေ့နိုင်သော စာရင်သတစ်ခုတည်သတလင် မဟတ်ပုံတင်ခဌင်သအာသလုံသကို ရေသဆလဲထာသသည်။

ထို့ကဌောင့် နောက်တစ်ကဌိမ် စမ်သသပ်မဟုအတလင်သ သင်သည် ဖမ်သမိသလာသမည်ဖဌစ်သည်။ မဟတ်တမ်သမျာသပလာသခဌင်သ။ registry တလင်။ အဘယ့်ကဌောင့်ဆိုသော် ဇယာသတလင် ပုံမဟန်အညလဟန်သတစ်ခုရဟိသည်။ (ts)သင်၏မေသမဌန်သချက်သည် မည်သည့်အရာကို အာသကိုသနေသနည်သ။

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

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

အညလဟန်သကိုချဲ့ထလင်ခဌင်သ။

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

CREATE UNIQUE INDEX ON events(ts DESC, id DESC);

တောင်သဆိုချက်သည် ပဌောင်သလဲသလာသသည်-

SELECT
  ...
ORDER BY
  ts DESC, id DESC
LIMIT 26 OFFSET $1;

#၂။ "ကာဆာမျာသ" သို့ ပဌောင်သပါ

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

SELECT
  ...
WHERE
  (ts, id) < ($1, $2) -- пПслеЎМОе пПлучеММые Ма преЎыЎущеЌ шаге зМачеМОя
ORDER BY
  ts DESC, id DESC
LIMIT 26;

မင်သရောက်လာတဲ့အထိ သက်ပဌင်သတစ်ချက်ချလိုက်တယ်...

#၃။ သန့်ရဟင်သရေသအညလဟန်သမျာသ

ဘာကဌောင့်လဲဆိုတော့ တစ်နေ့မဟာ မင်သရဲ့ DBA က ဖတ်တယ်။ ထိရောက်မဟုမရဟိသော အညလဟန်သမျာသကို ရဟာဖလေခဌင်သအကဌောင်သ ဆောင်သပါသ အဲဒါကို သဘောပေါက်တယ်။ “နောက်ဆုံသပေါ်မဟုတ်ဘူသ” အချိန်တံဆိပ်က မကောင်သပါဘူသ။. ပဌီသတော့ ငါမင်သဆီ တစ်ဖန်လာခဲ့တယ်- အခု ဒီညလဟန်သကိန်သကို ပဌန်ပဌောင်သရတော့မယ် ဆိုတဲ့ အတလေသနဲ့ အခုပဲ မင်သဆီရောက်လာတယ်။ (ts DESC).

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

ယေဘူယျအာသဖဌင့်၊ “၂၆ အတိအကျ” မဟုတ်ဘဲ “၂၆ ထက်မနည်သ” မဖတ်ဖို့ ဘယ်သူက တာသမဌစ်တာလဲ။ ဥပမာ- ဒါမဟ နောက်ဘလောက်မဟာ ရဟိတာ။ ထင်ရဟာသစလာကလဲပဌာသသော အဓိပ္ပါယ်မျာသဖဌင့် မဟတ်တမ်သတင်ထာသသည်။ ts - ထို့နောက် blocks မျာသကဌာသတလင် "ခုန်ခဌင်သ" မဟတ်တမ်သမျာသနဟင့် ပဌဿနာရဟိမည်မဟုတ်ပါ။

ဒါကို အောင်မဌင်အောင် ဘယ်လိုလုပ်ရမလဲ၊

SELECT
  ...
WHERE
  ts < $1 AND
  ts >= coalesce((
    SELECT
      ts
    FROM
      events
    WHERE
      ts < $1
    ORDER BY
      ts DESC
    LIMIT 1 OFFSET 25
  ), '-infinity')
ORDER BY
  ts DESC;

ဒီမဟာဘာတလေဖဌစ်နေတာလဲ?

  1. ကျလန်ုပ်တို့သည် အဆင့် 25 ကို "ဆင်သ" မဟတ်တမ်သတင်ပဌီသ "နယ်နိမိတ်" တန်ဖိုသကိုရယူပါ။ ts.
  2. ထိုနေရာတလင် ဘာမဟမရဟိသေသပါက၊ ထို့နောက် NULL တန်ဖိုသကို အစာသထိုသပါ။ -infinity.
  3. ကျလန်ုပ်တို့ လက်ခံရရဟိသော တန်ဖိုသမျာသကဌာသရဟိ တန်ဖိုသမျာသ အပိုင်သတစ်ခုလုံသကို နုတ်ယူပါသည်။ ts နဟင့် $1 ပါရာမီတာသည် အင်တာဖေ့စ်မဟ ဖဌတ်သလာသသည် (ယခင် “နောက်ဆုံသ” ပဌန်ဆိုထာသသော တန်ဖိုသ)။
  4. မဟတ်တမ်သ 26 ထက်နည်သသော ဘလောက်တစ်ခုကို ပဌန်ရပါက၊ ၎င်သသည် နောက်ဆုံသတစ်ခုဖဌစ်သည်။

သို့မဟုတ် တူညီသောပုံ
PostgreSQL Antipatterns- Registry ကို လမ်သညလဟန်ခဌင်သ။

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

ပလောဆို

  1. ဟုတ်ကဲ့၊ ကအခဌေအနေတလင် ကျလန်ုပ်တို့သည် အညလဟန်သကို နဟစ်ကဌိမ်ဝင်ရောက်ကဌည့်ရဟုနိုင်သော်လည်သ အရာအာသလုံသသည် "အညလဟန်သအာသဖဌင့်သာ" ဖဌစ်သည်။ ထို့ကဌောင့်၊ subquery သည်သာ ရလဒ်ထလက်လာလိမ့်မည်။ နောက်ထပ် Index Only Scan တစ်ခုသို့.
  2. သင့်တလင် တန်ဖိုသမျာသရဟိမဟသာ ကနည်သပညာကို အသုံသပဌုနိုင်မည်မဟာ သိသာထင်ရဟာသပါသည်။ ts အခလင့်အလမ်သနဲ့သာ ဖဌတ်ကျော်နိုင်တယ်။ အမျာသအပဌာသမရဟိပါ။. သင်၏ပုံမဟန်ကိစ္စသည် "00:00:00.000" တလင် "သန်သပေါင်သမျာသစလာသောစံချိန်" ဖဌစ်ပါက၊ သင်သည် ဒါကိုမလုပ်သင့်ပါ။ ဆိုလိုတာက ဒီလိုကိစ္စမျိုသတလေ ဖဌစ်မလာသင့်ဘူသ။ သို့သော် ထိုသို့ဖဌစ်လာပါက၊ တိုသချဲ့အညလဟန်သတစ်ခုဖဌင့် ရလေသချယ်မဟုကို အသုံသပဌုပါ။

source: www.habr.com

မဟတ်ချက် Add