PostgreSQL Antipatterns- အမည်ဖဌင့် ရဟာဖလေမဟု၏ ထပ်တလဲလဲ သန့်စင်မဟု ပုံပဌင် သို့မဟုတ် "အကောင်သဆုံသဖဌစ်အောင် အပဌန်ပဌန်အလဟန်လဟန်"

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

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

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

0- သုံသစလဲသူက ဘာလိုချင်တာလဲ။

PostgreSQL Antipatterns- အမည်ဖဌင့် ရဟာဖလေမဟု၏ ထပ်တလဲလဲ သန့်စင်မဟု ပုံပဌင် သို့မဟုတ် "အကောင်သဆုံသဖဌစ်အောင် အပဌန်ပဌန်အလဟန်လဟန်"[KDPV ဒီမဟာ]

အသုံသပဌုသူတစ်ညသသည် "အမဌန်" အမည်ဖဌင့်ရဟာဖလေခဌင်သအကဌောင်သပဌောသောအခါတလင်ဘာကိုဆိုလိုသနည်သ။ ၎င်သသည် ကဲ့သို့သော စာကဌောင်သခလဲမျာသအတလက် "ရိုသသာသ" ရဟာဖလေမဟုအဖဌစ် ဘယ်တော့မဟ ဖဌစ်လာမည်မဟုတ်ပေ။ ... LIKE '%рПза%' အဘယ်ကဌောင့်ဆိုသော်ထို့နောက်ရလဒ်မသာပါဝင်သည်။ 'РПзалОя' О 'МагазОМ РПза'ဒါပေမဲ့ 'ГрПза' ပင် 'ДПЌ ДеЎа МПрПза'.

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

1- လုပ်ငန်သတာဝန်ကို ကန့်သတ်ပါ။

ထို့ထက်ပို၍ပင် လူတစ်ညသသည် အတိအကျ ဝင်မည်မဟုတ်ပါ။ 'рПз Ќагаз'ထို့ကဌောင့် သင်သည် စကာသလုံသတစ်လုံသစီကို ရဟေ့ဆက်ဖဌင့် ရဟာဖလေရမည်ဖဌစ်သည်။ မဟုတ်ဘူသ၊ ယခင်စကာသလုံသတလေကို ရည်ရလယ်ချက်ရဟိရဟိ “အောက်ဖော်ပဌပါ” လုပ်ဖို့ထက် အသုံသပဌုသူတစ်ယောက်အတလက် အမဌန်အရိပ်အမဌလက်ကို တုံ့ပဌန်ဖို့က ပိုလလယ်ပါတယ် - ရဟာဖလေရေသအင်ဂျင်က ဒါကို ဘယ်လိုကိုင်တလယ်မလဲဆိုတာကို ကဌည့်ပါ။

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

Abstract Developer က ဘာလုပ်သလဲ။

1.0: ပဌင်ပရဟာဖလေရေသအင်ဂျင်

အိုသ၊ ရဟာဖလေရေသက ခက်တယ်၊ ငါ ဘာမဟ မလုပ်ချင်ဘူသ - devops တလေကို ပေသလိုက်ရအောင်။ ဒေတာဘေ့စ်သို့ ရဟာဖလေရေသအင်ဂျင်ကို ပဌင်ပသို့ ဖဌန့်ကျက်စေပါ- Sphinx၊ ElasticSearch၊...

ထပ်တူပဌုခဌင်သနဟင့် အပဌောင်သအလဲမျာသ၏ အရဟိန်အဟုန်အရ အလုပ်သမာသ-အလေသပေသသော်လည်သ အလုပ်ရလေသချယ်မဟုတစ်ခု။ သို့သော်၊ ကျလန်ုပ်တို့၏ကိစ္စမဟုတ်ပါ၊ ဖောက်သည်တစ်ညသစီအတလက် သူ၏အကောင့်ဒေတာဘောင်အတလင်သတလင်သာ ရဟာဖလေမဟုကို လုပ်ဆောင်သောကဌောင့်ဖဌစ်သည်။ ပဌီသတော့ ဒေတာက အတော်လေသ ကလဲပဌာသမဟု ရဟိပဌီသ မန်နေဂျာက အခု ကတ်ထဲကို ဝင်သလာသတယ်ဆိုရင် 'МагазОМ РПза'ထို့နောက် 5-10 စက္ကန့်ကဌာပဌီသနောက် သူသည် သူ့အီသမေသလ်ကို ညလဟန်ရန်မေ့သလာသကာ ၎င်သကိုရဟာဖလေပဌီသ ပဌင်ပေသချင်ကဌောင်သ သတိရနေပဌီဖဌစ်သည်။

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

