แƒ แƒแƒ“แƒ”แƒกแƒแƒช VACUUM แƒ•แƒ”แƒ  แƒฎแƒ”แƒ แƒฎแƒ“แƒ”แƒ‘แƒ, แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒกแƒฃแƒคแƒ—แƒแƒ•แƒ”แƒ‘แƒ— แƒ›แƒแƒ’แƒ˜แƒ“แƒแƒก แƒฎแƒ”แƒšแƒ˜แƒ—

แƒ•แƒแƒ™แƒฃแƒฃแƒ›แƒ˜ แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ PostgreSQL-แƒ˜แƒก แƒชแƒฎแƒ แƒ˜แƒšแƒ˜แƒ“แƒแƒœ โ€žแƒ’แƒแƒฌแƒ›แƒ”แƒœแƒ“แƒโ€œ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ แƒ แƒ•แƒ”แƒ แƒแƒ•แƒ˜แƒœ แƒฎแƒ”แƒ“แƒแƒ•แƒก - แƒแƒœแƒฃ, แƒแƒ  แƒแƒ แƒ˜แƒก แƒแƒ แƒช แƒ”แƒ แƒ—แƒ˜ แƒแƒฅแƒขแƒ˜แƒฃแƒ แƒ˜ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ“แƒแƒ˜แƒฌแƒงแƒ แƒแƒ› แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒชแƒ•แƒšแƒแƒ›แƒ“แƒ”.

แƒ›แƒแƒ’แƒ แƒแƒ› แƒ แƒ แƒ›แƒแƒฎแƒ“แƒ”แƒ‘แƒ, แƒ—แƒฃ แƒแƒกแƒ”แƒ—แƒ˜ แƒฃแƒกแƒ˜แƒแƒ›แƒแƒ•แƒœแƒ แƒขแƒ˜แƒžแƒ˜ (แƒ’แƒ แƒซแƒ”แƒšแƒ•แƒแƒ“แƒ˜แƒแƒœแƒ˜ OLAP แƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ OLTP แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒ–แƒ”) แƒฏแƒ”แƒ  แƒ™แƒ˜แƒ“แƒ”แƒ• แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก? แฒ แƒแƒ’แƒแƒ  แƒกแƒฃแƒคแƒ—แƒ แƒแƒฅแƒขแƒ˜แƒฃแƒ แƒแƒ“ แƒ’แƒแƒ›แƒแƒกแƒแƒชแƒ•แƒšแƒ”แƒšแƒ˜ แƒ›แƒแƒ’แƒ˜แƒ“แƒ แƒ’แƒแƒ แƒจแƒ”แƒ›แƒแƒ แƒขแƒงแƒ›แƒฃแƒšแƒ˜ แƒฎแƒแƒ แƒ— แƒ’แƒ แƒซแƒ”แƒšแƒ˜ แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒ˜แƒ— แƒ“แƒ แƒแƒ  แƒ“แƒแƒแƒ‘แƒ˜แƒฏแƒ”แƒ‘แƒ— แƒ แƒแƒ™แƒ˜?

แƒ แƒแƒ“แƒ”แƒกแƒแƒช 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 แƒฌแƒแƒ›แƒ˜ แƒ‘แƒแƒšแƒ [แƒแƒ•แƒขแƒ]แƒ•แƒแƒ™แƒฃแƒฃแƒ›แƒ˜แƒ“แƒแƒœ.
  • แƒคแƒ˜แƒ–แƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ›แƒแƒ’แƒ˜แƒ“แƒ˜แƒก แƒ–แƒแƒ›แƒ แƒกแƒแƒ›แƒ˜แƒ–แƒœแƒ”แƒ–แƒ” แƒ“แƒ˜แƒ“แƒ˜แƒ
    แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒœแƒ•แƒกแƒแƒ–แƒฆแƒ•แƒ แƒแƒ— แƒ แƒแƒ’แƒแƒ แƒช แƒแƒ แƒฏแƒ”แƒ  แƒ›แƒ”แƒขแƒ˜ แƒ’แƒ•แƒ”แƒ แƒ“แƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ (8KB แƒ‘แƒšแƒแƒ™แƒ”แƒ‘แƒ˜) แƒ›แƒ˜แƒœแƒ˜แƒ›แƒแƒšแƒฃแƒ  แƒ–แƒแƒ›แƒแƒกแƒ—แƒแƒœ แƒจแƒ”แƒ“แƒแƒ แƒ”แƒ‘แƒ˜แƒ— - 1 แƒ‘แƒšแƒ™แƒ˜ แƒ’แƒ แƒแƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก + 1 แƒ‘แƒšแƒ™แƒ˜ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก - แƒžแƒแƒขแƒ”แƒœแƒชแƒ˜แƒฃแƒ แƒแƒ“ แƒชแƒแƒ แƒ˜แƒ”แƒšแƒ˜ แƒ›แƒแƒ’แƒ˜แƒ“แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ—แƒฃ แƒฉแƒ•แƒ”แƒœ แƒ•แƒ”แƒšแƒ˜แƒ—, แƒ แƒแƒ› แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒšแƒ˜ แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒ“แƒแƒ แƒฉแƒ”แƒ‘แƒ แƒ‘แƒฃแƒคแƒ”แƒ แƒจแƒ˜ โ€žแƒœแƒแƒ แƒ›แƒแƒšแƒฃแƒ แƒแƒ“โ€œ, แƒ›แƒ˜แƒ–แƒแƒœแƒจแƒ”แƒฌแƒแƒœแƒ˜แƒšแƒ˜แƒ แƒแƒ› แƒคแƒแƒ แƒ›แƒฃแƒšแƒ˜แƒก แƒจแƒ”แƒกแƒฌแƒแƒ แƒ”แƒ‘แƒ.

แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ

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 (9.3+ แƒ•แƒ”แƒ แƒกแƒ˜แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก) แƒแƒœ/แƒ“แƒ แƒ’แƒแƒœแƒชแƒฎแƒแƒ“แƒ”แƒ‘แƒ_แƒ“แƒ แƒแƒ˜แƒ›แƒ˜. แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜แƒ แƒ’แƒ•แƒแƒฎแƒกแƒแƒ•แƒ“แƒ”แƒก, แƒ แƒแƒ› statement_timeout แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒ“แƒ”แƒ‘แƒฃแƒšแƒ”แƒ‘แƒ˜แƒ“แƒแƒœ. แƒแƒœแƒฃ แƒฌแƒ”แƒ‘แƒแƒ•แƒแƒœแƒแƒจแƒ˜ แƒแƒกแƒ” - แƒแƒ  แƒ˜แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒก:

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

แƒ˜แƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ› แƒ›แƒแƒ’แƒ•แƒ˜แƒแƒœแƒ”แƒ‘แƒ˜แƒ— แƒแƒ  แƒ’แƒ•แƒฅแƒแƒœแƒ“แƒ”แƒก แƒกแƒแƒฅแƒ›แƒ” แƒชแƒ•แƒšแƒแƒ“แƒ˜แƒก โ€žแƒซแƒ•แƒ”แƒšแƒ˜โ€œ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ˜แƒก แƒแƒฆแƒ“แƒ’แƒ”แƒœแƒแƒกแƒ—แƒแƒœ, แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒคแƒแƒ แƒ›แƒแƒก แƒแƒ“แƒ’แƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ•แƒ˜แƒก แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ–แƒฆแƒฃแƒ“แƒแƒ•แƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜แƒก แƒคแƒแƒ แƒ’แƒšแƒ”แƒ‘แƒก แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒแƒ›แƒ“แƒ”.

แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒแƒฎแƒกแƒแƒ•แƒก, แƒ แƒแƒ› statement_timeout แƒ•แƒ แƒชแƒ”แƒšแƒ“แƒ”แƒ‘แƒ แƒงแƒ•แƒ”แƒšแƒ แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ› แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒ–แƒ”, แƒ˜แƒกแƒ” แƒ แƒแƒ› แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒ แƒแƒ  แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ˜แƒ–แƒแƒ แƒ“แƒแƒก แƒ›แƒ˜แƒฃแƒฆแƒ”แƒ‘แƒ”แƒš แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ”แƒ‘แƒแƒ›แƒ“แƒ”, แƒ—แƒฃ แƒชแƒฎแƒ แƒ˜แƒšแƒจแƒ˜ แƒ‘แƒ”แƒ•แƒ แƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ˜แƒ.

#5: แƒ“แƒแƒแƒ™แƒแƒžแƒ˜แƒ แƒ”แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜

แƒ—แƒฃ แƒชแƒฎแƒ แƒ˜แƒšแƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก แƒ›แƒ—แƒšแƒ˜แƒแƒœแƒแƒ“ แƒชแƒแƒ แƒ˜แƒ”แƒšแƒ˜, แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒฎแƒ”แƒšแƒแƒฎแƒšแƒ แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒ˜แƒœแƒแƒฎแƒแƒก แƒ“แƒแƒ›แƒฎแƒ›แƒแƒ แƒ” แƒ“แƒ แƒแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒชแƒฎแƒ แƒ˜แƒšแƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—:

