āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻ¯āĻĻāĻŋ āĻāĻŽāĻ¨ āĻāĻāĻāĻŋ āĻ āĻĒā§āĻ°ā§āĻ¤āĻŋāĻāĻ° āĻĒā§āĻ°āĻāĻžāĻ° (āĻāĻāĻāĻŋ 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);
āĻāĻāĻ¨ āĻāĻŽāĻ°āĻž āĻāĻžāĻāĻ¨ā§āĻāĻžāĻ°āĻā§āĻ˛āĻŋāĻ° āĻāĻāĻāĻŋāĻ° āĻŽāĻžāĻ¨ āĻ
āĻ¨ā§āĻ, āĻŦāĻšā§āĻŦāĻžāĻ° āĻāĻĒāĻĄā§āĻ āĻāĻ°āĻŋāĨ¤ āĻĒāĻ°ā§āĻā§āĻˇāĻžāĻ° āĻŦāĻŋāĻļā§āĻĻā§āĻ§āĻ¤āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻāĻ¸ā§āĻ¨ āĻāĻāĻŋ āĻāĻ°āĻŋ
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 āĻāĻ° āĻĻā§āĻˇ.
āĻāĻāĻž āĻ¸āĻŦ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§
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: āĻ¸ā§āĻŦāĻžāĻ°ā§āĻĨā§āĻ° āĻĻā§āĻŦāĻ¨ā§āĻĻā§āĻŦ
āĻāĻŽāĻ°āĻž āĻāĻāĻžāĻ¨ā§ āĻāĻ¸āĻŋ āĻāĻŦāĻ āĻ¸āĻžāĻāĻ¨āĻāĻŋ "āĻ˛āĻ" āĻāĻ°āĻ¤ā§ āĻāĻžāĻ - āĻ¯āĻĻāĻŋ āĻā§āĻ āĻ¸ā§āĻ āĻŽā§āĻšā§āĻ°ā§āĻ¤ā§ āĻāĻāĻŋāĻ¤ā§ āĻ¸āĻā§āĻ°āĻŋāĻ¯āĻŧ āĻĨāĻžāĻā§, āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻāĻāĻŋ āĻĨā§āĻā§ āĻĒāĻĄāĻŧāĻž? āĻāĻŽāĻ°āĻž āĻāĻ āĻŦā§āĻ˛āĻāĻāĻŋ āĻŽā§āĻā§āĻ¤āĻŋāĻ° āĻāĻ¨ā§āĻ¯ āĻ āĻĒā§āĻā§āĻˇāĻžāĻ¯āĻŧ "āĻšā§āĻ¯āĻžāĻ" āĻāĻ°āĻŦ, āĻāĻŦāĻ āĻ āĻ¨ā§āĻ¯āĻ°āĻž āĻ¯āĻžāĻ°āĻž āĻĒāĻĄāĻŧāĻ¤ā§ āĻāĻžāĻ¯āĻŧ āĻāĻŽāĻžāĻĻā§āĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻā§āĻā§ āĻāĻ¸āĻŦā§...
āĻāĻāĻŋ āĻ¯āĻžāĻ¤ā§ āĻ¨āĻž āĻāĻā§ āĻ¤āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻāĻŽāĻ°āĻž "āĻ¨āĻŋāĻā§āĻĻā§āĻ° āĻāĻ¤ā§āĻŽāĻ¤ā§āĻ¯āĻžāĻ" āĻāĻ°āĻŦ - āĻ¯āĻĻāĻŋ āĻāĻŽāĻ°āĻž āĻāĻāĻāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ (āĻā§āĻ°āĻšāĻŖāĻ¯ā§āĻā§āĻ¯āĻāĻžāĻŦā§ āĻ¸ā§āĻŦāĻ˛ā§āĻĒ) āĻ¸āĻŽāĻ¯āĻŧā§āĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻāĻāĻāĻŋ āĻ˛āĻ āĻĒā§āĻ¤ā§ āĻ āĻā§āĻˇāĻŽ āĻšāĻ, āĻ¤āĻŦā§ āĻāĻŽāĻ°āĻž āĻŦā§āĻ¸ āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻŦā§āĻ¯āĻ¤āĻŋāĻā§āĻ°āĻŽ āĻĒāĻžāĻŦ, āĻ¤āĻŦā§ āĻ āĻ¨ā§āĻ¤āĻ¤ āĻāĻŽāĻ°āĻž āĻā§āĻŦ āĻŦā§āĻļāĻŋ āĻšāĻ¸ā§āĻ¤āĻā§āĻˇā§āĻĒ āĻāĻ°āĻŦ āĻ¨āĻž āĻ āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯.
āĻāĻāĻŋ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻ¸ā§āĻļāĻ¨ āĻā§āĻ°āĻŋāĻ¯āĻŧā§āĻŦāĻ˛ āĻ¸ā§āĻ āĻāĻ°ā§āĻ¨
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 āĻĒāĻžāĻļ āĻĨā§āĻā§ āĻŦāĻž 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