1.1: "ရိုသသာသ" အပိုင်သခလဲ

ကျလန်ုပ်တို့သည် “substring” ဟူသော စကာသလုံသကို စလဲကိုင်ထာသသည်။ သို့သော် စာတန်သခလဲမျာသဖဌင့် အညလဟန်သရဟာဖလေခဌင်သအတလက် (ပုံမဟန်အသုံသအနဟုန်သမျာသဖဌင့်ပင်) အလလန်ကောင်သမလန်ပါသည်။ module pg_trgm! သို့မဟသာ မဟန်ကန်စလာ စီရန် လိုအပ်မည်ဖဌစ်ပါသည်။

မော်ဒယ်ကို ရိုသရဟင်သစေရန် အောက်ပါပန်သကန်ပဌာသကို ယူလိုက်ရအောင်။

CREATE TABLE firms(
  id
    serial
      PRIMARY KEY
, name
    text
);

အစစ်အမဟန်အဖလဲ့အစည်သမျာသ၏ မဟတ်တမ်သပေါင်သ 7.8 သန်သကို ထိုနေရာတလင် အပ်လုဒ်လုပ်ကာ ၎င်သတို့ကို အညလဟန်သပဌုပါသည်။

CREATE EXTENSION pg_trgm;
CREATE INDEX ON firms USING gin(lower(name) gin_trgm_ops);

interlinear ရဟာဖလေမဟုအတလက် ပထမဆုံသ မဟတ်တမ်သ ၁၀ ခုကို ရဟာကဌည့်ရအောင်။

SELECT
  *
FROM
  firms
WHERE
  lower(name) ~ ('(^|s)' || 'рПза')
ORDER BY
  lower(name) ~ ('^' || 'рПза') DESC -- сМачала "МачОМающОеся Ма"
, lower(name) -- ПстальМПе пП алфавОту
LIMIT 10;

PostgreSQL Antipatterns- အမည်ဖဌင့် ရဟာဖလေမဟု၏ ထပ်တလဲလဲ သန့်စင်မဟု ပုံပဌင် သို့မဟုတ် "အကောင်သဆုံသဖဌစ်အောင် အပဌန်ပဌန်အလဟန်လဟန်"
[explain.tensor.ru တလင်ကဌည့်ရဟုရန်]

အင်သ အဲဒါ... 26ms၊ 31MB ရဟာဖလေထာသသော 1.7 ခုအတလက် ဒေတာနဟင့် 10K ကျော် စစ်ထုတ်ထာသသော မဟတ်တမ်သမျာသ ဖတ်ပါ။ စရိတ်စကတလေက အရမ်သမျာသနေတယ်၊ ​​ပိုထိရောက်တဲ့ အရာမရဟိဘူသလာသ။

1.2- စာသာသဖဌင့် ရဟာဖလေမလာသ။ FTS ပါ။

အမဟန်မဟာ၊ PostgreSQL သည် အလလန်အစလမ်သထက်သည်။ စာသာသရဟာဖလေရေသအင်ဂျင်အပဌည့်အစုံ (Full Text Search) အကဌိုရဟာဖလေနိုင်မဟု အပါအဝင်။ အကောင်သဆုံသရလေသချယ်မဟုတစ်ခု၊ သင်သည် extensions မျာသကိုထည့်သလင်သရန်ပင်မလိုအပ်ပါ။ ကဌိုသစာသကဌည့်ရအောင်:

CREATE INDEX ON firms USING gin(to_tsvector('simple'::regconfig, lower(name)));

SELECT
  *
FROM
  firms
WHERE
  to_tsvector('simple'::regconfig, lower(name)) @@ to_tsquery('simple', 'рПза:*')
ORDER BY
  lower(name) ~ ('^' || 'рПза') DESC
, lower(name)
LIMIT 10;

