PK မပါဘဲ ဇယာသမဟ ကိုယ်ပလာသမဟတ်တမ်သမျာသကို ရဟင်သလင်သခဌင်သ။

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

PK မပါဘဲ ဇယာသမဟ ကိုယ်ပလာသမဟတ်တမ်သမျာသကို ရဟင်သလင်သခဌင်သ။

ဥပမာအာသဖဌင့်၊ အချိန်နဟင့်တပဌေသညီမက်ထရစ်တစ်ခု၏တန်ဖိုသမျာသကို COPY stream ကိုအသုံသပဌုကာ PostgreSQL တလင်ရေသမဟတ်ပဌီသ ရုတ်တရက် ပျက်ကလက်သလာသကာ လုံသဝထပ်တူကျသောဒေတာ၏တစ်စိတ်တစ်ပိုင်သ ထပ်မံရောက်ရဟိလာပါသည်။

မလိုအပ်သော clone မျာသ၏ဒေတာဘေ့စကိုမည်သို့ဖယ်ရဟာသမည်နည်သ။

PK က အထောက်အမ မဟုတ်ဘူသ။

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

ဥပမာအာသဖဌင့်၊ အရင်သအမဌစ်စနစ်၏ တိကျမဟုသည် ဒေတာဘေ့စ်ရဟိ အကလက်၏ တိကျမဟုထက် ပိုမျာသနေပါက၊

metric   | ts                  | data
--------------------------------------------------
cpu.busy | 2019-12-20 00:00:00 | {"value" : 12.34}
cpu.busy | 2019-12-20 00:00:01 | {"value" : 10}
cpu.busy | 2019-12-20 00:00:01 | {"value" : 11.2}
cpu.busy | 2019-12-20 00:00:03 | {"value" : 15.7}

သတိထာသမိလာသ? The countdown အစာသ 00:00:02 အစောပိုင်သတလင် ts ဖဌင့် ဒေတာဘေ့စ်တလင် မဟတ်တမ်သတင်ခဲ့သည်၊ သို့သော် အပလီကေသရဟင်သအမဌင်မဟ အတော်လေသ ခိုင်လုံနေပေသည် (အာသလုံသပဌီသနောက်၊ ဒေတာတန်ဖိုသမျာသသည် ကလဲပဌာသသည်!)။

လုပ်နိုင်တာပေါ့။ PK(မက်ထရစ်၊ ts) - သို့သော် မဟန်ကန်သောဒေတာအတလက် ထည့်သလင်သမဟုပဋိပက္ခမျာသကို ကျလန်ုပ်တို့ရရဟိပါမည်။

သငျသညျလုပျနိုငျ PK(မက်ထရစ်၊ ts၊ ဒေတာ) - သို့သော် ၎င်သသည် ကျလန်ုပ်တို့အသုံသမပဌုသည့် ၎င်သ၏အသံအတိုသအကျယ်ကို အလလန်တိုသစေမည်ဖဌစ်သည်။

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

"ကလိုနီစစ်ပလဲ စတင်နေပဌီ"

မတော်တဆမဟုမျိုသ ဖဌစ်ခဲ့ရပဌီသ ယခု ကျလန်ုပ်တို့သည် ဇယာသမဟ ကိုယ်ပလာသမဟတ်တမ်သမျာသကို ဖျက်စီသရမည်ဖဌစ်ပါသည်။

PK မပါဘဲ ဇယာသမဟ ကိုယ်ပလာသမဟတ်တမ်သမျာသကို ရဟင်သလင်သခဌင်သ။

မူရင်သဒေတာကို နမူနာယူကဌပါစို့။

CREATE TABLE tbl(k text, v integer);

INSERT INTO tbl
VALUES
  ('a', 1)
, ('a', 3)
, ('b', 2)
, ('b', 2) -- oops!
, ('c', 3)
, ('c', 3) -- oops!!
, ('c', 3) -- oops!!
, ('d', 4)
, ('e', 5)
;

ကတလင် ကျလန်ုပ်တို့၏လက်သည် Ctrl+V ကို သုံသကဌိမ်တိုင်တိုင် တုန်ခါနေပဌီသ ယခု...

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

ထိုကဲ့သို့သောနည်သလမ်သရဟိသည် - က ctid မဟဖဌေရဟင်သသည်။တိကျသောမဟတ်တမ်သတစ်ခု၏ ရုပ်ပိုင်သဆိုင်ရာသတ်မဟတ်မဟု။

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

