āĻ­ā§āĻ¯āĻžāĻ•ā§āĻ¯āĻŧāĻžāĻŽ āĻŦā§āĻ¯āĻ°ā§āĻĨ āĻšāĻ˛ā§‡, āĻ†āĻŽāĻ°āĻž āĻŸā§‡āĻŦāĻŋāĻ˛āĻŸāĻŋ āĻŽā§āĻ¯āĻžāĻ¨ā§āĻ¯āĻŧāĻžāĻ˛āĻŋ āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ° āĻ•āĻ°āĻŋ

āĻļā§‚āĻ¨ā§āĻ¯āĻ¸ā§āĻĨāĻžāĻ¨ PostgreSQL-āĻ āĻāĻ•āĻŸāĻŋ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻĨā§‡āĻ•ā§‡ "āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ°" āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ•āĻŋ āĻ•ā§‡āĻ‰ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻ¨āĻž - āĻ…āĻ°ā§āĻĨāĻžā§Ž, āĻāĻ‡ āĻ°ā§‡āĻ•āĻ°ā§āĻĄāĻ—ā§āĻ˛āĻŋ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻžāĻ° āĻ†āĻ—ā§‡ āĻļā§āĻ°ā§ āĻšāĻ“āĻ¯āĻŧāĻž āĻāĻ•āĻŸāĻŋ āĻ¸āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻ¨ā§‡āĻ‡āĨ¤

āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¯āĻĻāĻŋ āĻāĻŽāĻ¨ āĻāĻ•āĻŸāĻŋ āĻ…āĻĒā§āĻ°ā§€āĻ¤āĻŋāĻ•āĻ° āĻĒā§āĻ°āĻ•āĻžāĻ° (āĻāĻ•āĻŸāĻŋ OLTP āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡ āĻĻā§€āĻ°ā§āĻ˜āĻŽā§‡āĻ¯āĻŧāĻžāĻĻā§€ OLAP āĻ˛ā§‹āĻĄ) āĻāĻ–āĻ¨āĻ“ āĻŦāĻŋāĻĻā§āĻ¯āĻŽāĻžāĻ¨ āĻĨāĻžāĻ•ā§‡? āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ¸āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻ­āĻžāĻŦā§‡ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ° āĻĻā§€āĻ°ā§āĻ˜ āĻĒā§āĻ°āĻļā§āĻ¨ āĻĻā§āĻŦāĻžāĻ°āĻž āĻŦā§‡āĻˇā§āĻŸāĻŋāĻ¤ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻ°ā§‡āĻ• āĻ‰āĻĒāĻ° āĻĒāĻž āĻ¨āĻž?

āĻ­ā§āĻ¯āĻžāĻ•ā§āĻ¯āĻŧāĻžāĻŽ āĻŦā§āĻ¯āĻ°ā§āĻĨ āĻšāĻ˛ā§‡, āĻ†āĻŽāĻ°āĻž āĻŸā§‡āĻŦāĻŋāĻ˛āĻŸāĻŋ āĻŽā§āĻ¯āĻžāĻ¨ā§āĻ¯āĻŧāĻžāĻ˛āĻŋ āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ° āĻ•āĻ°āĻŋ

āĻ°ā§‡āĻ• āĻŦāĻŋāĻ›āĻŋāĻ¯āĻŧā§‡

āĻĒā§āĻ°āĻĨāĻŽā§‡, āĻ†āĻ¸ā§āĻ¨ āĻ†āĻŽāĻ°āĻž āĻ¯ā§‡ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻŸāĻŋ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ‡ āĻ¤āĻž āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ āĻ•āĻ°āĻž āĻ¯āĻžāĻ• āĻāĻŦāĻ‚ āĻāĻŸāĻŋ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤ āĻāĻ‡ āĻĒāĻ°āĻŋāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋ āĻ˜āĻŸā§‡ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻžāĻ•ā§ƒāĻ¤ āĻ›ā§‹āĻŸ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¯āĻž āĻāĻŸāĻŋ āĻ˜āĻŸā§‡ āĻ…āĻ¨ā§‡āĻ• āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨. āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤ āĻāĻ‡ āĻŦāĻž āĻ­āĻŋāĻ¨ā§āĻ¨ āĻŽāĻŋāĻŸāĻžāĻ°/āĻ¸āĻŽāĻˇā§āĻŸāĻŋ/āĻ°ā§‡āĻŸāĻŋāĻ‚, āĻ¯āĻžāĻ° āĻ‰āĻĒāĻ° āĻĒā§āĻ°āĻžāĻ¯āĻŧāĻ‡ āĻ†āĻĒāĻĄā§‡āĻŸ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ, āĻŦāĻž āĻŦāĻžāĻĢāĻžāĻ°-āĻ¸āĻžāĻ°āĻŋ āĻ•āĻŋāĻ›ā§ āĻ•ā§āĻ°āĻŽāĻžāĻ—āĻ¤ āĻšāĻ˛āĻŽāĻžāĻ¨ āĻ‡āĻ­ā§‡āĻ¨ā§āĻŸā§‡āĻ° āĻ¸ā§āĻŸā§āĻ°āĻŋāĻŽ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ¯āĻžāĻ° āĻ°ā§‡āĻ•āĻ°ā§āĻĄāĻ—ā§āĻ˛āĻŋ āĻ•ā§āĻ°āĻŽāĻžāĻ—āĻ¤ āĻ¸āĻ¨ā§āĻ¨āĻŋāĻŦā§‡āĻļ/āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻž āĻšāĻ¯āĻŧāĨ¤