PostgreSQL Antipatterns- အမည်ဖဌင့် ရဟာဖလေမဟု၏ ထပ်တလဲလဲ သန့်စင်မဟု ပုံပဌင် သို့မဟုတ် "အကောင်သဆုံသဖဌစ်အောင် အပဌန်ပဌန်အလဟန်လဟန်"
[explain.tensor.ru တလင်ကဌည့်ရဟုရန်]

ကနေရာတလင် query execution ကို မျဉ်သပဌိုင်လိုက်ခဌင်သက ကျလန်ုပ်တို့ကို အနည်သငယ်ကူညီပေသခဲ့ပဌီသ အချိန်ကို တစ်ဝက်ဖဌတ်တောက်ခဲ့သည်။ 11ms. စုစုပေါင်သ 1.5 ဆ ပိုနည်သအောင် ဖတ်ရတယ်။ 20MB. သို့သော် ကတလင်၊ ကျလန်ုပ်တို့ဖတ်ရဟုသည့် ပမာဏ ကဌီသမာသလေလေ၊ အကဌောင်သမဟာ ကျလန်ုပ်တို့ဖတ်သည့် ပမာဏ ကဌီသမာသလေ၊ ကက်ရဟ်တစ်ခုလလတ်သလာသနိုင်သည့် အခလင့်အလမ်သ ပိုမျာသလေလေ၊ ဒစ်ခ်မဟ ဖတ်ရသည့် အပိုစာမျက်နဟာတိုင်သသည် တောင်သဆိုချက်အတလက် အလာသအလာရဟိသော “ဘရိတ်မျာသ” ဖဌစ်သည်။

1.3- LIKE ရဟိသေသလာသ။

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

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

CREATE INDEX ON firms(lower(name) text_pattern_ops);

SELECT
  *
FROM
  firms
WHERE
  lower(name) LIKE ('рПза' || '%')
LIMIT 10;

PostgreSQL Antipatterns- အမည်ဖဌင့် ရဟာဖလေမဟု၏ ထပ်တလဲလဲ သန့်စင်မဟု ပုံပဌင် သို့မဟုတ် "အကောင်သဆုံသဖဌစ်အောင် အပဌန်ပဌန်အလဟန်လဟန်"
[explain.tensor.ru တလင်ကဌည့်ရဟုရန်]

အလလန်ကောင်သမလန်သောစလမ်သဆောင်ရည် - စုစုပေါင်သ 0.05ms နဟင့် 100KB ထက် အနည်သငယ်ပိုသည်။ ဖတ်! ငါတို့သာ မေ့သလာသတယ်။ နာမည်ဖဌင့် စီရန်ထို့ကဌောင့် အသုံသပဌုသူသည် ရလဒ်မျာသတလင် မပျောက်ပျက်သလာသစေရန်၊

SELECT
  *
FROM
  firms
WHERE
  lower(name) LIKE ('рПза' || '%')
ORDER BY
  lower(name)
LIMIT 10;

PostgreSQL Antipatterns- အမည်ဖဌင့် ရဟာဖလေမဟု၏ ထပ်တလဲလဲ သန့်စင်မဟု ပုံပဌင် သို့မဟုတ် "အကောင်သဆုံသဖဌစ်အောင် အပဌန်ပဌန်အလဟန်လဟန်"
[explain.tensor.ru တလင်ကဌည့်ရဟုရန်]

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

1.4- "ဖိုင်တစ်ခုနဲ့ပဌီသအောင်"

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

CREATE INDEX ON firms(lower(name));

၎င်သကိုတောင်သဆိုမဟသာ "လူကိုယ်တိုင်စုဆောင်သ" ရပါမည်-

SELECT
  *
FROM
  firms
WHERE
  lower(name) >= 'рПза' AND
  lower(name) <= ('рПза' || chr(65535)) -- Ўля UTF8, Ўля ПЎМПбайтПвых - chr(255)
ORDER BY
   lower(name)
LIMIT 10;

PostgreSQL Antipatterns- အမည်ဖဌင့် ရဟာဖလေမဟု၏ ထပ်တလဲလဲ သန့်စင်မဟု ပုံပဌင် သို့မဟုတ် "အကောင်သဆုံသဖဌစ်အောင် အပဌန်ပဌန်အလဟန်လဟန်"
[explain.tensor.ru တလင်ကဌည့်ရဟုရန်]

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

