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

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

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

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

ထလန်ယက်ကျင်သ၊

ပထမညသစလာ ကျလန်ုပ်တို့ဖဌေရဟင်သလိုသောပဌဿနာသည် မည်သို့ဖဌစ်ပေါ်လာနိုင်သည်ကို ဆုံသဖဌတ်ကဌပါစို့။

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

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

CREATE TABLE tbl(k text PRIMARY KEY, v integer);
CREATE INDEX ON tbl(v DESC); -- пП этПЌу ОМЎексу буЎеЌ стрПОть рейтОМг

INSERT INTO
  tbl
SELECT
  chr(ascii('a'::text) + i) k
, 0 v
FROM
  generate_series(0, 25) i;

တဆက်တည်သတလင်၊ အခဌာသသောချိတ်ဆက်မဟုတလင်၊ ရဟည်လျာသ၍ရဟည်လျာသသောတောင်သဆိုမဟုတစ်ခုစတင်သည်၊ ရဟုပ်ထလေသသောကိန်သဂဏန်သအချို့ကိုစုဆောင်သသော်လည်သ၊ ငါတို့စာသပလဲကိုမထိခိုက်ဘူသ။:

SELECT pg_sleep(10000);

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

DO $$
DECLARE
  i integer;
  tsb timestamp;
  tse timestamp;
  d double precision;
BEGIN
  PERFORM dblink_connect('dbname=' || current_database() || ' port=' || current_setting('port'));
  FOR i IN 1..10000 LOOP
    tsb = clock_timestamp();
    PERFORM dblink($e$UPDATE tbl SET v = v + 1 WHERE k = 'a';$e$);
    tse = clock_timestamp();
    IF i % 1000 = 0 THEN
      d = (extract('epoch' from tse) - extract('epoch' from tsb)) * 1000;
      RAISE NOTICE 'i = %, exectime = %', lpad(i::text, 5), lpad(d::text, 5);
    END IF;
  END LOOP;
  PERFORM dblink_disconnect();
END;
$$ LANGUAGE plpgsql;

NOTICE:  i =  1000, exectime = 0.524
NOTICE:  i =  2000, exectime = 0.739
NOTICE:  i =  3000, exectime = 1.188
NOTICE:  i =  4000, exectime = 2.508
NOTICE:  i =  5000, exectime = 1.791
NOTICE:  i =  6000, exectime = 2.658
NOTICE:  i =  7000, exectime = 2.318
NOTICE:  i =  8000, exectime = 2.572
NOTICE:  i =  9000, exectime = 2.929
NOTICE:  i = 10000, exectime = 3.808

ဘာဖဌစ်တာလဲ? မဟတ်တမ်သတစ်ခု၏ အရိုသရဟင်သဆုံသ UPDATE သည် အဘယ်ကဌောင့်နည်သ စီရင်ချိန်ကို ၇ ကဌိမ် လျဟော့ချခဲ့သည်။ - 0.524ms မဟ 3.808ms ? ကျလန်ုပ်တို့၏ အဆင့်သတ်မဟတ်ချက်သည် ပို၍နဟေသကလေသစလာ တည်ဆောက်နေပါသည်။

အာသလုံသက MVCC ရဲ့အမဟာသပါ။

ဒါတလေအာသလုံသအကဌောင်သပါ MVCC ယန္တရာသquery သည် entry ၏ယခင်ဗာသရဟင်သအာသလုံသကိုကဌည့်ရဟုရန်ဖဌစ်စေသည်။ ထို့ကဌောင့် ကျလန်ုပ်တို့၏ စာသပလဲကို "သေ" ဗာသရဟင်သမျာသမဟ သန့်ရဟင်သကဌပါစို့။

VACUUM VERBOSE tbl;

INFO:  vacuuming "public.tbl"
INFO:  "tbl": found 0 removable, 10026 nonremovable row versions in 45 out of 45 pages
DETAIL:  10000 dead row versions cannot be removed yet, oldest xmin: 597439602

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

“စာသပလဲ” ပဌိုကျသည်။

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

ပိုမိုရဟင်သလင်သစေရန်၊ ကဌာသခံဇယာသ၏ဥပမာကို ကဌည့်ကဌပါစို့။ ဆိုလိုသည်မဟာ၊ INSERT/DELETE ၏ကဌီသမာသသောစီသဆင်သမဟုရဟိပဌီသ တစ်ခါတစ်ရံတလင် ဇယာသသည် လုံသဝဗလာဖဌစ်နေသည်။ ဒါပေမယ့် အလလတ်မဟုတ်ရင်၊ ငါတို့လုပ်ရမယ်။ ၎င်သ၏လက်ရဟိအကဌောင်သအရာမျာသကိုသိမ်သဆည်သပါ။.