āĻ†āĻ¸ā§āĻ¨ āĻ°ā§‡āĻŸāĻŋāĻ‚ āĻ¸āĻš āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāĻŸāĻŋ āĻĒā§āĻ¨āĻ°ā§āĻ¤ā§āĻĒāĻžāĻĻāĻ¨ āĻ•āĻ°āĻžāĻ° āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°āĻŋ:

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

āĻ“āĻš, āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻ•āĻŋāĻ›ā§ āĻ¨ā§‡āĻ‡! āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻšāĻ˛āĻŽāĻžāĻ¨ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻšāĻ¸ā§āĻ¤āĻ•ā§āĻˇā§‡āĻĒ āĻ•āĻ°āĻ›ā§‡ - āĻ¸āĻ°ā§āĻŦā§‹āĻĒāĻ°āĻŋ, āĻ¤āĻŋāĻ¨āĻŋ āĻ•ā§‹āĻ¨āĻ“ āĻĻāĻŋāĻ¨ āĻāĻ‡ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖāĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻĢāĻŋāĻ°ā§‡ āĻ¯ā§‡āĻ¤ā§‡ āĻšāĻžāĻ‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ (āĻ•āĻŋ āĻšāĻ˛ā§‡?), āĻāĻŦāĻ‚ āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋ āĻ¤āĻžāĻ° āĻ•āĻžāĻ›ā§‡ āĻĒāĻžāĻ“āĻ¯āĻŧāĻž āĻ‰āĻšāĻŋāĻ¤āĨ¤ āĻāĻŦāĻ‚ āĻ¤āĻžāĻ‡ āĻ­ā§āĻ¯āĻžāĻ•ā§āĻ¯āĻŧāĻžāĻŽ āĻĢā§āĻ˛āĻ“ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ āĻ•āĻ°āĻŦā§‡ āĻ¨āĻžāĨ¤

āĻŸā§‡āĻŦāĻŋāĻ˛ "āĻĒāĻ¤āĻ¨"

āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ†āĻŽāĻ°āĻž āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤āĻ­āĻžāĻŦā§‡ āĻœāĻžāĻ¨āĻŋ āĻ¯ā§‡ āĻ¸ā§‡āĻ‡ āĻĒā§āĻ°āĻļā§āĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ¨ā§‡āĻ‡āĨ¤ āĻ…āĻ¤āĻāĻŦ, āĻ†āĻŽāĻ°āĻž āĻāĻ–āĻ¨āĻ“ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻĨā§‡āĻ•ā§‡ āĻ…āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻŦāĻžāĻĻ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āĻ° āĻ•āĻ°ā§āĻŽāĻ•ā§āĻˇāĻŽāĻ¤āĻžāĻ•ā§‡ āĻĒāĻ°ā§āĻ¯āĻžāĻĒā§āĻ¤ āĻ¸ā§€āĻŽāĻžāĻ¤ā§‡ āĻĢāĻŋāĻ°āĻŋāĻ¯āĻŧā§‡ āĻĻā§‡āĻ“āĻ¯āĻŧāĻžāĻ° āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°āĻŦ - āĻ…āĻ¨ā§āĻ¤āĻ¤ "āĻŽā§āĻ¯āĻžāĻ¨ā§āĻ¯āĻŧāĻžāĻ˛āĻŋ", āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ­ā§āĻ¯āĻžāĻ•ā§āĻ¯āĻŧāĻžāĻŽ āĻšāĻžāĻ˛ āĻ›ā§‡āĻĄāĻŧā§‡ āĻĻā§‡āĻ¯āĻŧāĨ¤