CREATE TEMPORARY TABLE _tmp_swap ON COMMIT DROP AS TABLE tbl;

แƒฎแƒ”แƒšแƒ›แƒแƒฌแƒ”แƒ แƒ ON COMIT DROP แƒœแƒ˜แƒจแƒœแƒแƒ•แƒก, แƒ แƒแƒ› แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒ˜แƒก แƒ“แƒแƒกแƒแƒกแƒ แƒฃแƒšแƒก แƒ“แƒ แƒแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒชแƒฎแƒ แƒ˜แƒšแƒ˜ แƒจแƒ”แƒฌแƒงแƒ•แƒ”แƒขแƒก แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒแƒก แƒ“แƒ แƒแƒ  แƒแƒ แƒ˜แƒก แƒกแƒแƒญแƒ˜แƒ แƒ แƒ›แƒ˜แƒกแƒ˜ แƒฎแƒ”แƒšแƒ˜แƒ— แƒฌแƒแƒจแƒšแƒ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒ™แƒแƒœแƒขแƒ”แƒฅแƒกแƒขแƒจแƒ˜.

แƒ•แƒ˜แƒœแƒแƒ˜แƒ“แƒแƒœ แƒฉแƒ•แƒ”แƒœ แƒ•แƒ•แƒแƒ แƒแƒฃแƒ“แƒแƒ‘แƒ—, แƒ แƒแƒ› แƒแƒ  แƒแƒ แƒ˜แƒก แƒ‘แƒ”แƒ•แƒ แƒ˜ โ€žแƒชแƒแƒชแƒฎแƒแƒšแƒ˜โ€œ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ˜, แƒ”แƒก แƒแƒžแƒ”แƒ แƒแƒชแƒ˜แƒ แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒกแƒฌแƒ แƒแƒคแƒแƒ“ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ“แƒ”แƒก.

แƒแƒ‘แƒ, แƒกแƒฃแƒš แƒ”แƒกแƒแƒ! แƒแƒ  แƒ“แƒแƒ’แƒแƒ•แƒ˜แƒฌแƒงแƒ“แƒ”แƒ— แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒ˜แƒก แƒ“แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ’แƒแƒฃแƒจแƒ•แƒ˜แƒ— ANALYZE แƒกแƒแƒญแƒ˜แƒ แƒแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒชแƒฎแƒ แƒ˜แƒšแƒ˜แƒก แƒกแƒขแƒแƒขแƒ˜แƒกแƒขแƒ˜แƒ™แƒ˜แƒก แƒœแƒแƒ แƒ›แƒแƒšแƒ˜แƒ–แƒ”แƒ‘แƒ.

แƒกแƒแƒ‘แƒแƒšแƒแƒ แƒกแƒชแƒ”แƒœแƒแƒ แƒ˜แƒก แƒจแƒ”แƒ“แƒ’แƒ”แƒœแƒ

แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒแƒ› "แƒคแƒกแƒ”แƒ•แƒ“แƒ-แƒžแƒ˜แƒ—แƒแƒœแƒก":

# ัะพะฑะธั€ะฐะตะผ ัั‚ะฐั‚ะธัั‚ะธะบัƒ ั ั‚ะฐะฑะปะธั†ั‹
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;

แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ—แƒฃ แƒแƒ แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ”แƒแƒ แƒ”แƒ“ แƒ“แƒแƒ™แƒแƒžแƒ˜แƒ แƒ”แƒ‘แƒ?แƒžแƒ แƒ˜แƒœแƒชแƒ˜แƒžแƒจแƒ˜, แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ, แƒ—แƒฃ แƒ—แƒแƒ•แƒแƒ“ แƒชแƒฎแƒ แƒ˜แƒšแƒ˜แƒก แƒแƒ˜แƒ“แƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก แƒ›แƒ˜แƒ‘แƒ›แƒฃแƒšแƒ˜ แƒกแƒฎแƒ•แƒ แƒแƒฅแƒขแƒ˜แƒ•แƒแƒ‘แƒ”แƒ‘แƒ—แƒแƒœ 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

แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒ“แƒ! แƒชแƒฎแƒ แƒ˜แƒšแƒ˜ 50-แƒฏแƒ”แƒ  แƒจแƒ”แƒ›แƒชแƒ˜แƒ แƒ“แƒ แƒ“แƒ แƒงแƒ•แƒ”แƒšแƒ แƒ’แƒแƒœแƒแƒฎแƒšแƒ”แƒ‘แƒ แƒ˜แƒกแƒ”แƒ• แƒกแƒฌแƒ แƒแƒคแƒแƒ“ แƒ’แƒแƒ“แƒ˜แƒก.

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