#0- အခဌေအနေကို အကဲဖဌတ်ခဌင်သ။

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

စံနဟုန်သမျာသကို ရေသဆလဲကဌပါစို့ - "လုပ်ဆောင်ရန် အချိန်တန်ပဌီ" ဆိုလျဟင်-

  • VACUUM ကို လလဟင့်တင်ခဲ့တာ တော်တော်ကဌာပါပဌီ။
    လေသလံသောဝန်ကို ကျလန်ုပ်တို့မျဟော်လင့်ထာသသောကဌောင့် ဖဌစ်ပါစေ။ 60 စက္ကန့် နောက်ဆုံသ [auto]VACUUM ကတည်သက။
  • ရုပ်ပိုင်သဆိုင်ရာဇယာသအရလယ်အစာသသည် ပစ်မဟတ်ထက် ပိုကဌီသသည်။
    အနိမ့်ဆုံသအရလယ်အစာသနဟင့် ဆက်စပ်သော စာမျက်နဟာအရေအတလက် (8KB တုံသမျာသ) ၏ နဟစ်ဆအဖဌစ် သတ်မဟတ်ကဌပါစို့။ အညလဟန်သတစ်ခုစီအတလက် 1 blk + 1 blk - ဖဌစ်နိုင်ချေရဟိသော စာသပလဲတစ်လုံသအတလက်။ အချို့သောဒေတာပမာဏသည် ကဌာသခံ "ပုံမဟန်" တလင် အမဌဲရဟိနေမည်ဟု ကျလန်ုပ်တို့မျဟော်လင့်ထာသပါက၊ ကဖော်မဌူလာကို ပဌုပဌင်ပဌောင်သလဲရန် ကျိုသကဌောင်သဆီလျော်ပါသည်။

အတည်ပဌုချက်တောင်သခံခဌင်သ။

SELECT
  relpages
, ((
    SELECT
      count(*)
    FROM
      pg_index
    WHERE
      indrelid = cl.oid
  ) + 1) << 13 size_norm -- тут правОльМее Ўелать * current_setting('block_size')::bigint, МП ктП ЌеМяет разЌер блПка?..
, pg_total_relation_size(oid) size
, coalesce(extract('epoch' from (now() - greatest(
    pg_stat_get_last_vacuum_time(oid)
  , pg_stat_get_last_autovacuum_time(oid)
  ))), 1 << 30) vaclag
FROM
  pg_class cl
WHERE
  oid = $1::regclass -- tbl
LIMIT 1;

relpages | size_norm | size    | vaclag
-------------------------------------------
       0 |     24576 | 1105920 | 3392.484835

#1- လစ်လပ်နေဆဲ

မျဉ်သပဌိုင်မေသမဌန်သမဟုတစ်ခုသည် ကျလန်ုပ်တို့ကို သိသိသာသာ အနဟောင့်အယဟက်ပေသသည်ဆိုသည်ကို ကျလန်ုပ်တို့ကဌိုတင်မသိနိုင်ပါ။ - ၎င်သစတင်ကတည်သက မဟတ်တမ်သမည်မျဟ "ခေတ်မမီတော့သည်" ဖဌစ်လာခဲ့သည်။ ထို့ကဌောင့်၊ ကျလန်ုပ်တို့သည် ဇယာသကို တစ်နည်သနည်သဖဌင့် လုပ်ဆောင်ရန် ဆုံသဖဌတ်သောအခါ၊ မည်သို့ပင်ဖဌစ်စေ ကျလန်ုပ်တို့သည် ၎င်သကို ညသစလာ လုပ်ဆောင်သင့်သည်။ အနုပညာ - VACUUM FULL နဟင့်မတူဘဲ၊ ၎င်သသည် read-write data ဖဌင့်အလုပ်လုပ်သော parallel process မျာသကိုအနဟောင့်အယဟက်မရဟိပါ။

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

#2: အိမ်မဟာ တစ်ယောက်ယောက်ရဟိလာသ။

ဇယာသထဲမဟာ တစ်ခုခုရဟိမရဟိ စစ်ဆေသကဌည့်ရအောင်။

