เชชเชฐเชเชคเซ เชเซ เชเชตเชพ เช เชชเซเชฐเชฟเชฏ เชชเซเชฐเชเชพเชฐ (OLTP เชกเซเชเชพเชฌเซเช เชชเชฐ เชฒเชพเชเชฌเชพ เชเชพเชณเชพเชจเชพ OLAP เชฒเซเชก) เชนเชเซ เชชเชฃ เช เชธเซเชคเชฟเชคเซเชตเชฎเชพเช เชนเซเชฏ เชคเซ เชถเซเช? เชเซเชตเซ เชฐเซเชคเซ เชธเชเซเชฐเชฟเชฏ เชฐเซเชคเซ เชฌเชฆเชฒเชพเชคเชพ เชเซเชฌเชฒเชจเซ เชธเชพเชซ เชเชฐเซ เชฒเชพเชเชฌเชพ เชชเซเชฐเชถเซเชจเซเชฅเซ เชเซเชฐเชพเชฏเซเชฒเชพ เช เชจเซ เชฐเซเช เชชเชฐ เชชเช เชฎเซเชเชคเชพ เชจเชฅเซ?
เชฐเซเช เช เชจเชซเซเชฒเซเชกเชฟเชเช
เชชเซเชฐเชฅเชฎ, เชเชพเชฒเซ เชจเชเซเชเซ เชเชฐเซเช เชเซ เชเชชเชฃเซ เชเซ เชธเชฎเชธเซเชฏเชพ เชนเชฒ เชเชฐเชตเชพ เชฎเชพเชเชเซเช เชเซเช เชคเซ เชถเซเช เชเซ เช เชจเซ เชคเซ เชเซเชตเซ เชฐเซเชคเซ เชเชญเซ เชฅเช เชถเชเซ เชเซ.
เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ เช เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟ เชฅเชพเชฏ เชเซ เชชเซเชฐเชฎเชพเชฃเชฎเชพเช เชจเชพเชจเชพ เชเซเชฌเชฒ เชชเชฐ, เชชเชฐเชเชคเซ เชเซเชฎเชพเช เชคเซ เชฅเชพเชฏ เชเซ เชเชฃเชพ เชฌเชงเชพ เชซเซเชฐเชซเชพเชฐเซ. เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ เช เช เชฅเชตเชพ เช เชฒเช เชฎเซเชเชฐ/เชเชเซเชฐเชฟเชเซเชเซเชธ/เชฐเซเชเชฟเชเชเซเชธ, เชเซเชจเชพ เชชเชฐ เช เชชเชกเซเช เชตเชพเชฐเชเชตเชพเชฐ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เช เชฅเชตเชพ เชฌเชซเชฐ-เชเชคเชพเชฐ เชเชเชจเชพเชเชจเชพ เชธเชคเชค เชเชพเชฒเซ เชธเซเชเซเชฐเซเชฎ เชชเชฐ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพ เชฎเชพเชเซ, เชเซเชจเชพ เชฐเซเชเซเชฐเซเชกเซเชธ เชธเชคเชค 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);
เชนเชตเซ เชเชชเชฃเซ เชเช เชเชพเชเชจเซเชเชฐเชจเซ เชเชฟเชเชฎเชค เชเชฃเซ, เชเชฃเซ เชตเชเชค เช
เชชเชกเซเช เชเชฐเซเช เชเซเช. เชชเซเชฐเชฏเซเชเชจเซ เชถเซเชฆเซเชงเชคเชพ เชฎเชพเชเซ, เชเชพเชฒเซ เช เชเชฐเซเช
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
เชเชน, เชธเชพเชซ เชเชฐเชตเชพ เชฎเชพเชเซ เชเชเช เชจเชฅเซ! เชธเชฎเชพเชเชคเชฐ เชเชพเชฒเซ เชฐเชนเซเชฒ เชตเชฟเชจเชเชคเซ เช เชฎเชพเชฐเซ เชธเชพเชฅเซ เชฆเชเชฒ เชเชฐเซ เชฐเชนเซ เชเซ - เชเซเชตเชเซ, เชคเซ เชเซเช เชฆเชฟเชตเชธ เช เชธเชเชธเซเชเชฐเชฃเซ เชคเชฐเชซ เชตเชณเชตเชพ เชฎเชพเชเชเซ เชเซ (เชถเซเช เชเซ?), เช เชจเซ เชคเซ เชคเซเชจเชพ เชฎเชพเชเซ เชเชชเชฒเชฌเซเชง เชนเซเชตเชพ เชเซเชเช. เช เชจเซ เชคเซเชฅเซ เชตเซเชเซเชฏเซเชฎ เชซเซเชฒ เชชเชฃ เชเชชเชฃเชจเซ เชฎเชฆเชฆ เชเชฐเชถเซ เชจเชนเซเช.
เชเซเชฌเชฒ "เชญเชเชเซ เชฐเชนเซเชฏเซเช เชเซ".
เชชเชฐเชเชคเซ เช เชฎเซ เชเชพเชคเชฐเซเชชเซเชฐเซเชตเช เชเชพเชฃเซเช เชเซเช เชเซ เชคเซ เชเซเชตเซเชฐเซ เชฎเชพเชเซ เช เชฎเชพเชฐเชพ เชเซเชฌเชฒเชจเซ เชเชฐเซเชฐ เชจเชฅเซ. เชคเซเชฅเซ, เช เชฎเซ เชนเชเซ เชชเชฃ เชเซเชฌเชฒเชฎเชพเชเชฅเซ เชฌเชฟเชจเชเชฐเซเชฐเซ เชฆเชฐเซเช เชตเชธเซเชคเซเชจเซ เชฆเซเชฐ เชเชฐเซเชจเซ เชธเชฟเชธเซเชเชฎเชจเซ เชเชพเชฎเชเซเชฐเซเชจเซ เชชเชฐเซเชฏเชพเชชเซเชค เชฎเชฐเซเชฏเชพเชฆเชพเชฎเชพเช เชชเชฐเชค เชเชฐเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซเชถเซเช - เชเชเชพเชฎเชพเช เชเชเซเช "เชฎเซเชจเซเชฏเซเช เชฒเซ", เชเชพเชฐเชฃ เชเซ VACUUM เชเชชเซ เชเซ.
เชคเซเชจเซ เชตเชงเซ เชธเซเชชเชทเซเช เชเชฐเชตเชพ เชฎเชพเชเซ, เชเชพเชฒเซ เชฌเชซเชฐ เชเซเชฌเชฒเชจเชพ เชเซเชธเชจเซเช เชเชฆเชพเชนเชฐเชฃ เชเซเชเช. เชเชเชฒเซ เชเซ, 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: เชนเชเซ เชชเชฃ เชตเซเชเซเชฏเซเชฎ
เช เชฎเซ เช เชเชพเชเชฅเซ เชเชพเชฃเซ เชถเชเชคเชพ เชจเชฅเซ เชเซ เชถเซเช เชธเชฎเชพเชเชคเชฐ เชเซเชตเซเชฐเซ เช เชฎเชพเชฐเซ เชธเชพเชฅเซ เชจเซเชเชงเชชเชพเชคเซเชฐ เชฐเซเชคเซ เชฆเชเชฒ เชเชฐเซ เชฐเชนเซ เชเซ - เชคเซ เชถเชฐเซ เชฅเชฏเชพ เชชเชเซ เชเซเชเชฒเชพ เชฐเซเชเซเชฐเซเชก "เชเซเชจเชพ" เชฅเช เชเชฏเชพ เชเซ. เชคเซเชฅเซ, เชเซเชฏเชพเชฐเซ เชเชชเชฃเซ เชเซเชเช เชฐเซเชคเซ เชเซเชฌเชฒ เชชเชฐ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเซเช เชเซเช, เชเซเช เชชเชฃ เชธเชเชเซเชเซเชฎเชพเช, เชเชชเชฃเซ เชธเซ เชชเซเชฐเชฅเชฎ เชคเซเชจเชพ เชชเชฐ เช เชฎเชฒ เชเชฐเชตเซ เชเซเชเช เชตเชพเชฏเซเชฎเซเชฏเซเชฎ - VACUUM FULL เชฅเซ เชตเชฟเชชเชฐเซเชค, เชคเซ เชตเชพเชเชเชตเชพ-เชฒเซเชเชตเชพ เชกเซเชเชพ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชคเซ เชธเชฎเชพเชเชคเชฐ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชเชฎเชพเช เชฆเชเชฒ เชเชฐเชคเซเช เชจเชฅเซ.
เชคเซ เช เชธเชฎเชฏเซ, เชคเซ เช เชฎเซ เชเซ เชฆเซเชฐ เชเชฐเชตเชพ เชฎเชพเชเชเซเช เชเซเช เชคเซเชฎเชพเชเชฅเซ เชฎเซเชเชพ เชญเชพเชเชจเซ เชคเชฐเชค เช เชธเชพเชซ เชเชฐเซ เชถเชเซ เชเซ. เชนเชพ, เช เชจเซ เช เชเซเชฌเชฒ เชชเชฐเชจเชพ เช เชจเซเชเชพเชฎเซ เชชเซเชฐเชถเซเชจเซ เช เชฎเชพเชฐเซ เชชเชพเชธเซ เชเชถเซ "เชนเซเช เชเซเชถ" เชฆเซเชตเชพเชฐเชพ, เชเซ เชคเซเชฎเชจเซ เช เชตเชงเชฟ เชเชเชพเชกเชถเซ - เช เชจเซ เชคเซเชฅเซ, เช เชฎเชพเชฐเชพ เชธเชฐเซเชตเชฟเชธเชฟเชเช เชเซเชฐเชพเชจเซเชเซเชเซเชถเชจ เชฆเซเชตเชพเชฐเชพ เช เชจเซเชฏ เชฒเซเชเซเชจเซ เช เชตเชฐเซเชงเชฟเชค เชเชฐเชตเชพเชจเซ เชเซเชฒ เชธเชฎเชฏ.
#2: เชเซเช เชเชฐเซ เชเซ?
เชเชพเชฒเซ เชคเชชเชพเชธเซเช เชเซ เชเซเชทเซเชเชเชฎเชพเช เชเชเชเชชเชฃ เชเซ เชเซ เชเซเชฎ:
TABLE tbl LIMIT 1;
เชเซ เชคเซเชฏเชพเช เชเช เชชเชฃ เชฐเซเชเซเชฐเซเชก เชฌเชพเชเซ เชจ เชนเซเชฏ, เชคเซ เช
เชฎเซ เชซเชเซเชค เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเซเชจเซ เชเชฃเซเช เชฌเชเชพเชตเซ เชถเชเซเช เชเซเช
เชคเซ เชฆเชฐเซเช เชเซเชฌเชฒ เชฎเชพเชเซ เชฌเชฟเชจเชถเชฐเชคเซ เชกเชฟเชฒเซเช เชเชฎเชพเชจเซเชกเชจเซ เชเซเชฎ เช เชเชพเชฐเซเชฏ เชเชฐเซ เชเซ, เชชเชฐเชเชคเซ เชคเซ เชตเชงเซ เชเชกเชชเซ เชเซ เชเชพเชฐเชฃ เชเซ เชคเซ เชเชฐเซเชเชฐ เชเซเชทเซเชเชเซเชจเซ เชธเซเชเซเชจ เชเชฐเชคเซเช เชจเชฅเซ. เชคเชฆเซเชชเชฐเชพเชเชค, เชคเซ เชคเชฐเชค เช เชกเชฟเชธเซเช เชเชเซเชฏเชพ เชเชพเชฒเซ เชเชฐเซ เชเซ, เชคเซเชฅเซ เชชเชเซเชฅเซ เชตเซเชเซเชฏเซเชฎ เชเชชเชฐเซเชถเชจ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชจเชฅเซ.
เชคเชฎเชพเชฐเซ เชเซเชฌเชฒ เชธเชฟเชเซเชตเชจเซเชธ เชเชพเชเชจเซเชเชฐ เชฐเซเชธเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ เชเซ เชเซเชฎ เชคเซ เชจเชเซเชเซ เชเชฐเชตเชพเชจเซเช เชคเชฎเชพเชฐเชพ เชชเชฐ เชเซ.
#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