āĻāĻŸāĻŋ āĻ†āĻ°āĻ“ āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻ¸ā§āĻ¨ āĻāĻ•āĻŸāĻŋ āĻŦāĻžāĻĢāĻžāĻ° āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡āĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻŸāĻŋ āĻĻā§‡āĻ–āĻŋāĨ¤ āĻ…āĻ°ā§āĻĨāĻžā§Ž, INSERT/DELETE āĻāĻ° āĻāĻ•āĻŸāĻŋ āĻŦāĻĄāĻŧ āĻĒā§āĻ°āĻŦāĻžāĻš āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ āĻāĻŦāĻ‚ āĻ•āĻ–āĻ¨āĻ“ āĻ•āĻ–āĻ¨āĻ“ āĻŸā§‡āĻŦāĻŋāĻ˛āĻŸāĻŋ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ–āĻžāĻ˛āĻŋ āĻĨāĻžāĻ•ā§‡ā§ˇ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¯āĻĻāĻŋ āĻāĻŸāĻž āĻ–āĻžāĻ˛āĻŋ āĻ¨āĻž āĻšāĻ¯āĻŧ, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻšāĻŦā§‡ āĻāĻ° āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°ā§āĻ¨.

#0: āĻĒāĻ°āĻŋāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋ āĻŽā§‚āĻ˛ā§āĻ¯āĻžāĻ¯āĻŧāĻ¨

āĻāĻŸāĻž āĻ¸ā§āĻĒāĻˇā§āĻŸ āĻ¯ā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ…āĻĒāĻžāĻ°ā§‡āĻļāĻ¨ā§‡āĻ° āĻĒāĻ°ā§‡āĻ“ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻŋāĻ›ā§ āĻ•āĻ°āĻžāĻ° āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨, āĻ¤āĻŦā§‡ āĻāĻŸāĻŋ āĻ–ā§āĻŦ āĻŦā§‡āĻļāĻŋ āĻ…āĻ°ā§āĻĨāĻŦā§‹āĻ§ āĻ•āĻ°ā§‡ āĻ¨āĻž - āĻ°āĻ•ā§āĻˇāĻŖāĻžāĻŦā§‡āĻ•ā§āĻˇāĻŖ āĻ“āĻ­āĻžāĻ°āĻšā§‡āĻĄ āĻŸāĻžāĻ°ā§āĻ—ā§‡āĻŸ āĻ•ā§‹āĻ¯āĻŧā§‡āĻ°āĻŋāĻ° āĻĨā§āĻ°ā§āĻĒā§āĻŸ āĻĨā§‡āĻ•ā§‡ āĻ¸ā§āĻĒāĻˇā§āĻŸāĻ¤āĻ‡ āĻŦā§‡āĻļāĻŋ āĻšāĻŦā§‡āĨ¤