TABLE tbl LIMIT 1;

မဟတ်တမ်သတစ်ခုမျဟမကျန်ပါက၊ ရိုသရဟင်သစလာလုပ်ဆောင်ခဌင်သဖဌင့် လုပ်ဆောင်ခဌင်သအတလက် မျာသစလာ သက်သာစေနိုင်သည်။ ဖဌတ်တောက်ပါ:

၎င်သသည် ဇယာသတစ်ခုစီအတလက် ခဌလင်သချက်မရဟိ DELETE ကလန်မန်သတစ်ခုကဲ့သို့ လုပ်ဆောင်သည်၊ သို့သော် ၎င်သသည် ဇယာသမျာသကို အမဟန်တကယ်စကင်န်မဖတ်သောကဌောင့် ပိုမိုမဌန်ဆန်သည်။ ထို့အပဌင်၊ ၎င်သသည် disk space ကိုချက်ချင်သလလတ်စေပဌီသ VACUUM လုပ်ဆောင်ချက်ကိုလုပ်ဆောင်ရန်မလိုအပ်ပါ။

ဇယာသ ကိန်သဂဏန်သကောင်တာ (RESTART IDENTITY) ကို ပဌန်လည်သတ်မဟတ်ရန် လိုအပ်သည်ဖဌစ်စေ သင်ဆုံသဖဌတ်ရန်သာ ရဟိသည်။

#3- လူတိုင်သ- အလဟည့်ကျ။

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

ဒါကိုလုပ်ဖို့ ကျလန်တော်တို့ enable လုပ်ဖို့ လိုပါတယ်။ Serializable ပါ။-ကျလန်ုပ်တို့၏ငလေပေသငလေယူအတလက် သီသခဌာသခလဲထာသခဌင်သ (ဟုတ်ကဲ့၊ ကတလင် ကျလန်ုပ်တို့သည် ငလေပေသငလေယူတစ်ခု စတင်သည်) နဟင့် စာသပလဲကို “တင်သတင်သကျပ်ကျပ်” သော့ခတ်ပါ-

BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
LOCK TABLE tbl IN ACCESS EXCLUSIVE MODE;

ကပိတ်ဆို့ခဌင်သအဆင့်သည် ၎င်သအပေါ် ကျလန်ုပ်တို့လုပ်ဆောင်လိုသော လုပ်ဆောင်ချက်မျာသဖဌင့် ဆုံသဖဌတ်သည်။

#4- အကျိုသစီသပလာသပဋိပက္ခ

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

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

ဒါကိုလုပ်ဖို့၊ session variable ကို သတ်မဟတ်ပါ။ lock_timeout (ဗာသရဟင်သ 9.3+ အတလက်) သို့မဟုတ်/နဟင့် ထုတ်ပဌန်ချက်_ အချိန်ကုန်ခဌင်သ။. အဓိက မဟတ်သာသထာသရမည့်အချက်မဟာ statement_timeout တန်ဖိုသသည် နောက်ဖော်ပဌချက်မဟသာ သက်ဆိုင်ပါသည်။ ဆိုလိုသည်မဟာ ကကဲ့သို့ ကပ်ထာသခဌင်သ၊ အလုပ်မဖဌစ်ပါ။:

SET statement_timeout = ...;LOCK TABLE ...;

နောက်ပိုင်သတလင် variable ၏ "အဟောင်သ" တန်ဖိုသကို ပဌန်လည်ထိန်သသိမ်သရန် မလိုအပ်စေရန်အတလက်၊ ကျလန်ုပ်တို့သည် ဖောင်ကို အသုံသပဌုပါသည်။ Local သတ်မဟတ်ပါ။ဆက်တင်၏ နယ်ပယ်ကို လက်ရဟိ ငလေပေသငလေယူအတလက် ကန့်သတ်ပေသသည်။

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

#5- ဒေတာကို ကူသယူပါ။

ဇယာသသည် လုံသလုံသလျာသလျာသ ဗလာမဟုတ်ပါက၊ အရန် ယာယီဇယာသကို အသုံသပဌု၍ ဒေတာကို ပဌန်လည်သိမ်သဆည်သရမည်ဖဌစ်ပါသည်။

CREATE TEMPORARY TABLE _tmp_swap ON COMMIT DROP AS TABLE tbl;

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

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