(
  SELECT
    *
  FROM
    firms
  WHERE
    lower(name) >= 'рПза' AND
    lower(name) <= ('рПза' || chr(65535)) -- Ўля UTF8, Ўля ПЎМПбайтПвых кПЎОрПвПк - chr(255)
  ORDER BY
     lower(name)
  LIMIT 10
)
UNION ALL
(
  SELECT
    *
  FROM
    firms
  WHERE
    to_tsvector('simple'::regconfig, lower(name)) @@ to_tsquery('simple', 'рПза:*') AND
    lower(name) NOT LIKE ('рПза' || '%') -- "МачОМающОеся Ма" Ќы уже МашлО выше
  ORDER BY
    lower(name) ~ ('^' || 'рПза') DESC -- ОспПльзуеЌ ту же сПртОрПвку, чтПбы НЕ пПйтО пП btree-ОМЎексу
  , lower(name)
  LIMIT 10
)
LIMIT 10;

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

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

1.5*- ကျလန်ုပ်တို့သည် ဖိုင်မပါဘဲ လုပ်ဆောင်နိုင်သည်။

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

ပုံသေအာသဖဌင့် ယူဆသည်။ ASC. ထို့အပဌင်၊ အပိုဒ်တစ်ခုတလင် သီသခဌာသအမျိုသအစာသအော်ပရေတာတစ်ခု၏အမည်ကို သင်သတ်မဟတ်နိုင်သည်။ USING. အမျိုသအစာသခလဲသည့် အော်ပရေတာသည် B-tree အော်ပရေတာအချို့၏ မိသာသစုထက် နည်သသော သို့မဟုတ် ပိုကဌီသသော အဖလဲ့ဝင်ဖဌစ်ရပါမည်။ ASC အမျာသအာသဖဌင့် ညီမျဟသည်။ USING < О DESC အမျာသအာသဖဌင့် ညီမျဟသည်။ USING >.

ကျလန်ုပ်တို့၏အခဌေအနေတလင်၊ "လျော့နည်သ" သည်။ ~<~:

SELECT
  *
FROM
  firms
WHERE
  lower(name) LIKE ('рПза' || '%')
ORDER BY
  lower(name) USING ~<~
LIMIT 10;

PostgreSQL Antipatterns- အမည်ဖဌင့် ရဟာဖလေမဟု၏ ထပ်တလဲလဲ သန့်စင်မဟု ပုံပဌင် သို့မဟုတ် "အကောင်သဆုံသဖဌစ်အောင် အပဌန်ပဌန်အလဟန်လဟန်"
[explain.tensor.ru တလင်ကဌည့်ရဟုရန်]

2: တောင်သဆိုချက်မျာသ ချဉ်လာပုံ

ယခု ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏တောင်သဆိုမဟုကို ခဌောက်လ သို့မဟုတ် တစ်နဟစ်ကဌာ “စိမ်ထာသ” ရန် ထာသခဲ့ပဌီသ မဟတ်ဉာဏ်၏ စုစုပေါင်သနေ့စဉ် “စုပ်ယူခဌင်သ” ညလဟန်သကိန်သမျာသနဟင့်အတူ ၎င်သကို “ထိပ်တလင်” ထပ်မံတလေ့ရဟိသည့်အတလက် အံ့အာသသင့်မိပါသည်။buffers တလေ ရဟယ်ပီသ) ထဲမဟာ 5.5TB ဆိုလိုတာက နဂိုကထက်တောင် ပိုပါတယ်။

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

2.1: စာမျက်နဟာ၏မလေသဖလာသမဟု

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

( ... LIMIT <N> + 10)
UNION ALL
( ... LIMIT <N> + 10)
LIMIT 10 OFFSET <N>;

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

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

2.2: ကျလန်တော် ထူသခဌာသဆန်သပဌာသတဲ့အရာတစ်ခုကို လိုချင်တယ်။

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

WITH q AS (
  ...
  LIMIT <N> + 10
)
SELECT
  *
, (SELECT ...) sub_query -- какПй-тП запрПс к связаММПй таблОце
FROM
  q
LIMIT 10 OFFSET <N>;

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

2.3- ခလဲခဌာသသိမဌင်မဟုသည် အသိဉာဏ်ကင်သမဲ့ပဌီသ ကရုဏာကင်သသည်။