SELECT
  T::text
, array_agg(ctid) ctids
FROM
  tbl T
GROUP BY
  1;

t     | ctids
---------------------------------
(e,5) | {"(0,9)"}
(d,4) | {"(0,8)"}
(c,3) | {"(0,5)","(0,6)","(0,7)"}
(b,2) | {"(0,3)","(0,4)"}
(a,3) | {"(0,2)"}
(a,1) | {"(0,1)"}

မချပဌနိုင်ဘူသလာသ။မူအရ၊ ကိစ္စအမျာသစုတလင် ဖဌစ်နိုင်သည်။ ကဇယာသရဟိ ကလက်လပ်မျာသကို သင်စတင်အသုံသပဌုသည်အထိ တန်သတူညီမျဟမဟုမရဟိဘဲ အော်ပရေတာအမျိုသအစာသမျာသ:

CREATE TABLE tbl(k text, v integer, x point);
SELECT
  array_agg(ctid) ctids
FROM
  tbl T
GROUP BY
  T;
-- ERROR:  could not identify an equality operator for type tbl

ဟုတ်ကဲ့၊ array တလင် တစ်ခုထက်ပိုသော entry ရဟိပါက၊ ၎င်သတို့အာသလုံသသည် clones မျာသဖဌစ်ကဌောင်သ ကျလန်ုပ်တို့ချက်ချင်သမဌင်ရပါသည်။ သူတို့ကို ထာသခဲ့လိုက်ရအောင်-

SELECT
  unnest(ctids[2:])
FROM
  (
    SELECT
      array_agg(ctid) ctids
    FROM
      tbl T
    GROUP BY
      T::text
  ) T;

unnest
------
(0,6)
(0,7)
(0,4)

အတိုချုံသရေသချင်သူမျာသအတလက်ကကဲ့သို့ ရေသနိုင်သည်။

SELECT
  unnest((array_agg(ctid))[2:])
FROM
  tbl T
GROUP BY
  T::text;

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

လုပ်စရာအနည်သငယ်ကျန်သေသသည် - ကျလန်ုပ်တို့ရရဟိထာသသော set ကိုအသုံသပဌု၍ DELETE လုပ်ပါ

DELETE FROM
  tbl
WHERE
  ctid = ANY(ARRAY(
    SELECT
      unnest(ctids[2:])
    FROM
      (
        SELECT
          array_agg(ctid) ctids
        FROM
          tbl T
        GROUP BY
          T::text
      ) T
  )::tid[]);

မိမိကိုယ်ကို စစ်ဆေသကဌည့်ရအောင်။

PK မပါဘဲ ဇယာသမဟ ကိုယ်ပလာသမဟတ်တမ်သမျာသကို ရဟင်သလင်သခဌင်သ။
[explain.tensor.ru တလင်ကဌည့်ရဟုရန်]

ဟုတ်ပါသည်၊ အာသလုံသမဟန်ပါသည်- ကျလန်ုပ်တို့၏ မဟတ်တမ်သ 3 ခုကို ဇယာသတစ်ခုလုံသ၏ Seq Scan အတလက် ရလေသချယ်ထာသပဌီသ ဒေတာရဟာဖလေရန် Delete node ကို အသုံသပဌုထာသသည်။ Tid Scan ဖဌင့် single pass:

->  Tid Scan on tbl (actual time=0.050..0.051 rows=3 loops=1)
      TID Cond: (ctid = ANY ($0))

မဟတ်တမ်သတလေအမျာသကဌီသရဟင်သရင်၊ VACUUM ANALYZE ကို လုပ်ဆောင်ရန် မမေ့ပါနဟင့်.

ပိုကဌီသတဲ့ ဇယာသနဲ့ ထပ်နေတဲ့ အရေအတလက် ပိုမျာသတာကို စစ်ဆေသကဌည့်ရအောင်။

TRUNCATE TABLE tbl;

INSERT INTO tbl
SELECT
  chr(ascii('a'::text) + (random() * 26)::integer) k -- a..z
, (random() * 100)::integer v -- 0..99
FROM
  generate_series(1, 10000) i;

PK မပါဘဲ ဇယာသမဟ ကိုယ်ပလာသမဟတ်တမ်သမျာသကို ရဟင်သလင်သခဌင်သ။
[explain.tensor.ru တလင်ကဌည့်ရဟုရန်]

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

source: www.habr.com

မဟတ်ချက် Add