рдЬрдм VACUUM рдЕрд╕рдлрд▓ рд╣реБрдиреНрдЫ, рд╣рд╛рдореА рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рдЯреЗрдмрд▓ рд╕рдлрд╛ рдЧрд░реНрдЫреМрдВ

рднреНрдпрд╛рдХреНрдпреВрдо PostgreSQL рдорд╛ рдЯреЗрдмрд▓рдмрд╛рдЯ "рд╕рдлрд╛" рдЧрд░реНрди рд╕рдХреНрдЫ рдХрд╕реИрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрджреИрди - рдЕрд░реНрдерд╛рддреН, рдпреА рд░реЗрдХрд░реНрдбрд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдиреБ рдЕрдШрд┐ рд╕реБрд░реБ рднрдПрдХреЛ рдПрдЙрдЯрд╛ рд╕рдХреНрд░рд┐рдп рдЕрдиреБрд░реЛрдз рдЫреИрдиред

рддрд░ рдХреЗ рд╣реБрдиреНрдЫ рдпрджрд┐ рдпрд╕реНрддреЛ рдЕрдкреНрд░рд┐рдп рдкреНрд░рдХрд╛рд░ (рдУрдПрд▓рдЯреАрдкреА рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рд▓рд╛рдореЛ-рд╕рдордп OLAP рд▓реЛрдб) рдЕрдЭреИ рдЕрд╡рд╕реНрдерд┐рдд рдЫ? рдХрд╕рд░реА рд╕рдХреНрд░рд┐рдп рд░реВрдкрдорд╛ рдкрд░рд┐рд╡рд░реНрддрди рддрд╛рд▓рд┐рдХрд╛ рд╕рдлрд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд▓рд╛рдореЛ рдкреНрд░рд╢реНрдирд╣рд░реВрд▓реЗ рдШреЗрд░рд┐рдПрдХреЛ рд░ рд░реЗрдХрдорд╛ рдкрд╛рдЗрд▓рд╛ рдЯреЗрдХреЗрди?

рдЬрдм VACUUM рдЕрд╕рдлрд▓ рд╣реБрдиреНрдЫ, рд╣рд╛рдореА рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рдЯреЗрдмрд▓ рд╕рдлрд╛ рдЧрд░реНрдЫреМрдВ

рд░реЗрдХ рдмрд┐рдЫреНрдпрд╛рдЙрдБрджреИ

рдкрд╣рд┐рд▓реЗ, рд╣рд╛рдореАрд▓реЗ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рдЦреЛрдЬреЗрдХреЛ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╣реЛ рд░ рдпреЛ рдХрд╕рд░реА рдЙрддреНрдкрдиреНрди рд╣реБрди рд╕рдХреНрдЫ рднрдиреЗрд░ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░реМрдВред

рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдпреЛ рдЕрд╡рд╕реНрдерд╛ рд╣реБрдиреНрдЫ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд╛рдиреЛ рдЯреЗрдмрд▓рдорд╛, рддрд░ рдЬрд╕рдорд╛ рдпреЛ рд╣реБрдиреНрдЫ рдзреЗрд░реИ рдкрд░рд┐рд╡рд░реНрддрдиред рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдпреЛ рд╡рд╛ рдлрд░рдХ рдорд┐рдЯрд░/рд╕рдордЧреНрд░/рдореВрд▓реНрдпрд╛рдЩреНрдХрди, рдЬрд╕рдорд╛ UPDATE рдкреНрд░рд╛рдпрдГ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реБрдиреНрдЫ, рд╡рд╛ рдмрдлрд░ рд▓рд╛рдЗрди рдШрдЯрдирд╛рд╣рд░реВрдХреЛ рдХреЗрд╣реА рдирд┐рд░рдиреНрддрд░ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рд╕реНрдЯреНрд░рд┐рдорд▓рд╛рдИ рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрди, рдЬрд╕рдХрд╛ рд░реЗрдХрд░реНрдбрд╣рд░реВ рд▓рдЧрд╛рддрд╛рд░ INSERT/DELETE рд╣реБрдиреНрдЫрдиреНред