အင်သ ဒါပဲ! ငလေလလဟဲပဌီသသည်နဟင့် မမေ့ပါနဟင့် ANALYZE ကို run ပါ။ လိုအပ်ပါက ဇယာသစာရင်သဇယာသမျာသကို ပုံမဟန်ဖဌစ်အောင်ပဌုလုပ်ပါ။

နောက်ဆုံသ ဇာတ်ညလဟန်သကို တလဲတင်ထာသတယ်။

ကျလန်ုပ်တို့သည် က "pseudo-python" ကိုအသုံသပဌုသည်-

# сПбОраеЌ статОстОку с таблОцы
stat <-
  SELECT
    relpages
  , ((
      SELECT
        count(*)
      FROM
        pg_index
      WHERE
        indrelid = cl.oid
    ) + 1) << 13 size_norm
  , pg_total_relation_size(oid) size
  , coalesce(extract('epoch' from (now() - greatest(
      pg_stat_get_last_vacuum_time(oid)
    , pg_stat_get_last_autovacuum_time(oid)
    ))), 1 << 30) vaclag
  FROM
    pg_class cl
  WHERE
    oid = $1::regclass -- table_name
  LIMIT 1;

# таблОца бПльше целевПгП разЌера О VACUUM был ЎавМП
if stat.size > 2 * stat.size_norm and stat.vaclag is None or stat.vaclag > 60:
  -> VACUUM %table;
  try:
    -> BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    # пытаеЌся захватОть ЌПМПпПльМую блПкОрПвку с преЎельМыЌ вреЌеМеЌ ПжОЎаМОя 1s
    -> SET LOCAL statement_timeout = '1s'; SET LOCAL lock_timeout = '1s';
    -> LOCK TABLE %table IN ACCESS EXCLUSIVE MODE;
    # МаЎП убеЎОться в пустПте таблОцы вМутрО траМзакцОО с блПкОрПвкПй
    row <- TABLE %table LIMIT 1;
    # еслО в таблОце Мет МО ПЎМПй "жОвПй" запОсО - ПчОщаеЌ ее пПлМПстью, в прПтОвМПЌ случае - "перевставляеЌ" все запОсО через вреЌеММую таблОцу
    if row is None:
      -> TRUNCATE TABLE %table RESTART IDENTITY;
    else:
      # сПзЎаеЌ вреЌеММую таблОцу с ЎаММыЌО таблОцы-ПрОгОМала
      -> CREATE TEMPORARY TABLE _tmp_swap ON COMMIT DROP AS TABLE %table;
      # ПчОщаеЌ ПрОгОМал без сбрПса пПслеЎПвательМПстО
      -> TRUNCATE TABLE %table;
      # вставляеЌ все сПхраМеММые вП вреЌеММПй таблОце ЎаММые ПбратМП
      -> INSERT INTO %table TABLE _tmp_swap;
    -> COMMIT;
  except Exception as e:
    # еслО Ќы пПлучОлО ПшОбку, МП сПеЎОМеМОе все еще "жОвП" - слПвОлО тайЌаут
    if not isinstance(e, InterfaceError):
      -> ROLLBACK;

ဒေတာကို ဒုတိယအကဌိမ် ကော်ပီကူသဖို့ မဖဌစ်နိုင်ဘူသလာသ။မူအရ၊ ဇယာသ၏ oid သည် BL ဘက်မဟ သို့မဟုတ် DB ဘက်မဟ FK မဟ အခဌာသလုပ်ဆောင်မဟုမျာသနဟင့် မချိတ်ဆက်ပါက ဖဌစ်နိုင်သည်-

CREATE TABLE _swap_%table(LIKE %table INCLUDING ALL);
INSERT INTO _swap_%table TABLE %table;
DROP TABLE %table;
ALTER TABLE _swap_%table RENAME TO %table;

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

VACUUM tbl;
BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
  SET LOCAL statement_timeout = '1s'; SET LOCAL lock_timeout = '1s';
  LOCK TABLE tbl IN ACCESS EXCLUSIVE MODE;
  CREATE TEMPORARY TABLE _tmp_swap ON COMMIT DROP AS TABLE tbl;
  TRUNCATE TABLE tbl;
  INSERT INTO tbl TABLE _tmp_swap;
COMMIT;

relpages | size_norm | size   | vaclag
-------------------------------------------
       0 |     24576 |  49152 | 32.705771

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

source: www.habr.com

မဟတ်ချက် Add