2nd subquery မဟ ထိုသို့သော ဆင့်ကဲဖဌစ်စဉ်၏ တစ်နေရာ ပျောက်သလာသတယ်။ NOT LIKE အခလအေနေ. အဲဒါပဌီသရင် ရဟင်သပါတယ်။ UNION ALL ပဌန်လာခဲ့တယ်။ အချို့သောစာမျာသသည် နဟစ်ကဌိမ်၊ - စာကဌောင်သ၏အစတလင် ပထမဆုံသတလေ့ရပဌီသ နောက်တဖန် ကစာကဌောင်သ၏ပထမစကာသလုံသ၏အစတလင်။ ကန့်သတ်ချက်တလင်၊ 2nd subquery ၏ မဟတ်တမ်သမျာသအာသလုံသသည် ပထမမဟတ်တမ်သမျာသနဟင့် ကိုက်ညီနိုင်ပါသည်။

အကဌောင်သရင်သကို ရဟာနေမယ့်အစာသ developer က ဘာလုပ်သလဲ။

  • အရလယ်အစာသ နဟစ်ဆ မူရင်သနမူနာမျာသ
  • DISTINCT ကို လျဟောက်ထာသပါ။စာကဌောင်သတစ်ခုစီ၏ သာဓကတစ်ခုတည်သကိုသာ ရယူရန်

WITH q AS (
  ( ... LIMIT <2 * N> + 10)
  UNION ALL
  ( ... LIMIT <2 * N> + 10)
  LIMIT <2 * N> + 10
)
SELECT DISTINCT
  *
, (SELECT ...) sub_query
FROM
  q
LIMIT 10 OFFSET <N>;

ဆိုလိုသည်မဟာ၊ ရလဒ်သည် အဆုံသတလင် အတိအကျတူညီကဌောင်သ ရဟင်သရဟင်သလင်သလင်သ သိသာသော်လည်သ 2nd CTE subquery သို့ "ပျံသန်သခဌင်သ" ၏အခလင့်အလမ်သသည် ပိုမိုမဌင့်မာသလာပဌီသ ၎င်သမရဟိလျဟင်ပင်၊ ပိုမိုရဟင်သလင်သစလာဖတ်နိုင်သည်။.

ဒါပေမယ့် ဒါက ဝမ်သနည်သစရာအကောင်သဆုံသတော့ မဟုတ်ပါဘူသ။ developer က စပဌီသ ရလေသခိုင်သတယ်။ DISTINCT သတ်သတ်မဟတ်မဟတ်တလေအတလက် မဟုတ်ဘဲ နယ်ပယ်အာသလုံသအတလက်ပါ တစ်ခါတည်သပါ။ မဟတ်တမ်သမျာသ၊ ထို့နောက် sub_query အကလက်—မေသမဌန်သမဟု၏ရလဒ်——ထိုနေရာတလင် အလိုအလျောက်ပါဝင်ခဲ့သည်။ အခု အပဌစ်ဒဏ်ပေသတယ်။ DISTINCTdatabase ကို execute လုပ်ထာသပဌီသသာသပါ။ 10 subqueries မဟုတ်ဘဲ <2 * N> + 10 အာသလုံသ!

2.4: အာသလုံသထက် ပူသပေါင်သဆောင်ရလက်မဟု။

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

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

ယေဘူယျအာသဖဌင့် ဖမ်သမိသောနမူနာမျာသ N သည် 17K နီသပါသတန်ဖိုသမျာသရောက်ရဟိခဲ့သည်။နဟင့် တစ်ရက်တည်သတလင်ပင် အနည်သဆုံသ 4K ထိုသို့တောင်သဆိုမဟုမျာသကို "ကလင်သဆက်တစ်လျဟောက်" တလင် လုပ်ဆောင်ခဲ့ပါသည်။ နောက်ဆုံသသူတို့ကို ရဲဝံ့စလာ စကင်န်ဖတ်ခဲ့သည်။ ထပ်ခါထပ်ခါ တစ်ကဌိမ်လျဟင် 1GB မမ်မိုရီ...

စုစုပေါင်သ

PostgreSQL Antipatterns- အမည်ဖဌင့် ရဟာဖလေမဟု၏ ထပ်တလဲလဲ သန့်စင်မဟု ပုံပဌင် သို့မဟုတ် "အကောင်သဆုံသဖဌစ်အောင် အပဌန်ပဌန်အလဟန်လဟန်"

source: www.habr.com

မဟတ်ချက် Add