рдореВрд▓реНрдпрд╛рдЩреНрдХрдирдХреЛ рд╕рд╛рде рд╡рд┐рдХрд▓реНрдк рдкреБрди: рдЙрддреНрдкрд╛рджрди рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВ:

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

рдХреЗ рднрдпреЛ? рдХрд┐рди рдПрдХрд▓ рд░реЗрдХрд░реНрдбрдХреЛ рд╕рд░рд▓ рдЕрдкрдбреЗрдЯрдХреЛ рд▓рд╛рдЧрд┐ рдкрдирд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдордп 7 рдкрдЯрдХ рдШрдЯреНрдпреЛ - 0.524ms рджреЗрдЦрд┐ 3.808ms рд╕рдореНрдо? рд░ рд╣рд╛рдореНрд░реЛ рдореВрд▓реНрдпрд╛рдЩреНрдХрди рдЕрдзрд┐рдХ рд░ рдЕрдзрд┐рдХ рдмрд┐рд╕реНрддрд╛рд░реИ рдирд┐рд░реНрдорд╛рдг рднрдЗрд░рд╣реЗрдХреЛ рдЫред

рдпреЛ рд╕рдмреИ MVCC рдХреЛ рджреЛрд╖ рд╣реЛред

рдпреЛ рд╕рдмреИрдХреЛ рдмрд╛рд░реЗрдорд╛ рд╣реЛ MVCC рд╕рдВрдпрдиреНрддреНрд░, рдЬрд╕рд▓реЗ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдХреЛ рд╕рдмреИ рдЕрдШрд┐рд▓реНрд▓реЛ рд╕рдВрд╕реНрдХрд░рдгрд╣рд░реВ рд╣реЗрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдХреНрд╡реЗрд░реАрдХреЛ рдХрд╛рд░рдг рдмрдирд╛рдЙрдБрдЫред рддреНрдпрд╕реЛрднрдП рд╣рд╛рдореНрд░реЛ рддрд╛рд▓рд┐рдХрд╛рд▓рд╛рдИ "рдореГрдд" рд╕рдВрд╕реНрдХрд░рдгрд╣рд░реВрдмрд╛рдЯ рд╕рдлрд╛ рдЧрд░реМрдВ:

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 рд╕реЗрдХреЗрдиреНрдб рдкрдЫрд┐рд▓реНрд▓реЛ [рд╕реНрд╡рдд: 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 рдХреЛ рд╡рд┐рдкрд░реАрдд, рдпрд╕рд▓реЗ рдкрдвреНрдиреЗ-рд▓реЗрдЦрди рдбреЗрдЯрд╛рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рд╕рдорд╛рдирд╛рдиреНрддрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВрдорд╛ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдЧрд░реНрджреИрдиред

рдПрдХреИ рд╕рдордпрдорд╛, рдпрд╕рд▓реЗ рддреБрд░реБрдиреНрддреИ рд╣рд╛рдореАрд▓реЗ рд╣рдЯрд╛рдЙрди рдЪрд╛рд╣реЗрдХреЛ рдзреЗрд░реИрдЬрд╕реЛрд▓рд╛рдИ рд╕рдлрд╛ рдЧрд░реНрди рд╕рдХреНрдЫред рд╣реЛ, рд░ рдпрд╕ рддрд╛рд▓рд┐рдХрд╛рдорд╛ рдкрдЫрд┐рдХрд╛ рдкреНрд░рд╢реНрдирд╣рд░реВ рд╣рд╛рдореАрдХрд╣рд╛рдБ рдЬрд╛рдиреЗрдЫрдиреН "рддрд╛рддреЛ рдХреНрдпрд╛рд╕" рджреНрд╡рд╛рд░рд╛, рдЬрд╕рд▓реЗ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдЕрд╡рдзрд┐ рдШрдЯрд╛рдЙрдиреЗрдЫ - рд░ рддреНрдпрд╕рдХрд╛рд░рдг, рд╣рд╛рдореНрд░реЛ рд╕рд░реНрднрд┐рд╕рд┐рдЩ рд▓реЗрдирджреЗрдирджреНрд╡рд╛рд░рд╛ рдЕрд░реВрд▓рд╛рдИ рдмреНрд▓рдХ рдЧрд░реНрдиреЗ рдХреБрд▓ рд╕рдордпред

#2: рдШрд░ рдХреЛрд╣реА рд╣реБрдиреБрд╣реБрдиреНрдЫ?

рддрд╛рд▓рд┐рдХрд╛рдорд╛ рдХреЗрд╣рд┐ рдЫ рднрдиреЗ рдЬрд╛рдБрдЪ рдЧрд░реМрдВ:

TABLE tbl LIMIT 1;

рдпрджрд┐ рддреНрдпрд╣рд╛рдБ рдПрдХрд▓ рд░реЗрдХрд░реНрдб рдмрд╛рдБрдХреА рдЫреИрди рднрдиреЗ, рд╣рд╛рдореА рдХреЗрд╡рд▓ рдЧрд░реЗрд░ рдкреНрд░рд╢реЛрдзрдирдорд╛ рдзреЗрд░реИ рдмрдЪрдд рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ рдХрд╛рдЯреНрдиреБрд╣реЛрд╕реН:

рдпрд╕рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рддрд╛рд▓рд┐рдХрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдмрд┐рдирд╛ рд╢рд░реНрдд DELETE рдЖрджреЗрд╢рдХреЛ рд░реВрдкрдорд╛ рдХрд╛рд░реНрдп рдЧрд░реНрджрдЫ, рддрд░ рдзреЗрд░реИ рдЫрд┐рдЯреЛ рдЫ рдХрд┐рдирднрдиреЗ рдпрд╕рд▓реЗ рд╡рд╛рд╕реНрддрд╡рдорд╛ рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВ рд╕реНрдХреНрдпрд╛рди рдЧрд░реНрджреИрдиред рдпрд╕рдмрд╛рд╣реЗрдХ, рдпрд╕рд▓реЗ рддреБрд░реБрдиреНрддреИ рдбрд┐рд╕реНрдХ рд╕реНрдкреЗрд╕ рдЦрд╛рд▓реА рдЧрд░реНрджрдЫ, рддреНрдпрд╕реИрд▓реЗ рддреНрдпрд╣рд╛рдБ рдкрдЫрд┐ рднреНрдпрд╛рдХреБрдо рдЕрдкрд░реЗрд╢рди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫреИрдиред

рддрдкрд╛рдИрдВрд▓реЗ рддрд╛рд▓рд┐рдХрд╛ рдЕрдиреБрдХреНрд░рдо рдХрд╛рдЙрдиреНрдЯрд░ (RESTART IdentITY) рд░рд┐рд╕реЗрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдХрд┐ рдЫреИрди рдирд┐рд░реНрдгрдп рдЧрд░реНрди рддрдкрд╛рдИрдВ рдорд╛ рдирд┐рд░реНрднрд░ рдЫред

#3: рд╕рдмреИрдЬрдирд╛ - рдкрд╛рд▓реЛ рд▓рд┐рдиреБрд╣реЛрд╕реН!

рд╣рд╛рдореА рдЕрддреНрдпрдзрд┐рдХ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛рддреНрдордХ рд╡рд╛рддрд╛рд╡рд░рдгрдорд╛ рдХрд╛рдо рдЧрд░реНрдиреЗ рднрдПрдХрд╛рд▓реЗ, рд╣рд╛рдореА рдпрд╣рд╛рдБ рддрд╛рд▓рд┐рдХрд╛рдорд╛ рдХреБрдиреИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рд╣рд░реВ рдЫреИрдирдиреН рднрдиреА рдЬрд╛рдБрдЪ рдЧрд░рд┐рд░рд╣реЗрдХрд╛ рдЫреМрдВ, рдХрд╕реИрд▓реЗ рддреНрдпрд╣рд╛рдБ рдкрд╣рд┐рд▓реЗ рдиреИ рдХреЗрд╣реА рд▓реЗрдЦреЗрдХреЛ рд╣реБрди рд╕рдХреНрдЫред рд╣рд╛рдореАрд▓реЗ рдпреЛ рдЬрд╛рдирдХрд╛рд░реА рдЧреБрдорд╛рдЙрдиреБ рд╣реБрдБрджреИрди, рддреНрдпрд╕реЛрднрдП рдХреЗ рд╣реЛ? рдпреЛ рд╕рд╣реА рдЫ, рд╣рд╛рдореАрд▓реЗ рдпреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдХрд┐ рдХрд╕реИрд▓реЗ рдпрд╕рд▓рд╛рдИ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдкрдорд╛ рд▓реЗрдЦреНрди рд╕рдХреНрджреИрдиред

рдпреЛ рдЧрд░реНрди рд╣рд╛рдореАрд▓реЗ рд╕рдХреНрд╖рдо рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдХреНрд░рдордмрджреНрдз рдЧрд░реНрди рдорд┐рд▓реНрдиреЗ-рд╣рд╛рдореНрд░реЛ рд▓реЗрдирджреЗрдирдХреЛ рд▓рд╛рдЧрд┐ рдЕрд▓рдЧрд╛рд╡ (рд╣реЛ, рдпрд╣рд╛рдБ рд╣рд╛рдореА рд▓реЗрдирджреЗрди рд╕реБрд░реБ рдЧрд░реНрдЫреМрдВ) рд░ рдЯреЗрдмрд▓рд▓рд╛рдИ "рдХрд╕рд┐рд▓реЛ" рд▓рдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

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

рдмреНрд▓рдХрд┐рдЩрдХреЛ рдпреЛ рд╕реНрддрд░ рд╣рд╛рдореАрд▓реЗ рдпрд╕рдорд╛ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрди рдЪрд╛рд╣рдиреЗ рдХрд╛рд░реНрдпрд╣рд░реВрджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░рд┐рдиреНрдЫред

#4: рдЪрд╛рд╕реЛрдХреЛ рджреНрд╡рдиреНрджреНрд╡

рд╣рд╛рдореА рдпрд╣рд╛рдБ рдЖрдЙрдБрдЫреМрдВ рд░ рдЪрд┐рдиреНрд╣ "рд▓рдХ" рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВ - рдпрджрд┐ рдХреЛрд╣реА рддреНрдпрд╕ рдХреНрд╖рдгрдорд╛ рд╕рдХреНрд░рд┐рдп рдерд┐рдпреЛ рднрдиреЗ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдпрд╕рдмрд╛рдЯ рдкрдвреНрджреИ? рд╣рд╛рдореА рдпреЛ рдмреНрд▓рдХ рд░рд┐рд▓рд┐рдЬ рд╣реБрдирдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдЦрд╛рдЗрдорд╛ "рд╣реНрдпрд╛рдЩ" рдЧрд░реНрдиреЗрдЫреМрдВ, рд░ рдкрдвреНрди рдЪрд╛рд╣рдиреЗ рдЕрд░реВрд╣рд░реВ рд╣рд╛рдореАрдорд╛ рджреМрдбрдиреЗрдЫрдиреН...

рдпреЛ рд╣реБрдирдмрд╛рдЯ рд░реЛрдХреНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореА "рдЖрдлреИрд▓рд╛рдИ рдмрд▓рд┐рджрд╛рди" рджрд┐рдиреЗрдЫреМрдВ - рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рдирд┐рд╢реНрдЪрд┐рдд (рд╕реНрд╡реАрдХреГрдд рд░реВрдкрдорд╛ рдЫреЛрдЯреЛ) рд╕рдордп рднрд┐рддреНрд░ рд▓рдХ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдЕрд╕рдорд░реНрде рдерд┐рдпреМрдВ рднрдиреЗ, рд╣рд╛рдореАрд▓реЗ рдЖрдзрд╛рд░рдмрд╛рдЯ рдЕрдкрд╡рд╛рдж рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗрдЫреМрдВ, рддрд░ рдХрдореНрддрд┐рдорд╛ рд╣рд╛рдореА рдзреЗрд░реИ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдЧрд░реНрджреИрдиреМрдВред рдЕрд░реВред

рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╕рддреНрд░ рдЪрд░ рд╕реЗрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН lock_timeout (рд╕рдВрд╕реНрдХрд░рдг реп.рей+ рдХреЛ рд▓рд╛рдЧрд┐) рд╡рд╛/рд░ рд╕реНрдЯреЗрдЯрдореЗрдиреНрдЯ_рдЯрд╛рдЗрдордЖрдЙрдЯред рдпрд╛рдж рдЧрд░реНрди рдореБрдЦреНрдп рдХреБрд░рд╛ рдпреЛ рд╣реЛ рдХрд┐ рд╕реНрдЯреЗрдЯрдореЗрдиреНрдЯ_рдЯрд╛рдЗрдордЖрдЙрдЯ рдорд╛рди рдорд╛рддреНрд░ рдЕрд░реНрдХреЛ рдХрдердирдмрд╛рдЯ рд▓рд╛рдЧреВ рд╣реБрдиреНрдЫред рддреНрдпреЛ рд╣реЛ, рдЧреНрд▓реБрдЗрдВрдЧрдорд╛ рдпрд╕рд░реА - рдХрд╛рдо рдЧрд░реНрджреИрди:

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

рдЪрд░рдХреЛ "рдкреБрд░рд╛рдиреЛ" рдорд╛рдирд▓рд╛рдИ рдкрдЫрд┐ рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рдирдкрд░реНрдиреЗ рдХреНрд░рдордорд╛, рд╣рд╛рдореА рдлрд╛рд░рдо рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВ рд╕реНрдерд╛рдиреАрдп рд╕реЗрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдЬрд╕рд▓реЗ рд╣рд╛рд▓рдХреЛ рд▓реЗрдирджреЗрдирдорд╛ рд╕реЗрдЯрд┐рдЩрдХреЛ рджрд╛рдпрд░рд╛ рд╕реАрдорд┐рдд рдЧрд░реНрджрдЫред

рд╣рд╛рдореА рд╕рдореНрдЭрдиреНрдЫреМрдВ рдХрд┐ рд╕реНрдЯреЗрдЯрдореЗрдиреНрдЯ_рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕рдмреИ рдкрдЫрд┐рдХрд╛ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдорд╛ рд▓рд╛рдЧреВ рд╣реБрдиреНрдЫ рддрд╛рдХрд┐ рддрд╛рд▓рд┐рдХрд╛рдорд╛ рдзреЗрд░реИ рдбрд╛рдЯрд╛ рдЫ рднрдиреЗ рд▓реЗрдирджреЗрди рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рдорд╛рдирд╣рд░реВрдорд╛ рдлреИрд▓рд┐рди рд╕рдХреНрджреИрдиред

#5: рдбрд╛рдЯрд╛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрдиреБрд╣реЛрд╕реН

рдпрджрд┐ рддрд╛рд▓рд┐рдХрд╛ рдкреВрд░реНрдг рд░реВрдкрдорд╛ рдЦрд╛рд▓реА рдЫреИрди рднрдиреЗ, рдбрд╛рдЯрд╛рд▓рд╛рдИ рд╕рд╣рд╛рдпрдХ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкреБрди: рдмрдЪрдд рдЧрд░реНрдиреБрдкрд░реНрдиреЗрдЫ:

CREATE TEMPORARY TABLE _tmp_swap ON COMMIT DROP AS TABLE tbl;

рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрдорд┐рдЯ рдбреНрд░рдкрдорд╛ рдпрд╕рдХреЛ рдорддрд▓рдм рд▓реЗрдирджреЗрди рд╕рдорд╛рдкреНрдд рд╣реБрдиреЗ рдХреНрд╖рдгрдорд╛, рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛рдХреЛ рдЕрд╕реНрддрд┐рддреНрд╡ рд╕рдорд╛рдкреНрдд рд╣реБрдиреЗрдЫ, рд░ рдЬрдбрд╛рди рд╕рдиреНрджрд░реНрднрдорд╛ рдпрд╕рд▓рд╛рдИ рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рдореЗрдЯрд╛рдЙрди рдЖрд╡рд╢реНрдпрдХ рдЫреИрдиред

рд╣рд╛рдореАрд▓реЗ рдзреЗрд░реИ "рдкреНрд░рддреНрдпрдХреНрд╖" рдбрд╛рдЯрд╛ рдирднрдПрдХреЛ рдЕрдиреБрдорд╛рди рдЧрд░реЗрдХреЛрд▓реЗ, рдпреЛ рдЕрдкрд░реЗрд╢рди рдПрдХрджрдо рдЪрд╛рдБрдбреЛ рд╣реБрдиреБрдкрд░реНрджрдЫред

рдЦреИрд░, рдпреЛ рд╕рдмреИ рд╣реЛ! рд▓реЗрдирджреЗрди рдкреВрд░рд╛ рдЧрд░реЗрдкрдЫрд┐ рдирдмрд┐рд░реНрд╕рдиреБрд╣реЛрд╕реН рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН рдЖрд╡рд╢реНрдпрдХ рднрдПрдорд╛ рддрд╛рд▓рд┐рдХрд╛ рддрдереНрдпрд╛рдЩреНрдХрд▓рд╛рдИ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдЙрдиред

рдЕрдиреНрддрд┐рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдБрдЧреИ рд░рд╛рдЦреНрджреИ

рд╣рд╛рдореА рдпреЛ "рд╕реНрдпреВрдбреЛ-рдкрд╛рдЗрдерди" рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВ:

# ╤Б╨╛╨▒╨╕╤А╨░╨╡╨╝ ╤Б╤В╨░╤В╨╕╤Б╤В╨╕╨║╤Г ╤Б ╤В╨░╨▒╨╗╨╕╤Ж╤Л
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 рдкрдХреНрд╖ рд╡рд╛ FK DB рдкрдХреНрд╖рдмрд╛рдЯ рдХреБрдиреИ рдЕрдиреНрдп рдЧрддрд┐рд╡рд┐рдзрд┐рд╣рд░реВрд╕рдБрдЧ рдмрд╛рдБрдзрд┐рдПрдХреЛ рдЫреИрди рднрдиреЗ:

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

рд╕реНрд░реЛрдд рддрд╛рд▓рд┐рдХрд╛рдорд╛ рд▓рд┐рдкрд┐ рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН рд░ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдЬрд╛рдБрдЪ рдЧрд░реМрдВ:

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

рд╕рдмреИ рдХрд╛рдо рднрдпреЛ! рддрд╛рд▓рд┐рдХрд╛ релреж рдкрдЯрдХ рд╕рдВрдХреБрдЪрд┐рдд рднрдПрдХреЛ рдЫ рд░ рд╕рдмреИ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХрд╣рд░реВ рдлреЗрд░рд┐ рдЫрд┐рдЯреЛ рдЪрд▓рд┐рд░рд╣реЗрдХрд╛ рдЫрдиреНред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди