เจชเจฐ เจเฉ เจเฉ เจ เจเจฟเจนเฉ เจเฉเจเจพ เจเจฟเจธเจฎ (เจเฉฑเจ 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
เจเจน, เจธเจพเจซเจผ เจเจฐเจจ เจฒเจ เจเฉเจ เจตเฉ เจจเจนเฉเจ เจนเฉ! เจธเจฎเจพเจจเจพเจเจคเจฐ เจเฉฑเจฒ เจฐเจนเฉ เจฌเฉเจจเจคเฉ เจธเจพเจกเฉ เจจเจพเจฒ เจฆเจเจฒ เจฆเฉ เจฐเจนเฉ เจนเฉ - เจเจเจฐเจเจพเจฐ, เจเจน เจเจฟเจธเฉ เจฆเจฟเจจ เจเจนเจจเจพเจ เจธเฉฐเจธเจเจฐเจฃเจพเจ (เจเฉเจเจฐ?) เจตเฉฑเจฒ เจฎเฉเฉเจจเจพ เจเจพเจน เจธเจเจฆเจพ เจนเฉ, เจ เจคเฉ เจเจน เจเจธ เจฒเจ เจเจชเจฒเจฌเจง เจนเฉเจฃเฉ เจเจพเจนเฉเจฆเฉ เจนเจจ. เจ เจคเฉ เจเจธ เจฒเจ เจตเฉเจเจฟเจเจฎ เจซเฉเจฒ เจตเฉ เจธเจพเจกเฉ เจฎเจฆเจฆ เจจเจนเฉเจ เจเจฐเฉเจเจพเฅค
เจธเจพเจฐเจฃเฉ เจจเฉเฉฐ "เจเฉเฉฑเจเจฃเจพ"
เจชเจฐ เจ เจธเฉเจ เจฏเจเฉเจจเฉ เจคเฉเจฐ 'เจคเฉ เจเจพเจฃเจฆเฉ เจนเจพเจ เจเจฟ เจเจธ เจชเฉเฉฑเจเจเจฟเฉฑเจ เจจเฉเฉฐ เจธเจพเจกเฉ เจธเจพเจฐเจฃเฉ เจฆเฉ เจฒเฉเฉ เจจเจนเฉเจ เจนเฉเฅค เจเจธ เจฒเจ, เจ เจธเฉเจ เจ เจเฉ เจตเฉ เจธเจพเจฐเจฃเฉ เจคเฉเจ เจฌเฉเจฒเฉเฉเฉ เจนเจฐ เจเฉเจเจผ เจจเฉเฉฐ เจเจคเจฎ เจเจฐเจเฉ เจธเจฟเจธเจเจฎ เจฆเฉ เจเจพเจฐเจเฉเจเจผเจพเจฐเฉ เจจเฉเฉฐ เจขเฉเจเจตเฉเจ เจธเฉเจฎเจพเจตเจพเจ 'เจคเฉ เจตเจพเจชเจธ เจเจฐเจจ เจฆเฉ เจเฉเจธเจผเจฟเจธเจผ เจเจฐเจพเจเจเฉ - เจเฉฑเจเฉ เจเฉฑเจ "เจนเฉฑเจฅเฉเจ", เจเจฟเจเจเจเจฟ เจตเฉเจเจฟเจเจฎ เจนเจพเจฐ เจฆเจฟเฉฐเจฆเจพ เจนเฉเฅค
เจเจธ เจจเฉเฉฐ เจนเฉเจฐ เจธเจชเฉฑเจธเจผเจ เจเจฐเจจ เจฒเจ, เจเจ เจเฉฑเจ เจฌเจซเจฐ เจเฉเจฌเจฒ เจฆเฉ เจเฉเจธ เจฆเฉ เจเจฆเจพเจนเจฐเจจ เจตเฉเจเฉเจเฅค เจญเจพเจต, 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: เจ เจเฉ เจตเฉ เจตเฉเจเจฟเจเจฎ
เจ เจธเฉเจ เจชเจนเจฟเจฒเจพเจ เจคเฉเจ เจจเจนเฉเจ เจเจพเจฃ เจธเจเจฆเฉ เจนเจพเจ เจเจฟ เจเฉ เจเฉเจ เจธเจฎเจพเจจเฉฐเจคเจฐ เจชเฉเฉฑเจเจเจฟเฉฑเจ เจธเจพเจกเฉ เจจเจพเจฒ เจฎเจนเฉฑเจคเจตเจชเฉเจฐเจจ เจคเฉเจฐ 'เจคเฉ เจฆเจเจฒ เจฆเฉ เจฐเจนเฉ เจนเฉ - เจ เจธเจฒ เจตเจฟเฉฑเจ เจเจน เจธเจผเฉเจฐเฉ เจนเฉเจฃ เจคเฉเจ เจฌเจพเจ เจฆ เจเจฟเฉฐเจจเฉ เจฐเจฟเจเจพเจฐเจก "เจชเฉเจฐเจพเจฃเฉ" เจนเฉ เจเจ เจนเจจเฅค เจเจธ เจฒเจ, เจเจฆเฉเจ เจ เจธเฉเจ เจเจฟเจธเฉ เจตเฉ เจคเจฐเฉเจนเจพเจ เจเฉเจฌเจฒ เจฆเฉ เจชเฉเจฐเจเจฟเจฐเจฟเจ เจเจฐเจจ เจฆเจพ เจซเฉเจธเจฒเจพ เจเจฐเจฆเฉ เจนเจพเจ, เจเจฟเจธเฉ เจตเฉ เจธเจฅเจฟเจคเฉ เจตเจฟเฉฑเจ, เจธเจพเจจเฉเฉฐ เจชเจนเจฟเจฒเจพเจ เจเจธเจจเฉเฉฐ เจเจฒเจพเจเจฃเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ เจตเฉเจเฉเจฎ - เจตเฉเจเจฟเจเจฎ เจซเฉเจฒ เจฆเฉ เจเจฒเจ, เจเจน เจฐเฉเจก-เจฐเจพเจเจ เจกเฉเจเจพ เจฆเฉ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจจ เจตเจพเจฒเฉเจเจ เจธเจฎเจพเจจเจพเจเจคเจฐ เจชเฉเจฐเจเจฟเจฐเจฟเจเจตเจพเจ เจตเจฟเฉฑเจ เจฆเจเจผเจฒ เจจเจนเฉเจ เจฆเจฟเฉฐเจฆเจพ เจนเฉเฅค
เจเจธ เจฆเฉ เจจเจพเจฒ เจนเฉ, เจเจน เจเจนเจจเจพเจ เจตเจฟเฉฑเจเฉเจ เจเจผเจฟเจเจฆเจพเจคเจฐ เจเฉเจเจผเจพเจ เจจเฉเฉฐ เจคเฉเจฐเฉฐเจค เจธเจพเจซเจผ เจเจฐ เจธเจเจฆเจพ เจนเฉ เจเฉ เจ เจธเฉเจ เจนเจเจพเจเจฃเจพ เจเจพเจนเฉเฉฐเจฆเฉ เจนเจพเจเฅค เจนเจพเจ, เจ เจคเฉ เจเจธ เจเฉเจฌเจฒ 'เจคเฉ เจฌเจพเจ เจฆ เจฆเฉ เจธเจตเจพเจฒ เจธเจพเจกเฉ เจเฉเจฒ เจเจพเจฃเจเฉ "เจเจฐเจฎ เจเฉเจธเจผ" เจฆเฉเจเจฐเจพ, เจเฉ เจเจนเจจเจพเจ เจฆเฉ เจฎเจฟเจเจฆ เจจเฉเฉฐ เจเจเจพ เจฆเฉเจตเฉเจเจพ - เจ เจคเฉ, เจเจธเจฒเจ, เจธเจพเจกเฉ เจธเจฐเจตเจฟเจธเจฟเฉฐเจ เจเฉเจฐเจพเจเจเฉเจเจธเจผเจจ เจฆเฉเจเจฐเจพ เจฆเฉเจเจฟเจเจ เจจเฉเฉฐ เจฌเจฒเจพเจ เจเจฐเจจ เจฆเจพ เจเฉเฉฑเจฒ เจธเจฎเจพเจเฅค
#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 เจธเจพเจเจก เจเจพเจ 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