āĻ†āĻ¸ā§āĻ¨ āĻŽāĻžāĻ¨āĻĻāĻŖā§āĻĄ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŋ - "āĻāĻŸāĻŋ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ" āĻ¯āĻĻāĻŋ:

  • VACUUM āĻŦā§‡āĻļ āĻ…āĻ¨ā§‡āĻ• āĻĻāĻŋāĻ¨ āĻ†āĻ—ā§‡ āĻšāĻžāĻ˛ā§ āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛
    āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻ­āĻžāĻ°ā§€ āĻ˛ā§‹āĻĄ āĻ†āĻļāĻž āĻ•āĻ°āĻŋ, āĻ¤āĻžāĻ‡ āĻāĻŸāĻŋ āĻšāĻ¤ā§‡ āĻĻāĻŋāĻ¨ 60 āĻ¸ā§‡āĻ•ā§‡āĻ¨ā§āĻĄ āĻļā§‡āĻˇ [āĻ…āĻŸā§‹]āĻ­ā§āĻ¯āĻžāĻ•ā§āĻ¯āĻŧāĻžāĻŽ āĻĨā§‡āĻ•ā§‡āĨ¤
  • āĻļāĻžāĻ°ā§€āĻ°āĻŋāĻ• āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡āĻ° āĻ†āĻ•āĻžāĻ° āĻ˛āĻ•ā§āĻˇā§āĻ¯ā§‡āĻ° āĻšā§‡āĻ¯āĻŧā§‡ āĻŦāĻĄāĻŧ
    āĻ†āĻ¸ā§āĻ¨ āĻāĻŸāĻŋāĻ•ā§‡ āĻ¨ā§āĻ¯ā§‚āĻ¨āĻ¤āĻŽ āĻ†āĻ•āĻžāĻ°ā§‡āĻ° āĻ¤ā§āĻ˛āĻ¨āĻžāĻ¯āĻŧ āĻĻā§āĻŦāĻŋāĻ—ā§āĻŖ āĻĒā§ƒāĻˇā§āĻ āĻžāĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž (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: āĻāĻ–āĻ¨āĻ“ āĻ­ā§āĻ¯āĻžāĻ•ā§āĻ¯āĻŧāĻžāĻŽ

āĻāĻ•āĻŸāĻŋ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻ•ā§āĻ¯ā§‹āĻ¯āĻŧāĻžāĻ°ā§€ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ–āĻ¯ā§‹āĻ—ā§āĻ¯āĻ­āĻžāĻŦā§‡ āĻšāĻ¸ā§āĻ¤āĻ•ā§āĻˇā§‡āĻĒ āĻ•āĻ°āĻ›ā§‡ āĻ•āĻŋāĻ¨āĻž āĻ¤āĻž āĻ†āĻŽāĻ°āĻž āĻ†āĻ—ā§‡ āĻĨā§‡āĻ•ā§‡ āĻœāĻžāĻ¨āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ āĻ¨āĻž - āĻāĻŸāĻŋ āĻļā§āĻ°ā§ āĻšāĻ“āĻ¯āĻŧāĻžāĻ° āĻĒāĻ° āĻĨā§‡āĻ•ā§‡ āĻ āĻŋāĻ• āĻ•āĻ¤āĻ—ā§āĻ˛āĻŋ āĻ°ā§‡āĻ•āĻ°ā§āĻĄ "āĻ¸ā§‡āĻ•ā§‡āĻ˛ā§‡" āĻšāĻ¯āĻŧā§‡ āĻ—ā§‡āĻ›ā§‡āĨ¤ āĻ…āĻ¤āĻāĻŦ, āĻ¯āĻ–āĻ¨ āĻ†āĻŽāĻ°āĻž āĻ•ā§‹āĻ¨āĻ“āĻ­āĻžāĻŦā§‡ āĻŸā§‡āĻŦāĻŋāĻ˛āĻŸāĻŋ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ•āĻ°āĻžāĻ° āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤ āĻ¨āĻŋāĻ¯āĻŧā§‡āĻ›āĻŋ, āĻ¯ā§‡ āĻ•ā§‹āĻ¨āĻ“ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĒā§āĻ°āĻĨāĻŽā§‡ āĻāĻŸāĻŋ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ° āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤ āĻļā§‚āĻ¨ā§āĻ¯āĻ¸ā§āĻĨāĻžāĻ¨ - āĻ­ā§āĻ¯āĻžāĻ•ā§āĻ¯āĻŧāĻžāĻŽ āĻĢā§āĻ˛ā§‡āĻ° āĻŦāĻŋāĻĒāĻ°ā§€āĻ¤ā§‡, āĻāĻŸāĻŋ āĻĒāĻĄāĻŧāĻž-āĻ˛ā§‡āĻ–āĻž āĻĄā§‡āĻŸāĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻž āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻšāĻ¸ā§āĻ¤āĻ•ā§āĻˇā§‡āĻĒ āĻ•āĻ°ā§‡ āĻ¨āĻžāĨ¤

āĻāĻ•āĻ‡ āĻ¸āĻŽāĻ¯āĻŧā§‡, āĻ†āĻŽāĻ°āĻž āĻ¯āĻž āĻ…āĻĒāĻ¸āĻžāĻ°āĻŖ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ‡ āĻ¤āĻžāĻ° āĻŦā§‡āĻļāĻŋāĻ°āĻ­āĻžāĻ—āĻ‡ āĻāĻŸāĻŋ āĻ…āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§‡ āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻšā§āĻ¯āĻžāĻ, āĻāĻŦāĻ‚ āĻāĻ‡ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡āĻ° āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻĒā§āĻ°āĻļā§āĻ¨āĻ—ā§āĻ˛āĻŋ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•āĻžāĻ›ā§‡ āĻ¯āĻžāĻŦā§‡ "āĻšāĻŸ āĻ•ā§āĻ¯āĻžāĻļā§‡" āĻĻā§āĻŦāĻžāĻ°āĻž, āĻ¯āĻž āĻ¤āĻžāĻĻā§‡āĻ° āĻ¸āĻŽāĻ¯āĻŧāĻ•āĻžāĻ˛ āĻ•āĻŽāĻŋāĻ¯āĻŧā§‡ āĻĻā§‡āĻŦā§‡ - āĻāĻŦāĻ‚ āĻ¸ā§‡āĻ‡āĻœāĻ¨ā§āĻ¯, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¸āĻžāĻ°ā§āĻ­āĻŋāĻ¸āĻŋāĻ‚ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻĻā§āĻŦāĻžāĻ°āĻž āĻ…āĻ¨ā§āĻ¯āĻĻā§‡āĻ° āĻŦā§āĻ˛āĻ• āĻ•āĻ°āĻžāĻ° āĻŽā§‹āĻŸ āĻ¸āĻŽāĻ¯āĻŧāĨ¤

#2: āĻ•ā§‡āĻ‰ āĻ•āĻŋ āĻŦāĻžāĻĄāĻŧāĻŋāĻ¤ā§‡ āĻ†āĻ›ā§‡āĻ¨?

āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡ āĻ†āĻĻā§Œ āĻ•āĻŋāĻ›ā§ āĻ†āĻ›ā§‡ āĻ•āĻŋāĻ¨āĻž āĻ¤āĻž āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž āĻ¯āĻžāĻ•:

TABLE tbl LIMIT 1;

āĻ¯āĻĻāĻŋ āĻāĻ•āĻŸāĻŋ āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻ…āĻŦāĻļāĻŋāĻˇā§āĻŸ āĻ¨āĻž āĻĨāĻžāĻ•ā§‡, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ†āĻŽāĻ°āĻž āĻ¸āĻšāĻœāĻ­āĻžāĻŦā§‡ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖā§‡ āĻ…āĻ¨ā§‡āĻ• āĻ•āĻŋāĻ›ā§ āĻŦāĻžāĻāĻšāĻžāĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ āĻŸā§āĻ°āĻžāĻ¨āĻ¸ā§‡āĻŸ:

āĻāĻŸāĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻļāĻ°ā§āĻ¤āĻšā§€āĻ¨ DELETE āĻ•āĻŽāĻžāĻ¨ā§āĻĄā§‡āĻ° āĻŽāĻ¤ā§‹ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡, āĻ¤āĻŦā§‡ āĻāĻŸāĻŋ āĻ…āĻ¨ā§‡āĻ• āĻĻā§āĻ°ā§āĻ¤ āĻ•āĻžāĻ°āĻŖ āĻāĻŸāĻŋ āĻ†āĻ¸āĻ˛ā§‡ āĻŸā§‡āĻŦāĻŋāĻ˛āĻ—ā§āĻ˛āĻŋ āĻ¸ā§āĻ•ā§āĻ¯āĻžāĻ¨ āĻ•āĻ°ā§‡ āĻ¨āĻžāĨ¤ āĻ¤āĻĻā§āĻĒāĻ°āĻŋ, āĻāĻŸāĻŋ āĻ…āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§‡ āĻĄāĻŋāĻ¸ā§āĻ•ā§‡āĻ° āĻ¸ā§āĻĨāĻžāĻ¨ āĻŽā§āĻ•ā§āĻ¤ āĻ•āĻ°ā§‡, āĻ¤āĻžāĻ‡ āĻĒāĻ°ā§‡ āĻ­ā§āĻ¯āĻžāĻ•ā§āĻ¯āĻŧāĻžāĻŽ āĻ…āĻĒāĻžāĻ°ā§‡āĻļāĻ¨ āĻ•āĻ°āĻžāĻ° āĻĻāĻ°āĻ•āĻžāĻ° āĻ¨ā§‡āĻ‡āĨ¤

āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ¸āĻŋāĻ•ā§‹āĻ¯āĻŧā§‡āĻ¨ā§āĻ¸ āĻ•āĻžāĻ‰āĻ¨ā§āĻŸāĻžāĻ° (āĻ°āĻŋāĻ¸ā§āĻŸāĻžāĻ°ā§āĻŸ āĻ†āĻ‡āĻĄā§‡āĻ¨ā§āĻŸāĻŋāĻŸāĻŋ) āĻ°āĻŋāĻ¸ā§‡āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻ•āĻŋāĻ¨āĻž āĻ¤āĻž āĻ†āĻĒāĻ¨āĻžāĻ° āĻ‰āĻĒāĻ° āĻ¨āĻŋāĻ°ā§āĻ­āĻ° āĻ•āĻ°ā§‡āĨ¤

#3: āĻ¸āĻŦāĻžāĻ‡ - āĻĒāĻžāĻ˛āĻž āĻ¨āĻŋāĻ¨!

āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻ…āĻ¤ā§āĻ¯āĻ¨ā§āĻ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻ¯ā§‹āĻ—āĻŋāĻ¤āĻžāĻŽā§‚āĻ˛āĻ• āĻĒāĻ°āĻŋāĻŦā§‡āĻļā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻŋ, āĻ¯āĻ–āĻ¨ āĻ†āĻŽāĻ°āĻž āĻāĻ–āĻžāĻ¨ā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻ›āĻŋ āĻ¯ā§‡ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡ āĻ•ā§‹āĻ¨ āĻāĻ¨ā§āĻŸā§āĻ°āĻŋ āĻ¨ā§‡āĻ‡, āĻ•ā§‡āĻ‰ āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡ āĻ¸ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ•āĻŋāĻ›ā§ āĻ˛āĻŋāĻ–ā§‡ āĻĨāĻžāĻ•āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻ‡ āĻ¤āĻĨā§āĻ¯ āĻšāĻžāĻ°āĻžāĻ¨ā§‹ āĻ‰āĻšāĻŋāĻ¤ āĻ¨āĻ¯āĻŧ, āĻ¤āĻžāĻ‡ āĻ•āĻŋ? āĻāĻŸāĻž āĻ āĻŋāĻ•, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¯ā§‡ āĻ•ā§‡āĻ‰ āĻāĻŸāĻž āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤ āĻ•āĻ°ā§‡ āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŦā§‡ āĻ¨āĻžāĨ¤

āĻāĻŸāĻŋ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¸āĻ•ā§āĻˇāĻŽ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¸āĻŋāĻ°āĻŋāĻ¯āĻŧāĻžāĻ˛āĻžāĻ‡āĻœā§‡āĻŦāĻ˛-āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻŦāĻŋāĻšā§āĻ›āĻŋāĻ¨ā§āĻ¨āĻ¤āĻž (āĻšā§āĻ¯āĻžāĻ, āĻāĻ–āĻžāĻ¨ā§‡ āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻļā§āĻ°ā§ āĻ•āĻ°āĻŋ) āĻāĻŦāĻ‚ āĻŸā§‡āĻŦāĻŋāĻ˛āĻŸāĻŋāĻ•ā§‡ "āĻ†āĻāĻŸāĻ¸āĻžāĻāĻŸāĻ­āĻžāĻŦā§‡" āĻ˛āĻ• āĻ•āĻ°āĻŋ:

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

āĻŦā§āĻ˛āĻ•āĻŋāĻ‚āĻ¯āĻŧā§‡āĻ° āĻāĻ‡ āĻ¸ā§āĻ¤āĻ°āĻŸāĻŋ āĻ†āĻŽāĻ°āĻž āĻāĻŸāĻŋāĻ¤ā§‡ āĻ¯ā§‡ āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ˛āĻžāĻĒāĻ—ā§āĻ˛āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ‡ āĻ¤āĻž āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŋāĻ¤ āĻšāĻ¯āĻŧāĨ¤

#4: āĻ¸ā§āĻŦāĻžāĻ°ā§āĻĨā§‡āĻ° āĻĻā§āĻŦāĻ¨ā§āĻĻā§āĻŦ

āĻ†āĻŽāĻ°āĻž āĻāĻ–āĻžāĻ¨ā§‡ āĻ†āĻ¸āĻŋ āĻāĻŦāĻ‚ āĻ¸āĻžāĻ‡āĻ¨āĻŸāĻŋ "āĻ˛āĻ•" āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ‡ - āĻ¯āĻĻāĻŋ āĻ•ā§‡āĻ‰ āĻ¸ā§‡āĻ‡ āĻŽā§āĻšā§āĻ°ā§āĻ¤ā§‡ āĻāĻŸāĻŋāĻ¤ā§‡ āĻ¸āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻĨāĻžāĻ•ā§‡, āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻāĻŸāĻŋ āĻĨā§‡āĻ•ā§‡ āĻĒāĻĄāĻŧāĻž? āĻ†āĻŽāĻ°āĻž āĻāĻ‡ āĻŦā§āĻ˛āĻ•āĻŸāĻŋ āĻŽā§āĻ•ā§āĻ¤āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻžāĻ¯āĻŧ "āĻšā§āĻ¯āĻžāĻ‚" āĻ•āĻ°āĻŦ, āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āĻ¯āĻ°āĻž āĻ¯āĻžāĻ°āĻž āĻĒāĻĄāĻŧāĻ¤ā§‡ āĻšāĻžāĻ¯āĻŧ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ›ā§āĻŸā§‡ āĻ†āĻ¸āĻŦā§‡...

āĻāĻŸāĻŋ āĻ¯āĻžāĻ¤ā§‡ āĻ¨āĻž āĻ˜āĻŸā§‡ āĻ¤āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻŽāĻ°āĻž "āĻ¨āĻŋāĻœā§‡āĻĻā§‡āĻ° āĻ†āĻ¤ā§āĻŽāĻ¤ā§āĻ¯āĻžāĻ—" āĻ•āĻ°āĻŦ - āĻ¯āĻĻāĻŋ āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ (āĻ—ā§āĻ°āĻšāĻŖāĻ¯ā§‹āĻ—ā§āĻ¯āĻ­āĻžāĻŦā§‡ āĻ¸ā§āĻŦāĻ˛ā§āĻĒ) āĻ¸āĻŽāĻ¯āĻŧā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ āĻ˛āĻ• āĻĒā§‡āĻ¤ā§‡ āĻ…āĻ•ā§āĻˇāĻŽ āĻšāĻ‡, āĻ¤āĻŦā§‡ āĻ†āĻŽāĻ°āĻž āĻŦā§‡āĻ¸ āĻĨā§‡āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ¯āĻ¤āĻŋāĻ•ā§āĻ°āĻŽ āĻĒāĻžāĻŦ, āĻ¤āĻŦā§‡ āĻ…āĻ¨ā§āĻ¤āĻ¤ āĻ†āĻŽāĻ°āĻž āĻ–ā§āĻŦ āĻŦā§‡āĻļāĻŋ āĻšāĻ¸ā§āĻ¤āĻ•ā§āĻˇā§‡āĻĒ āĻ•āĻ°āĻŦ āĻ¨āĻž āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯.

āĻāĻŸāĻŋ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ¸ā§‡āĻļāĻ¨ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ āĻ¸ā§‡āĻŸ āĻ•āĻ°ā§āĻ¨ lock_timeout (9.3+ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯) āĻŦāĻž/āĻāĻŦāĻ‚ āĻ¸ā§āĻŸā§‡āĻŸāĻŽā§‡āĻ¨ā§āĻŸ_āĻŸāĻžāĻ‡āĻŽāĻ†āĻ‰āĻŸ. āĻŽāĻ¨ā§‡ āĻ°āĻžāĻ–āĻžāĻ° āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻŦāĻŋāĻˇāĻ¯āĻŧ āĻšāĻ˛ āĻ¸ā§āĻŸā§‡āĻŸāĻŽā§‡āĻ¨ā§āĻŸ_āĻŸāĻžāĻ‡āĻŽāĻ†āĻ‰āĻŸ āĻŽāĻžāĻ¨ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻ¸ā§āĻŸā§‡āĻŸāĻŽā§‡āĻ¨ā§āĻŸ āĻĨā§‡āĻ•ā§‡ āĻĒā§āĻ°āĻ¯ā§‹āĻœā§āĻ¯āĨ¤ āĻ…āĻ°ā§āĻĨāĻžā§Ž, āĻ†āĻ āĻžāĻ˛ā§‹ āĻ•āĻ°āĻžāĻ° āĻŽāĻ¤ā§‹ - āĻ•āĻžāĻœ āĻ•āĻ°āĻŦā§‡ āĻ¨āĻž:

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

āĻ¯āĻžāĻ¤ā§‡ āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€āĻ¤ā§‡ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ā§‡āĻ° "āĻĒā§āĻ°āĻžāĻ¨ā§‹" āĻŽāĻžāĻ¨ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻ¨āĻž āĻšāĻ¯āĻŧ, āĻ†āĻŽāĻ°āĻž āĻĢāĻ°ā§āĻŽāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ āĻ¸ā§āĻĨāĻžāĻ¨ā§€āĻ¯āĻŧ āĻ¸ā§‡āĻŸ āĻ•āĻ°ā§āĻ¨, āĻ¯āĻž āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ā§‡ āĻ¸ā§‡āĻŸāĻŋāĻ‚ āĻāĻ° āĻ¸ā§āĻ¯ā§‹āĻ— āĻ¸ā§€āĻŽāĻŋāĻ¤ āĻ•āĻ°ā§‡āĨ¤

āĻ†āĻŽāĻ°āĻž āĻŽāĻ¨ā§‡ āĻ°āĻžāĻ–āĻŋ āĻ¯ā§‡ āĻ¸ā§āĻŸā§‡āĻŸāĻŽā§‡āĻ¨ā§āĻŸ_āĻŸāĻžāĻ‡āĻŽāĻ†āĻ‰āĻŸ āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻ¯ā§‹āĻœā§āĻ¯ āĻšāĻ¯āĻŧ āĻ¯āĻžāĻ¤ā§‡ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨āĻŸāĻŋ āĻ…āĻ—ā§āĻ°āĻšāĻŖāĻ¯ā§‹āĻ—ā§āĻ¯ āĻŽāĻžāĻ¨āĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻ¨āĻž āĻĒāĻžāĻ°ā§‡ āĻ¯āĻĻāĻŋ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡ āĻĒā§āĻ°āĻšā§āĻ° āĻĄā§‡āĻŸāĻž āĻĨāĻžāĻ•ā§‡āĨ¤

#5: āĻĄā§‡āĻŸāĻž āĻ•āĻĒāĻŋ āĻ•āĻ°ā§āĻ¨

āĻ¯āĻĻāĻŋ āĻŸā§‡āĻŦāĻŋāĻ˛āĻŸāĻŋ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ–āĻžāĻ˛āĻŋ āĻ¨āĻž āĻĨāĻžāĻ•ā§‡, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸āĻšāĻžāĻ¯āĻŧāĻ• āĻ…āĻ¸ā§āĻĨāĻžāĻ¯āĻŧā§€ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻĄā§‡āĻŸāĻž āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡:

CREATE TEMPORARY TABLE _tmp_swap ON COMMIT DROP AS TABLE tbl;

āĻ¸ā§āĻŦāĻžāĻ•ā§āĻˇāĻ° āĻ•āĻŽāĻŋāĻŸ āĻĄā§āĻ°āĻĒ āĻ…āĻ¨ āĻŽāĻžāĻ¨ā§‡ āĻ¯ā§‡ āĻŽā§āĻšā§‚āĻ°ā§āĻ¤ā§‡ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻļā§‡āĻˇ āĻšāĻŦā§‡, āĻ…āĻ¸ā§āĻĨāĻžāĻ¯āĻŧā§€ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡āĻ° āĻ…āĻ¸ā§āĻ¤āĻŋāĻ¤ā§āĻŦ āĻŦāĻ¨ā§āĻ§ āĻšāĻ¯āĻŧā§‡ āĻ¯āĻžāĻŦā§‡ āĻāĻŦāĻ‚ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻĒā§āĻ°āĻ¸āĻ™ā§āĻ—ā§‡ āĻŽā§āĻ¯āĻžāĻ¨ā§āĻ¯āĻŧāĻžāĻ˛āĻŋ āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻžāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ¨ā§‡āĻ‡āĨ¤

āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ†āĻŽāĻ°āĻž āĻ…āĻ¨ā§āĻŽāĻžāĻ¨ āĻ•āĻ°āĻŋ āĻ¯ā§‡ āĻĒā§āĻ°āĻšā§āĻ° "āĻ˛āĻžāĻ‡āĻ­" āĻĄā§‡āĻŸāĻž āĻ¨ā§‡āĻ‡, āĻ¤āĻžāĻ‡ āĻāĻ‡ āĻ…āĻĒāĻžāĻ°ā§‡āĻļāĻ¨āĻŸāĻŋ āĻ–ā§āĻŦ āĻĻā§āĻ°ā§āĻ¤ āĻšāĻ“āĻ¯āĻŧāĻž āĻ‰āĻšāĻŋāĻ¤āĨ¤

āĻ†āĻšā§āĻ›āĻž, āĻāĻ‡ āĻ¸āĻŦ! āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ•āĻ°āĻžāĻ° āĻĒāĻ°ā§‡ āĻ­ā§āĻ˛āĻŦā§‡āĻ¨ āĻ¨āĻž 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;

āĻĻā§āĻŦāĻŋāĻ¤ā§€āĻ¯āĻŧāĻŦāĻžāĻ° āĻĄā§‡āĻŸāĻž āĻ•āĻĒāĻŋ āĻ•āĻ°āĻž āĻ•āĻŋ āĻ¸āĻŽā§āĻ­āĻŦ āĻ¨āĻ¯āĻŧ?āĻ¨ā§€āĻ¤āĻŋāĻ—āĻ¤āĻ­āĻžāĻŦā§‡, āĻāĻŸāĻŋ āĻ¸āĻŽā§āĻ­āĻŦ āĻ¯āĻĻāĻŋ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡āĻ° 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;

āĻ¸ā§‹āĻ°ā§āĻ¸ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡ āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸāĻŸāĻŋ āĻšāĻžāĻ˛āĻžāĻ‡ āĻāĻŦāĻ‚ āĻŽā§‡āĻŸā§āĻ°āĻŋāĻ•ā§āĻ¸ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻŋ:

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

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