เดเดจเตเดจเดพเตฝ เด เดคเตเดคเดฐเดฎเตเดฐเต เด เดธเตเดเดเดฐเดฎเดพเดฏ เดคเดฐเด (เดเดฐเต 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
เด, เดตเตเดคเตเดคเดฟเดฏเดพเดเตเดเดพเตป เดเดจเตเดจเตเดฎเดฟเดฒเตเดฒ! เดธเดฎเดพเดจเตเดคเดฐเด เดฑเดฃเตเดฃเดฟเดเดเต เด เดญเตเดฏเตผเดคเตเดฅเดจ เดเดเตเดเดณเต เดคเดเดธเตเดธเดชเตเดชเตเดเตเดคเตเดคเตเดจเตเดจเต - เดเดฒเตเดฒเดพเดคเตเดคเดฟเดจเตเดฎเตเดชเดฐเดฟ, เด เดตเตป เดเดจเตเดจเตเดเตเดเดฟเดฒเตเด เด เดชเดคเดฟเดชเตเดชเตเดเดณเดฟเดฒเตเดเตเดเต เดคเดฟเดฐเดฟเดฏเดพเตป เดเดเตเดฐเดนเดฟเดเตเดเตเดเตเดเดพเด (เดเดจเตเดคเดพเดฃเต?), เด เดต เด เดตเดจเต เดฒเดญเตเดฏเดฎเดพเดฏเดฟเดฐเดฟเดเตเดเดฃเด. เด เดคเดฟเดจเดพเตฝ เดตเดพเดเตเดตเด เดซเตเตพ เดชเตเดฒเตเด เดเดเตเดเดณเต เดธเดนเดพเดฏเดฟเดเตเดเดฟเดฒเตเดฒ.
เดฎเตเดถ "เดคเดเดฐเตเดจเตเดจเต"
เดเดจเตเดจเดพเตฝ เด เด เดจเตเดตเตเดทเดฃเดคเตเดคเดฟเดจเต เดเดเตเดเดณเตเดเต เดชเดเตเดเดฟเด เดเดตเดถเตเดฏเดฎเดฟเดฒเตเดฒเตเดจเตเดจเต เดเดเตเดเตพเดเตเดเต เดเดฑเดชเตเดชเดพเดฏเตเด เด เดฑเดฟเดฏเดพเด. เด เดคเดฟเดจเดพเตฝ, เดเตเดฌเดฟเดณเดฟเตฝ เดจเดฟเดจเตเดจเต เด เดจเดพเดตเดถเตเดฏเดฎเดพเดฏ เดเดฒเตเดฒเดพเด เดเดดเดฟเดตเดพเดเตเดเดฟเดเตเดเตเดฃเตเดเต เดธเดฟเดธเตเดฑเตเดฑเด เดชเตเดฐเดเดเดจเดคเตเดคเต เดฎเดคเดฟเดฏเดพเดฏ เดชเดฐเดฟเดงเดฟเดเดณเดฟเดฒเตเดเตเดเต เดคเดฟเดฐเดฟเดเต เดเตเดฃเตเดเตเดตเดฐเดพเตป เดเดเตเดเตพ เดถเตเดฐเดฎเดฟเดเตเดเตเด - เดเตเดฑเดเตเดเดคเต "เดฎเดพเดจเตเดตเดฒเดพเดฏเดฟ", เดเดพเดฐเดฃเด VACUUM เดเดชเตเดเตเดทเดฟเดเตเดเตเดจเตเดจเต.
เดเดคเต เดเตเดเตเดคเตฝ เดตเตเดฏเดเตเดคเดฎเดพเดเตเดเตเดจเตเดจเดคเดฟเดจเต, เดเดฐเต เดฌเดซเตผ เดเตเดฌเดฟเดณเดฟเดจเตเดฑเต เดเดฆเดพเดนเดฐเดฃเด เดจเตเดเตเดเดพเด. เด เดคเดพเดฏเดคเต, INSERT / DELETE เดจเตเดฑเต เดเดฐเต เดตเดฒเดฟเดฏ เดเดดเตเดเตเดเต เดเดฃเตเดเต, เดเดฟเดฒเดชเตเดชเตเตพ เดชเดเตเดเดฟเด เดชเตเตผเดฃเตเดฃเดฎเดพเดฏเตเด เดถเตเดจเตเดฏเดฎเดพเดฃเต. เดชเดเตเดทเต, เด เดคเต เดถเตเดจเตเดฏเดฎเดฒเตเดฒเตเดเตเดเดฟเตฝ, เดเดเตเดเตพ เด เดคเต เดเตเดฏเตเดฏเดฃเด เด เดคเดฟเดจเตเดฑเต เดจเดฟเดฒเดตเดฟเดฒเต เดเดณเตเดณเดเดเตเดเดเตเดเตพ เดธเดเดฐเดเตเดทเดฟเดเตเดเตเด.
#0: เดธเดพเดนเดเดฐเตเดฏเด เดตเดฟเดฒเดฏเดฟเดฐเตเดคเตเดคเตเดจเตเดจเต
เดเดฐเต เดเดชเตเดชเดฑเตเดทเดจเตเด เดถเตเดทเดตเตเด เดจเดฟเดเตเดเตพเดเตเดเต เดเตเดฌเดฟเตพ เดเดชเดฏเตเดเดฟเดเตเดเต เดเดจเตเดคเตเดเตเดเดฟเดฒเตเด เดเตเดฏเตเดฏเดพเตป เดถเตเดฐเดฎเดฟเดเตเดเดพเดฎเตเดจเตเดจเต เดตเตเดฏเดเตเดคเดฎเดพเดฃเต, เดเดจเตเดจเดพเตฝ เดเดคเต เดตเดณเดฐเตเดฏเดงเดฟเดเด เด เตผเดคเตเดฅเดฎเดพเดเตเดเตเดจเตเดจเดฟเดฒเตเดฒ - เดฎเตเดฏเดฟเดจเตเดฑเดจเตปเดธเต เดเดตเตผเดนเตเดกเต เดเดพเตผเดเตเดฑเตเดฑเต เด เดจเตเดตเตเดทเดฃเดเตเดเดณเตเดเต เดคเตเดฐเตเดชเตเดเตเดเดฟเดจเตเดเตเดเดพเตพ เดตเดฒเตเดคเดพเดฏเดฟเดฐเดฟเดเตเดเตเด.
เดจเดฎเตเดเตเดเต เดฎเดพเดจเดฆเดฃเตเดกเด เดฐเตเดชเดชเตเดชเตเดเตเดคเตเดคเดพเด - โเดเดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดฃเตเด เดธเดฎเดฏเดฎเดพเดฃเตโ เดเดเตเดเดฟเตฝ:
- เดตเดณเดฐเตเดเตเดเดพเดฒเด เดฎเตเดฎเตเดชเดพเดฃเต เดตเดพเดเตเดตเด เดธเดฎเดพเดฐเดเดญเดฟเดเตเดเดคเต
เดเดจเดคเตเดค เดญเดพเดฐเด เดเดเตเดเตพ เดชเตเดฐเดคเตเดเตเดทเดฟเดเตเดเตเดจเตเดจเต, เด เดคเดฟเดจเดพเตฝ เด เดคเต เด เดจเตเดตเดฆเดฟเดเตเดเตเด 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 - VACUUM FULL เดชเตเดฒเตเดฏเดฒเตเดฒ, เดฑเตเดกเต-เดฑเตเดฑเตเดฑเต เดกเดพเดฑเตเดฑเดฏเตเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจ เดธเดฎเดพเดจเตเดคเดฐ เดชเตเดฐเดเตเดฐเดฟเดฏเดเดณเดฟเตฝ เดเดคเต เดเดเดชเตเดเตเดจเตเดจเดฟเดฒเตเดฒ.
เด เดคเต เดธเดฎเดฏเด, เดเดเตเดเตพ เดจเตเดเตเดเด เดเตเดฏเตเดฏเดพเตป เดเดเตเดฐเดนเดฟเดเตเดเตเดจเตเดจ เดฎเดฟเดเตเดเดตเดฏเตเด เดเดเดจเดเดฟ เดตเตเดคเตเดคเดฟเดฏเดพเดเตเดเดพเตป เดเดคเดฟเดจเต เดเดดเดฟเดฏเตเด. เด เดคเต, เด เดชเดเตเดเดฟเดเดฏเดฟเดฒเต เดคเตเดเตผเดจเตเดจเตเดณเตเดณ เดเตเดฆเตเดฏเดเตเดเตพ เดเดเตเดเดณเดฟเดฒเตเดเตเดเต เดชเตเดเตเด "เดนเตเดเตเดเต เดเดพเดทเต" เดตเดดเดฟ, เด เดคเต เด เดตเดฐเตเดเต เดฆเตเตผเดเตเดฏเด เดเตเดฑเดฏเตเดเตเดเตเด - เด เดคเดฟเดจเดพเตฝ, เดเดเตเดเดณเตเดเต เดธเตเดตเดจ เดเดเดชเดพเดเต เดตเดดเดฟ เดฎเดฑเตเดฑเตเดณเตเดณเดตเดฐเต เดฌเตเดฒเตเดเตเดเต เดเตเดฏเตเดฏเตเดจเตเดจ เดเดเต เดธเดฎเดฏเด.
#2: เดตเตเดเตเดเดฟเตฝ เดเดฐเตเดเตเดเดฟเดฒเตเด เดเดฃเตเดเต?
เดชเดเตเดเดฟเดเดฏเดฟเตฝ เดเดจเตเดคเตเดเตเดเดฟเดฒเตเด เดเดฃเตเดเต เดเดจเตเดจเต เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเดพเด:
TABLE tbl LIMIT 1;
เดเดฐเต เดฑเตเดเตเดเตเตผเดกเต เดชเตเดฒเตเด เด
เดตเดถเตเดทเดฟเดเตเดเตเดจเตเดจเดฟเดฒเตเดฒเตเดเตเดเดฟเตฝ, เดฒเดณเดฟเดคเดฎเดพเดฏเดฟ เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดฒเตเดเต เดจเดฎเตเดเตเดเต เดชเตเดฐเตเดธเดธเตเดธเดฟเดเดเดฟเตฝ เดงเดพเดฐเดพเดณเด เดฒเดพเดญเดฟเดเตเดเดพเด
เดเดคเต เดเดฐเต เดเตเดฌเดฟเดณเดฟเดจเตเด เดเดฐเต เดจเดฟเดฐเตเดชเดพเดงเดฟเดเดฎเดพเดฏ DELETE เดเดฎเดพเตปเดกเต เดชเตเดฒเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเต, เดเดจเตเดจเดพเตฝ เดเดคเต เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เดเตเดฌเดฟเดณเตเดเตพ เดธเตเดเดพเตป เดเตเดฏเตเดฏเดพเดคเตเดคเดคเดฟเดจเดพเตฝ เดตเดณเดฐเต เดตเตเดเดคเดฏเตเดณเตเดณเดคเดพเดฃเต. เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, เดเดคเต เดเดเตป เดคเดจเตเดจเต เดกเดฟเดธเตเดเต เดธเตเดชเตเดธเต เดธเตเดตเดคเดจเตเดคเตเดฐเดฎเดพเดเตเดเตเดจเตเดจเต, เด เดคเดฟเดจเดพเตฝ เดชเดฟเดจเตเดจเตเดเต เดเดฐเต VACUUM เดชเตเดฐเดตเตผเดคเตเดคเดจเด เดจเดเดคเตเดคเตเดฃเตเด เดเดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ.
เดจเดฟเดเตเดเตพเดเตเดเต เดเตเดฌเดฟเตพ เดธเตเดเตเดตเตปเดธเต เดเตเดฃเตเดเตผ (RESTART IDENTITY) เดชเตเดจเดเดธเดเตเดเดฎเดพเดเตเดเดฃเดฎเต เดเดจเตเดจเต เดคเตเดฐเตเดฎเดพเดจเดฟเดเตเดเตเดฃเตเดเดคเต เดจเดฟเดเตเดเดณเดพเดฃเต.
#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;
เดกเดพเดฑเตเดฑ เดฐเดฃเตเดเดพเดฎเดคเตเด เดชเดเตผเดคเตเดคเดพเดคเดฟเดฐเดฟเดเตเดเดพเตป เดเดดเดฟเดฏเตเดฎเต?เดคเดคเตเดตเดคเตเดคเดฟเตฝ, BL เดตเดถเดคเตเดคเต เดจเดฟเดจเตเดจเตเดณเตเดณ เดฎเดฑเตเดฑเตเดคเตเดเตเดเดฟเดฒเตเด เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดเดณเตเดฎเดพเดฏเดฟ เด เดฒเตเดฒเตเดเตเดเดฟเตฝ DB เดตเดถเดคเตเดคเต เดจเดฟเดจเตเดจเตเดณเตเดณ FK-เดฏเตเดฎเดพเดฏเดฟ เดเตเดฌเดฟเดณเดฟเดจเตเดฑเต oid เดคเดจเตเดจเต เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดเตเดเดฟเดเตเดเดฟเดฒเตเดฒเตเดเตเดเดฟเตฝ เด เดคเต เดธเดพเดงเตเดฏเดฎเดพเดฃเต:
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