ืืฉืคืขืช ืื ืคืืืืช ืขื ืืืืืืช ืืืื ืืงืกืื ืืืืขื ืืจืืื ืืืื ืงืืืืช ืื ืจืง ื-Postgres. ืืฉื ื ืืจืืื ืืืชืืืื ืขื ืื ืืืืฅ ืืงืืคืกื, ืืื VACUUM FULL ืื CLUSTER, ืืื ืื ื ืืขืืื ืฉืืืื ืืช ืืืื ืืคืขืืื ืืืื ืื ืชืืื ื ืืชื ืืืฉืชืืฉ ืืื.
ืืืืืจ ืืืื ืชืืืืจืื ืงืื ื ืขื ืืืืคื ืฉืื ื ืคืืืืช ืืชืจืืฉืช, ืืืฆื ื ืืชื ืืืืืื ืื, ืขื ืืืืืฆืื ืืืืืื ืืืืขืืืช ืฉืื ืืืืืื ืืฉืืืืฉ ืืชืืกืฃ pg_repack.
ืืืืจ ืื ื ืืชื ืขื ืืกืืก
ืืืืข ืืชืจืืฉืช ื ืคืืืืช?
Postgres ืืืืกืก ืขื ืืืื ืืจืืื ืืจืกืืืช (
ืืจืืจ ืฉืฆืจืื ืืืืกื ืืช ืื ืืืจืกืืืช ืืืื. Postgres ืขืืื ืขื ืืืืจืื ืขืืื ืืืจ ืขืืื ืืขืืื ืืื ืืืืืช ืืืื ืืืืืช ืฉื ื ืชืื ืื ืฉื ืืชื ืืงืจืื ืืืืืกืง ืื ืืืชืื. ืืืื ื ืกืชืื ืขื ืืืืื ืงืื ื ืืื ืืืืื ืืื ืื ืงืืจื.
ื ื ืื ืฉืืฉ ืื ื ืืืื ืฉืืืกืคื ื ืืืื ืืกืคืจ ืจืฉืืืืช. ื ืชืื ืื ืืืฉืื ืืืคืืขื ืืขืืื ืืจืืฉืื ืฉื ืืงืืืฅ ืฉืื ืืืืืกื ืช ืืืืื. ืืื ืื ืืจืกืืืช ืืืืช ืฉื ืฉืืจืืช ืืืืื ืืช ืืืจื ืืงืฆืืืช ืืืจืืช ืืืืจ commit (ืืืขื ืืคืฉืืืช, ื ื ืื ืฉืจืืช ืืืืืื ืืื Read Committed).
ืืืืจ ืืื ืขืืื ื ืืช ืืื ืืขืจืืื, ืืืื ืกืืื ื ืืช ืืืจืกื ืืืฉื ื ืืื ืจืืืื ืืืช ืืืชืจ.
ืฉืื ืืืจ ืฉืื, ืขืืืื ืืืืืงื ืฉื ืืจืกืืืช ืฉืืจื, ืืืขื ื ืืืฃ ืฉืื ืืืืฆืืช ืืื ืชืื ืื ืื "ืืื". ื ืชืื ืื ืืื ืืื ื ืืืืืื ืืืฃ ืขืกืงื.
ืืคืืกืืืจืก ืืฉ ืื ืื ืื
ืื ืืืืืื ืฉืื ื, ืื ืงืืืช ืืื ืืกืืืืช ืืืืื ืชืืื ืืืจืืืช ืืืจืืขื ืขืืืืื, ืืื ืจืง ืืฆื ืืื ื ืืืื ื ืชืื ืื ืืืื. ืืชืืฆืื ืืื, ืืขืช ืืืฉื ืืืืื, ืื ื ื ืงืจื ืืจืื ืืืชืจ ื ืชืื ืื ืืื ืืจืฉ.
ืื ืื VACUUM ืชืืืง ืืขืช ืืช ืื ืืจืกืืืช ืืฉืืจืืช ืืื ืจืืืื ืืืืช, ืืืฆื ืื ืืฉืชืคืจ ืืืืคื ืืจืืื. ืืืื ืื ื ืืงืื ืคื ืื ืืืคืื ืื ืืคืืื ืืืคืื ืฉืืืื ืืฉืืจืืช ืืืฉืืช, ืืื ืขืืืื ื ืงืจื ืืืชืจ ื ืชืื ืื ืืื ืืจืฉ.
ืืื, ืื ืขืืื ืจืืง ืืืืืืื (ืืฉื ื ืืืืืื ืฉืื ื) ืืื ืืกืืฃ ืืงืืืฅ, ืื VACUUM ืืื ืืกืืื ืืืชืื ืืืชื. ืืื ืขืืฉืื ืืื ืืืืฆืข, ืื ืื ืืคืฉืจ ืืขืฉืืช ืืืชื ืืืื.
ืืืฉืจ ืืกืคืจ ืืืคืื ืืจืืงืื ืื ืืื ืืืื ืืืคื ืืืืื, ืื ืฉื ืงืจื bloat, ืื ืืชืืื ืืืฉืคืืข ืขื ืืืืฆืืขืื.
ืื ืื ืฉืชืืืจ ืืขืื ืืื ืืืื ืืงื ืฉื ืืชืจืืฉืืช ื ืคืืืืช ืืืืืืืช. ืืืื ืืงืกืื ืื ืงืืจื ืืขืจื ืืืืชื ืืืคื.
ืืฉ ืื ื ืคืืืืช?
ืืฉื ื ืืกืคืจ ืืจืืื ืืงืืืข ืื ืืฉ ืื ื ืคืืืืช. ืืจืขืืื ืฉื ืืจืืฉืื ืืื ืืืฉืชืืฉ ืืกืืืืกืืืงื ืคื ืืืืช ืฉื Postgres, ืืืืืื ืืืืข ืืฉืืขืจ ืขื ืืกืคืจ ืืฉืืจืืช ืืืืืืืช, ืืกืคืจ ืฉืืจืืช "ืืืืช" ืืื'. ืืชื ืืืื ืืืฆืื ืืจืืืฆืืืช ืจืืืช ืฉื ืกืงืจืืคืืื ืืืื ืื ืืืื ืืจื ื. ืืงืื ื ืืืกืืก
ืืจื ื ืืกืคืช ืืื ืืืฉืชืืฉ ืืชืืกืฃ
ืื ื ืจืืืื ืขืจื ื ืคืืืืช ืงืื, ืขื 20%, ืืงืืื. ืื ืืืื ืืืืืฉื ืืื ืืืื ืฉื fillfactor ืขืืืจ
ืืจืืื ืืืืืื ืื ืคืืืืช
ื-Postgres ืืฉ ืืื ืืจืืื ืืืชืืืื ืขื ื ืคืืืืช ืืืืฅ ืืงืืคืกื, ืืื ืื ืื ืชืืื ืืชืืืืืช ืืืืื.
ืืืืจ ืืช AUTOVACUUM ืื ืฉืื ืชืชืจืืฉ ื ืคืืืืช. ืื ืืืชืจ ืืืืง, ืืฉืืืจ ืืช ืื ืืจืื ืืืงืืืืช ืขืืื. ืื ื ืจืื ืืื ืขืฆื "ืฉื ืืงืคืื", ืืื ืืืฆืืืืช ืื ืื ืชืืื ืงื ืืืฉืื. ืืืืืื, ืืฉ ืื ืคืืชืื ืคืขืื ืขื ืฉืื ืืืื ืงืืืขืื ืืกืืืืช ืื ืชืื ืื, ืื ืฉืืชืืฆืขืช ืืขืืจืช ื ืชืื ืื ืืืฉืื. ืืชืืฆืื ืืื, ืคืจืืคืื ืืืขืื ื ืฉืื ืขืฉืื ืืืฉืชื ืืช ืืขืชืื ืงืจืืืืช ืืืฉืชื ื ืืืจื ืืื ืืืืื ืืืืื. ืื ืืืืจ ืฉืืชื ืฆืจืื ืื ืืืื ืืขืืื ืงืฆืช ืงืืืื ืืืืชืืื ืืช AUTOVACUUM ืืคืจืืคืื ืืืฉืชื ื ืฉื ืื ืฉืืืื. ืืื ืืจืืจ ืฉืื ืื ืงื ืืขืฉืืช.
ืกืืื ื ืคืืฆื ื ืืกืคืช ืืื ืฉ-AUTOVACUUM ืื ืืืื ืืขืืื ืืงืฆื ืฉื ืืืืืืช ืืื ืืืื ืฉืืฉ ืขืกืงืืืช ืืจืืืืช ืืืื ืฉืืื ืขืืช ืืื ื ืื ืงืืช ืืช ืื ืชืื ืื ืืืืื ืื ืืืืชื ืขืกืงืืืช. ืื ืืืืืฆื ืืื ืืจืืจื - ืืืคืืจ ืืขืกืงืืืช "ืืชื ืื ืืืช" ืืืืขืจ ืืช ืืื ืืขืกืงืืืช ืืคืขืืืืช. ืืื ืื ืืขืืืก ืขื ืืืคืืืงืฆืื ืฉืื ืืื ืืืืื ืฉื OLAP ื-OLTP, ืื ืืชื ืืืื ืื ืืื ืืช ืืงืื ืขืืืื ืื ืชืืืคืื ืืฉืืืืชืืช ืงืฆืจืืช, ืืื ืื ืคืขืืืืช ืืจืืืืช ืืืื - ืืืฉื, ืื ืืืช ืืื. ืืืฆื ืืื ืืืื ืืืฉืื ืขื ืคืืืืจ ืืขืืืก ืขื ืืกืืกืื ืฉืื ืื, ืื ืฉืืืคืฉืจ ืืืื ืื ืขืืื ืืืชืจ ืฉื ืื ืืื ืืื.
ืืืืื ื ืืกืคืช - ืื ืื ืืคืจืืคืื ืืื ืืืืืื ื, ืืื ืืกื ืื ืชืื ืื ื ืืฆื ืืขืืืก ืืืื ืืืื, ืื ืืคืืื ื-AUTOVACUUM ืืืืจืกืืื ืืืืชืจ ืขืืื ืื ืืืชืืืื, ืืชืชืจืืฉ ื ืคืืืืช. ืงื ื ืืืื (ืื ืื ืื ืืืคืงื) ืืื ืืคืชืจืื ืืืืื.
ืื ืืขืฉืืช ืืืฆื ืฉืื ืืืืจืชื AUTOVACUUM, ืืื ืื ืคืืืืช ืืืฉืืื ืืืืื.
ืงืืืฆื ืืืงืื ืืื ืืื ื ืืืืฉ ืืช ืืชืืื ืฉื ืืืืืืช ืืืื ืืงืกืื ืืืฉืืืจ ืืื ืจืง ื ืชืื ืื ืจืืืื ืืืื. ืืื ืืื ืืข bloat, ืื ืขืืื ืืฆืืจื ืืืฉืืืช, ืืื ืืืืื ืืืืฆืืข ืฉืื ื ืงืื ื ืขืืื ืืืขืืืช ืขื ืืฉืืืื (AccessExclusiveLock), ืฉืื ืืืคืฉืจ ืืืฆืืข ืฉืืืืชืืช ืืืืื ืื, ืืคืืื ืืืืจ. ืื ืืชื ืืืื ืืืจืฉืืช ืืขืฆืื ืืืคืกืืง ืืช ืืฉืืจืืช ืฉืื ืื ืืืง ืืื ื ืืืื ืื (ืืขืฉืจืืช ืืงืืช ืขื ืืกืคืจ ืฉืขืืช ืชืืื ืืืืื ืืกืืก ืื ืชืื ืื ืืืืืืจื ืฉืื), ืื ืืคืฉืจืืช ืื ืืื ืืืืื ืืืืชืจ. ืืืจืื ืืฆืขืจ, ืืื ืื ื ืืื ืืืคืขืื ืืช VACUUM FULL ืืืืื ืืชืืืืงื ืืืชืืื ื ืช, ืืืื ืฉืืื ืื ืืื ื ืืชืืืื ืื ื.
ืงืืืฆื CLUSTER ืืื ื ืืืืฉ ืืช ืชืืื ืืืืืืืช ืืืืชื ืืืคื ืืื VACUUM FULL, ืื ืืืคืฉืจ ืืฆืืื ืืื ืืงืก ืืคืื ืื ืชืื ืื ืืืืื ื ืคืืืืช ืืืืกืง (ืื ืืขืชืื ืืกืืจ ืื ืืืืื ืืฉืืจืืช ืืืฉืืช). ืืืฆืืื ืืกืืืืื, ืืืื ืืืคืืืืืืฆืื ืืืื ืขืืืจ ืืกืคืจ ืฉืืืืชืืช - ืขื ืงืจืืืช ืจืฉืืืืช ืืจืืืืช ืืคื ืืื ืืงืก. ืืืืกืจืื ืฉื ืืคืงืืื ืืื ืืื ืฉื VACUUM FULL - ืืื ื ืืขืืช ืืช ืืืืื ืืืื ืืคืขืืื.
ืงืืืฆื REINDEX ืืืื ืืฉื ืืื ืืงืืืืื, ืื ืืื ื ืืืืฉ ืืื ืืงืก ืกืคืฆืืคื ืื ืืช ืื ืืืื ืืงืกืื ืฉื ืืืืื. ืืื ืขืืืื ืืขื ืืืฉืื ืืืชืจ: ShareLock ืขื ืืืืื (ืืื ืข ืฉืื ืืืื, ืื ืืืคืฉืจ ืืืืจื) ื-AccessExclusiveLock ืขื ืืืื ืืงืก ืฉื ืื ื ืืืืฉ (ืืืกื ืฉืืืืชืืช ืืืืฆืขืืช ืืื ืืงืก ืื). ืขื ืืืช, ืืืจืกื ื-12 ืฉื Postgres ืืืคืืข ืคืจืืืจ
ืืืจืกืืืช ืงืืืืืช ืฉื Postgres, ืืชื ืืืื ืืืฉืื ืชืืฆืื ืืืื ื-REINDEX ืื-ืืื ืืช ืืืืฆืขืืช
ืืคืืื, ืื ืขืืืจ ืืื ืืงืกืื ืืฉ ืืจืืื ืืืกื ืืช ืื ืคืืืืช "ืขื ืืืืื", ืื ืืื ืืืื ืขืืืจ ืืืืืืช. ืืื ื ืื ืกืืช ืืชืืื ื ืืจืืืืช ืืืฆืื ืืืช ืฉืื ืืช:
ืืื pg_repack ืขืืื
ื ื ืื ืฉืืฉ ืื ื ืืืื ืจืืืื ืืืืจื - ืขื ืืื ืืงืกืื, ืืืืืืช ืืืฆืขืจื ืขื ื ืคืืืืช. ืืฉืื ืืจืืฉืื ืฉื pg_repack ืืื ืืืฆืืจ ืืืืช ืืืื ืืืืกืื ื ืชืื ืื ืขื ืื ืืฉืื ืืืื ืืืื ืฉืืื ืคืืขืืช. ืืืจืืืจ ืืฉืืคื ืืช ืืฉืื ืืืื ืืืื ืขืืืจ ืื ืืืกืคื, ืขืืืื ืืืืืงื. ืืืืจ ืืื ื ืืฆืจืช ืืืื, ืืืื ืืื ืืืงืืจืืช ืืืื ื, ืื ืืื ืืื ืืงืกืื ืืืืืืืช, ืืื ืื ืืืื ืืช ืชืืืื ืืื ืกืช ืื ืชืื ืื.
ืืืืจ ืืื, pg_repack ืืขืืืจ ืืช ืื ืชืื ืื ืืืืืื ืืืฉื ื ืืืืื ืืืืฉื, ืืกื ื ืืืืืืืืช ืืช ืื ืืฉืืจืืช ืืื ืจืืืื ืืืืช, ืืืืืจ ืืื ืืืฆืจ ืืื ืืงืกืื ืืืืื ืืืืฉื. ืืืืื ืืืฆืืข ืื ืืคืขืืืืช ืืืื, ืฉืื ืืืื ืืฆืืืจืื ืืืืืช ืืืืื.
ืืฉืื ืืื ืืื ืืขืืจืช ืืฉืื ืืืื ืืืืื ืืืืฉื. ืืืืืจื ืืชืืฆืขืช ืขื ืคื ื ืืกืคืจ ืืืืจืฆืืืช, ืืืืฉืจ ื ืืชืจื ืคืืืช ื-20 ืขืจืืื ืืืืืช ืืืืื, pg_repack ืจืืืฉ ื ืขืืื ืืืงื, ืืขืืืจ ืืช ืื ืชืื ืื ืืขืืื ืืื ืืืืชืจ ืืืืืืฃ ืืช ืืืืื ืืืฉื ื ืืืืฉื ืืืืืืืช ืืขืจืืช Postgres. ืื ืืืื ืืืืื ืืืงืฆืจ ืืืื ืฉืื ืื ืชืืื ืืขืืื ืขื ืืฉืืืื. ืืืืจ ืืื, ืืืืื ืืืฉื ื ืืืืืื ืขื ืืืืื ืื ื ืืืงืืช ืืืชืคื ื ืืงืื ืืืขืจืืช ืืงืืฆืื. ืืชืืืื ืืืฉืื.
ืืื ื ืจืื ืืฆืืื ืืชืืืืจืื, ืืื ืื ืงืืจื ืืคืืขื? ืืืงื ื ืืช pg_repack ืืื ืขืืืก ืืชืืช ืขืืืก, ืืืืงื ื ืืช ืคืขืืืชื ืืืงืจื ืฉื ืขืฆืืจื ืืืงืืืช (ืืืืืื ืืืจืืช, ืืืืฆืขืืช Ctrl+C). ืื ืืืืืงืืช ืืื ืืืืืืืช.
ืืืื ื ืืื ืืช ืืืืื - ืืื ืืื ืื ืืื ืืื ืฉืฆืืคืื ื.
ืคื ืงืืืง ืจืืฉืื ืืืืฆืข
ืืืฉืืื ืืจืืฉืื ืงืืืื ื ืฉืืืื ืืืื ืืคืจื ืฉื ืืืืืฅ ืืืืืื:
$ ./pg_repack -t tablename -o id
INFO: repacking table "tablename"
ERROR: query failed:
ERROR: duplicate key value violates unique constraint "index_16508"
DETAIL: Key (id, index)=(100500, 42) already exists.
ืืืืืื ืื ืืื ืฉื ืฉื ืืฆืจ ืืืืืืืืช index_16508 - ืืื ื ืืฆืจ ืขื ืืื pg_repack. ืขื ืกืื ืืชืืื ืืช ืืืืืืืช ืืืจืืื, ืงืืขื ื ืืช ืืืืืืฅ "ืฉืื ื" ืืชืืื ืื. ืืชืืจืจ ืฉืืืขืื ืืื ืฉืื ืืืืืจ ืืืืืื ืจืืืื ืืืืืืื, ืืื ืืืืืื ื ืืืืช (
ืืืืืฆืื ืืืืืื: ืืืืข ืื ื ืืืฆืื ืืืืฆื ืื ืคืืขืืื
ืชืืืืจืื ืงืื ื ืืืื ืืืืืืช ืืืืืืช.
ืืื ื ืืื ืืืืื ืคืฉืืื: ืืฉ ืื ื ืกืคืจ ืขืืื ืืืืื ืฉื ืืืื ืืืช ืขื ืฉืชื ืชืืื ืืช - ืฉื ืืกืืจ ืืืืื ืืช ืืกืคืจืืื.
create table cars
(
name text constraint pk_cars primary key,
ord integer not null constraint uk_cars unique
);
ื ื ืื ืฉืืืื ื ืฆืจืืืื ืืืืืืฃ ืืช ืืืืื ืืช ืืจืืฉืื ื ืืืฉื ืืื. ืืคืชืจืื ืืคืฉืื ืืื ืืขืืื ืืช ืืขืจื ืืจืืฉืื ืืฉื ื, ืืืฉื ื ืืจืืฉืื:
begin;
update cars set ord = 2 where name = 'audi';
update cars set ord = 1 where name = 'bmw';
commit;
ืืื ืืืฉืจ ืื ื ืืจืืฆืื ืืช ืืงืื ืืื, ืื ื ืืฆืคืื ืืืคืจืช ืืืืืฅ ืืืืืื ืฉืกืืจ ืืขืจืืื ืืืืื ืืื ืืืืืื:
[23305] ERROR: duplicate key value violates unique constraint โuk_carsโ
Detail: Key (ord)=(2) already exists.
ืืื ืื ื ืืืื ืืขืฉืืช ืืช ืื ืืืจืช? ืืคืฉืจืืช ืจืืฉืื ื: ืืืกืฃ ืชืืืืฃ ืขืจื ื ืืกืฃ ืืืืื ื ืฉืืืืืืช ืฉืื ืชืชืงืืื ืืืืื, ืืืฉื "-1". ืืชืื ืืช, ืื ื ืงืจื "ืืืืคืช ืขืจืืื ืฉื ืฉื ื ืืฉืชื ืื ืืจื ืฉืืืฉื". ืืืืกืจืื ืืืืื ืฉื ืฉืืื ืื ืืื ืืขืืืื ืื ืืกืฃ.
ืืคืฉืจืืช ืฉื ืืื: ืขืฆื ืืืืฉ ืืช ืืืืื ืืื ืืืฉืชืืฉ ืืกืื ื ืชืื ืื ืฉื ื ืงืืื ืฆืคื ืขืืืจ ืขืจื ืืกืืจ ืืืงืื ืืกืคืจืื ืฉืืืื. ืืืืจ ืืื, ืืขืช ืขืืืื ืืขืจื ื-1, ืืืฉื, ื-2.5, ืืขืจื ืืจืืฉืื "ืชืขืืื" ืืืืืืืืช ืืื ืืฉื ื ืืฉืืืฉื. ืืคืชืจืื ืืื ืขืืื, ืืื ืืฉ ืฉืชื ืืืืืืช. ืจืืฉืืช, ืื ืื ืืขืืื ืขืืืจื ืื ืืขืจื ืืฉืืฉ ืืืคืฉืื ืืืืฉืง. ืฉื ืืช, ืืืชืื ืืืืืง ืกืื ืื ืชืื ืื, ืืืื ืื ืืกืคืจ ืืืืื ืฉื ืืืกืคืืช ืืคืฉืจืืืช ืืคื ื ืืืฉืื ืืืืฉ ืฉื ืืขืจืืื ืฉื ืื ืืจืฉืืืืช.
ืืคืฉืจืืช ืฉืืืฉืืช: ืืืคืื ืืช ืืืืืืฅ ืืืืืช ืื ืฉืืื ืืืืืง ืจืง ืืืื ืืืชืืืืืืช:
create table cars
(
name text constraint pk_cars primary key,
ord integer not null constraint uk_cars unique deferrable initially deferred
);
ืืืืืื ืฉืืืืืืื ืฉื ืืืงืฉื ืืจืืฉืื ืืช ืฉืื ื ืืืืื ืฉืื ืืขืจืืื ืื ืืืืืืืื ืืืื ืืืชืืืืืืช, ืื ืืฆืืื.
ืืืืืื ืฉื ืืืื ื ืืขืื ืืื, ืืืืื, ืืืื ืกืื ืชืืืช, ืืื ืืื ืืืฉืคืช ืืช ืืจืขืืื. ืืืคืืืงืฆืื ืฉืื ื, ืื ื ืืฉืชืืฉืื ืืืืืืฆืื ืืืืืื ืืื ืืืืฉื ืืืืืงื ืฉืืืจืืืช ืขื ืคืชืจืื ืืชื ืืฉืืืืช ืืืฉืจ ืืฉืชืืฉืื ืื ืืื ืืช ืขืืืืื ืขื ืืืืืืงืื ืืืืื'ื ืืฉืืชืคืื ืืืื. ืฉืืืืฉ ืืืืืืืช ืืืื ืืืคืฉืจ ืื ื ืืืคืื ืืช ืงืื ืืืคืืืงืฆืื ืืคืฉืื ืืืชืจ.
ืืืืคื ืืืื, ืืืชืื ืืกืื ืืืืืืฅ, ื-Postgres ืืฉ ืฉืืืฉ ืจืืืช ืฉื ืคืืจืื ืืืืืงืชื: ืจืืืช ืฉืืจื, ืขืกืงื ืืืืืื.
ืืงืืจ:
CHECK ื- NOT NULL ืชืืื ืืกืืื ืื ืืจืืช ืืฉืืจื; ืขืืืจ ืืืืืืช ืืืจืืช, ืืคื ืฉื ืืชื ืืจืืืช ืืืืืื, ืืฉื ื ืืคืฉืจืืืืช ืฉืื ืืช. ืืชื ืืืื ืืงืจืื ืขืื
ืืกืืืื ืงืฆืจ, ืืืืืฆืื ืืืืืื ืืืกืคืจ ืืฆืืื ืืกืคืงืื ืงืื ืงืจืื ืืืชืจ ืืคืืืช ืคืงืืืืช. ืขื ืืืช, ืืชื ืฆืจืื ืืฉืื ืขื ืื ืขื ืืื ืกืืืื ืฉื ืชืืืื ืืืชืืจ ืืืืืื, ืฉืื ืืจืืข ืฉืื ืืชืจืืฉืช ืืฉืืืื ืืืจืืข ืฉืื ืืชื ืืืื ืขื ืื ืืืคืจืืื ืืืื. ืืขืื ืืคืฉืจืืช ื ืืกืคืช ืืื ืฉืืืชืืื ืื ืชืืื ืืืื ืืื ืืช ืชืืื ืืช ืืืคืืืืืืช ืื ืืืงืฉื ืืจืืื ืืืืืืฅ ืืืื.
ืฉืืคืืจ ืฉื pg_repack
ืกืงืจื ื ืืื ืืืืืฆืื ืืืืืื, ืืื ืืื ืื ืงืฉืืจืื ืืืขืื ืฉืื ื? ืืืื ื ืืืืจ ืืช ืืฉืืืื ืฉืงืืืื ื ืงืืื ืืื:
$ ./pg_repack -t tablename -o id
INFO: repacking table "tablename"
ERROR: query failed:
ERROR: duplicate key value violates unique constraint "index_16508"
DETAIL: Key (id, index)=(100500, 42) already exists.
ืื ืืชืจืืฉ ืืืฉืจ ื ืชืื ืื ืืืขืชืงืื ืืืืืช ืืืื ืืืืื ืืืฉื. ืื ื ืจืื ืืืืจ ืื... ืื ืชืื ืื ืืืืืช ืืืืื ืืืืืืื ืืื ืขื ืื ืชืื ืื ืืืืืช ืืืงืืจ. ืื ืื ืขืืืืื ืืืืืืฆืื ืฉื ืืืืื ืืืงืืจืืช, ืืื ืื ืืืืืื ืืืคืจ ืืช ืืืชื ืืืืืืฆืื ืืืืื ืืืืฉื?
ืืคื ืฉืืชืืจืจ, ืฉืืจืฉ ืืืขืื ืืืื ืืฉืื ืืงืืื ืฉื pg_repack, ืฉืืืฆืจ ืจืง ืืื ืืงืกืื, ืื ืื ืืืืืฆืื: ืืืืื ืืืฉื ื ืืื ืืืืืฅ ืืืืืื, ืืืืืฉื ืืฆืจื ืืื ืืงืก ืืืืืื ืืืงืื.
ืืฉืื ืืฆืืื ืืื ืฉืื ืืืืืืฅ ื ืืจืืื ืืื ื ืืื, ืื ืืืื ืืืืืืื ืฉื ืืฆืจ ืืืงืื ืฉืืื ืขืจื ืืืืืืฅ ืืื, ืืืืืื ืืืืืฆืื ืืืืืืืื ื-Postgres ืืืืฉืืื ืขื ืืื ืืฆืืจืช ืืื ืืงืก ืืืืืื. ืืื ืืืงืจื ืฉื ืืืืืฅ ืืืื, ืืืชื ืืืืช ืืื ื ืืื, ืืืืืื ืฉืื ื ืืชื ืืืืืช ืืช ืืืื ืืงืก ืืืื ืชืืื ืืกืืื ืืืื ืืืฆืืข ืืคืงืืื sql.
ืืคืืื, ืืืืช ืืืขืื ื ืขืืฆื ื"ืืฉืืื" ืฉื ืืืืืงื: ืืืืื ืืืงืืจืืช ืืื ืืชืจืืฉืช ืืืื ื-commit, ืืืืืื ืืืืฉื ืืืื ืืืฆืืข ืืคืงืืื sql. ืืืฉืืขืืช ืืื ืฉืขืืื ื ืืืืื ืฉืืืืืงืืช ืืืืฆืขืืช ืืื ืืฉื ื ืืืงืจืื: ืื ืชืืื ืืืืืืจ, ืื ืชืืื ืืื.
ืื ืืืื ืจืขืืื ืืช ืืื ืื ื?
ืฆืืจ ืืื ืืงืก ืืืื ืืืืื
ืืจืขืืื ืืจืืฉืื ืืื ืืืฆืข ืืช ืฉืชื ืืืืืงืืช ืืืฆื ืืืืื. ืื ืขืืื ืืืฆืืจ ืืกืคืจ ืืืืืืช ืืืืืืืช ืืืืืืช, ืืื ืื ืืฉ ืืขื ืืื, ืื ืื ืืืืจ ืืืฉืคืืข ืขื ืขืืืืช ืืืฉืชืืฉืื, ืฉืื ืืชื ืืฉืืืืช ืืืื ืื ืืฆื ื ืืจืืื ืขืืืจื. ืื ืืชืจืืฉืื, ืืืฉื, ืืืฉืจ ืฉื ื ืืฉืชืืฉืื ืืชืืืืื ืืขืจืื ืืช ืืืชื ืืืฉืืืื ืื ืืื ืืช, ืืืืงืื ืฉื ืืืฉืชืืฉ ืืฉื ื ืืื ืืื ืืงืื ืืืืข ืฉืืืืืื'ื ืืืจ ืืกืื ืืขืจืืื ืขื ืืื ืืืฉืชืืฉ ืืจืืฉืื. ืืืฆื ืืื, ืืฉืจืช ืืกืจื ืืืฉืชืืฉ ืืฉื ื, ืืืืงืื ืฉืื ืืืืืจ ืืช ืืฉืื ืืืื ืืืืกื ืืช ืืืืืื'ื. ืงืฆืช ืืืืืจ ืืืชืจ, ืืฉืืืฉืชืืฉ ืืจืืฉืื ืืกืืื ืืช ืืขืจืืื, ืืฉื ื ืืงืื ืืืืข ืฉืืืืืื'ื ืืืจ ืื ืืกืื ืืืืื ืืืืืจ ืขื ืืคืขืืื ืฉืื.
ืืื ืืืืืื ืฉืืืืืืืช ืืืื ืชืืื ืืืฆื ืื ื ืืื, ืืฆืจื ื ืืื ืืงืก ืืืฉ ืืืืื ืืืืืืฅ ืื ืืื ืืืงืืจื:
CREATE UNIQUE INDEX CONCURRENTLY uk_tablename__immediate ON tablename (id, index);
-- run pg_repack
DROP INDEX CONCURRENTLY uk_tablename__immediate;
ืืกืืืืช ืืืืืงื, ืงืืืื ื ืจืง ืืื ืฉืืืืืช ืฆืคืืืืช. ืึทืฆืึธืึธื! ืืจืฆื ื ืฉืื ืืช pg_repack ืืืคืงื ืืงืืืื ื 5 ืฉืืืืืช ืืืฉืืื ืืจืืฉืื ืชืื ืฉืขื ืฉื ืขืืืื. ืื ืชืืฆืื ืืงืืืืช. ืขื ืืืช, ืืืจ ืืืฉืืื ืืฉื ื ืืกืคืจ ืืฉืืืืืช ืืื ืืฉืืขืืชืืช ืื ืืืฆื ื ืืืคืกืืง ืืช pg_repack.
ืืื ืื ืงืจื? ืืกืืืจืืช ืืืชืจืืฉืืช ืฉืืืื ืชืืืื ืืืื ืืฉืชืืฉืื ืขืืืืื ืขื ืืืชื ืืืืื'ืืื ืื ืืื ืืช. ืืื ืื ืจืื, ืืืืชื ืจืืข ืืื ืืจืื ืคืืืช ืฉืื ืืืื ืชืืจืืชืืื ืขื ืื ืชืื ืื ืืืืืืกื ืื ืืืฉืืื ืืจืืฉืื ืืืฉืจ ืืืืจืื, ืืืืืจ. ืคืฉืื ืืื ืื ื "ืืื".
ืืจืขืืื ืื ืขืื. ืืฉืื ืื, ืจืืื ื ืฉื ื ืคืชืจืื ืืช ื ืืกืคืื: ืืชืื ืืืืฉ ืืช ืงืื ืืืืฉืื ืฉืื ื ืืื ืืืืชืจ ืขื ืืืืืฆืื ืืืืืื, ืื "ืืืื" ืืช pg_repack ืืขืืื ืืืชื. ืืืจื ื ืืฉื ื.
ืืืืฃ ืืื ืืงืกืื ืืืืื ืืืืฉื ืืืืืืฆืื ืืืืืื ืืืืืื ืืืงืืจืืช
ืืืจืช ืืขืืืื ืืืืชื ืืจืืจื - ืื ืืืืื ืืืงืืจืืช ืืฉ ืืืืืฅ ืืืื, ืื ืขืืืจ ืืืืฉ ืืชื ืฆืจืื ืืืฆืืจ ืืืืืฅ ืืื, ืืื ืืื ืืงืก.
ืืื ืืืืืง ืืช ืืฉืื ืืืื ืฉืื ื, ืืชืื ื ืืืื ืคืฉืื:
- ืืืื ืขื ืืืืืฅ ืืืื ืืจืฉืืื ืืืช;
- ืืื ืก ื ืชืื ืื ืืืืืื ืฉืืชื ืืฉืช ืขื ืจืฉืืื ืงืืืืช;
- ืืฆืข ืขืืืื - ืื ืชืื ืื ืืื ื ืืชื ืืฉืื ืืืชืจ;
- ืืืฆืข ืืช ืืฉืื ืืืื.
create table test_table
(
id serial,
val int,
constraint uk_test_table__val unique (val) deferrable initially deferred
);
INSERT INTO test_table (val) VALUES (0);
FOR i IN 1..10000 LOOP
BEGIN
INSERT INTO test_table VALUES (0) RETURNING id INTO v_id;
UPDATE test_table set val = i where id = v_id;
COMMIT;
END;
END LOOP;
ืืืจืกื ืืืงืืจืืช ืฉื pg_repack ืชืืื ืงืจืกื ืืืืกืคื ืืจืืฉืื ื, ืืืจืกื ืฉืฉืื ืชื ืขืืื ืืื ืฉืืืืืช. ืืืื.
ืื ืื ื ืืืืืื ืืืืฆืืจ ืืฉืื ืืงืืืื ืฉืืืื ืืืืชื ืฉืื ืฉื ืืขืชืงืช ื ืชืื ืื ืืืืืช ืืืืื ืืืื ืืืฉ:
$ ./pg_repack -t tablename -o id
INFO: repacking table "tablename"
ERROR: query failed:
ERROR: duplicate key value violates unique constraint "index_16508"
DETAIL: Key (id, index)=(100500, 42) already exists.
ืืฆื ืงืืืกื: ืืื ืขืืื ืืกืืืืืช ืืืืงื, ืืื ืื ืืืืฆืืจ?!
APPLY_COUNT ืืืฆืืืช ืฉื ืฉืชื ืงืืืฆืืช
ืืชืืื ื ืื ืชื ืืช ืืงืื ืืืฉ ืฉืืจื ืืืจ ืฉืืจื ืืืืืื ื ื ืงืืื ืืฉืืื: ื ืชืื ืื ืืืขืืจืื ืืืืืช ืืืืื ืืืืฉื ืืืฆืืื, ืืงืืืข APPLY_COUNT ืืฆืืืข ืขื ืืืื ืืืฆืืื:
for (;;)
{
num = apply_log(connection, table, APPLY_COUNT);
if (num > MIN_TUPLES_BEFORE_SWITCH)
continue; /* there might be still some tuples, repeat. */
...
}
ืืืขืื ืืื ืฉืื ืชืื ืื ืืืืจื ืืงืฆืื ืืืงืืจืืช, ืฉืื ืืกืคืจ ืคืขืืืืช ืขืืืืืช ืืืคืจ ืืช ืืืืืืฅ, ืืฉืื ืืืขืืจืืช, ืืืืืื ืืืกืชืืื ืืฆืืืช ืฉื ืฉืชื ืืฆืืืช - ืืืฆืืช ืืืคืงืืืืช ืืชืืฆืขื ืืืฆืืื ืืจืืฉืื ื, ืืืืฆื ืืฉื ื. ืืฉื ืืื. ืืื ื, ืชืืื ืืืื ืฉืื: ืื ืืงืืืฆืืช ืื ืืคืจืืช ืฉืื ืืืจ ืืื ื ืืจืืฉืื ื, ืื ืืื ืืกืืจ, ืืื ืื ืื, ืืชืจืืฉืช ืฉืืืื.
APPLY_COUNT ืฉืืื ื-1000 ืจืฉืืืืช, ืื ืฉืืกืืืจ ืืืืข ืืืืืงืืช ืฉืื ื ืืื ืืืฆืืืืช - ืื ืื ืืืกื ืืช ืืืงืจื ืฉื "ืฆืืืช ืืฆืืื". ืืฉืชืืฉื ื ืืฉืชื ืคืงืืืืช - ืืืกืคื ืืขืืืื, ืื ืฉืืืืืง 500 ืืจื ืืงืฆืืืช ืฉื ืฉืชื ืคืงืืืืช ืชืืื ืืืฆืื ืืืฆืืื ืืื ื ืชืงืื ื ืืืขืืืช. ืืืืจ ืืืกืคืช ืืขืืืื ืืฉื ื, ืืขืจืืื ืฉืื ื ืืคืกืืงื ืืขืืื:
FOR i IN 1..10000 LOOP
BEGIN
INSERT INTO test_table VALUES (1) RETURNING id INTO v_id;
UPDATE test_table set val = i where id = v_id;
UPDATE test_table set val = i where id = v_id; -- one more update
COMMIT;
END;
END LOOP;
ืืื, ืืืฉืืื ืืืื ืืื ืืืืื ืฉืื ืชืื ืื ืืืืืื ืืืงืืจืืช, ืฉืฉืื ืชื ืืืจื ืืงืฆืื ืืืช, ืืืืขื ืืืืื ืืืืฉื ืื ืืชืื ืืจื ืืงืฆืื ืืืช.
ืกืืจืื ืืืฆืืื
ืืฉืื ืืื ืื ื ืฉื ื ืคืชืจืื ืืช. ืจืืฉืืช: ืืืื ื ืืืฉ ืืืืืืื ืืช ืืืืืงื ืืืฆืืืช ืื ืขืืืจ ื ืชืื ืื ืืขืกืงื ืืืช. ืืืชืจืื ืฉื ืคืชืจืื ืื ืืื ืืคืฉืืืช ืฉืื - ืฉืื ืืื ืืงืื ืื ืืจืฉืื ืืื ืืื ืืืืืื (ืืื, ืืืจืกืืืช ืืฉื ืืช ืืืชืจ pg_reorg ืขืื ืืืืืง ืื). ืืื ืืฉ ืืขืื - ืื ืื ื ืืืฆืจืื ืขืกืงื ืืจืืืช ืฉื ืื, ืืื, ืืืืืจ, ืืืื ืขื ืืืคืขืชื ืฉื ื ืคืืืืช ืืืฉื.
ืืคืชืจืื ืืฉื ื ืืืจืื ืืืชืจ, ืืื ืื ืจืื ื ืืื ืืืชืจ: ืฆืืจ ืขืืืื ืืืืืช ืืืืื ืขื ืืืื ืืขืกืงื ืฉืืืกืืคื ื ืชืื ืื ืืืืื. ืืืืจ ืืื, ืืืฉืจ ืื ื ืืขืชืืงืื ื ืชืื ืื, ืื ื ืืืืืื ืืงืืฅ ืืืชื ืืคื ืชืืื ื ืื ืืืืืื ืฉืืฉืื ืืืื ืืงืฉืืจืื ืืืขืืจืื ืืื. ืืืฆืืื ืชืืืืฆืจ ืืืกืคืจ ืขืกืงืืืช (ืื ืืืช ืืืืื) ืืืืืื ืืฉืชื ื ืืืชืื ืืืืืช ืื ืชืื ืื ืฉืฉืื ื ืืขืกืงืืืช ืืื. ืืฉืื ืืฆืืื ืื ืืืืจ ืฉื ืชืื ืื ืืขืกืงืืช ืฉืื ืืช ื ืื ืกืื ืืืืืช ืืืืื ืืกืืจ ืืงืจืื, ืื ื ืืชื ืืืื ืืงืจืื ืืืชื ืืจืฆืฃ, ืืคื ืฉืืื ืืขืืจ. seqscan ืขืืืจ ืื ืืงืฉื ืขื ืกืื ืื ืืคื tx_id ืืื ืืงืจ ืืื, ืืฉ ืฆืืจื ืืืื ืืงืก, ืืื ืื ืื ืืื ืืช ืืฉืืื ืืืื ืืชืงืืจื ืฉื ืืขืืืื ืฉืื. ืืืืคื ืืืื, ืืื ืชืืื, ืืชื ืฆืจืื ืืืงืจืื ืืฉืื.
ืื ืืืืื ื ืืืชืืื ืขื ืืืคืฉืจืืช ืืจืืฉืื ื, ืืืืืื ืฉืืื ืคืฉืืื ืืืชืจ. ืจืืฉืืช, ืืื ืฆืืจื ืืืืื ืืื ืขืกืงื ืืจืืื ืชืืืื ืืขืื ืืืืชืืช. ืืืืืื ืฉืืืขืืจื ืืขืืงืจืืช ืฉื ืื ืชืื ืื ืืืืืื ืืืฉื ื ืืืืฉื ืืชืจืืฉืช ืื ืืขืกืงื ืืืช ืืจืืื, ืืฉืืื ืืคืื ื"ืืื ื ืืืื ืืช ืืขืกืงื ืืื?" ืืฉื ืืขืกืงื ืืจืืฉืื ื ืชืืื ืืขืืงืจ ืืืืื ืืฉืืืื. ืืฉื ืืืื ืฉื ืืืฉ ืชืืื ืืืื ืฉืื ืืืื ืืฆืืืจืื ืืืืื ืืืืื ืืขืืจืช ืื ืชืื ืื, ืืืืืจ. ืขื ืขืืฆืืช ืืขืืืก. ืจืืฆืช pg_repack ืืชืจืืฉื ืืืื ืฉื ืขืืืก ืฉืืจืืช ืืื ืืืื, ืื ืคื ืืฉืื ืืืื ืืื ืงืื ืืืืคื ืื ืคืจืืคืืจืฆืืื ืื ืืืฉืืืื ืืืืื ืืืงืืจื ืฉื ืืืืื. ืืืืื ื ืฉืื ืื ื ืืืืืื ืืืื ืื ืืช ืืืื ืฉื ืขืกืงื ืืืฉื (ืืฉื ืืฉืืืื, ืืืืืฆืข ืื 1 ืฉืขื ื-2-3 ืืงืืช).
ืื ืืกืืืื ืืื ืืืืืืื. ืืฉืงื ืื ืืืคืงื. ืืฉื ืืืืืจืืช, ืื ื ืชืืื ื ืืืืื ืฉื ืืื ืืืกืืกื ืื ืชืื ืื ืืืืจ ืืืคืขืื:
ืืืืืื ืฉืืืื ื ืืจืืฆืื ืืืืืืื ืืืคืชืจืื ืืื, ืื ื ืืกืื ื ืืืืฉื ืืช ืืฉื ื, ืืื ืื ืื ื ืฉืืงืืื ืืคืฉืจืืช ืืืื ืื ืขื ืืคืชืื ืืืจืืื. ืืืจืกื ืื ืืืืืช ืฉืื ื, ืืืจืื ืืฆืขืจ, ืขืืืื ืื ืืืื ื ืืคืจืกืื, ืืืืืื ืฉืคืชืจื ื ืืช ืืืขืื ืจืง โโืืืืืืืช ืืืืืืช ืืืืืืืืช, ืืืฉืืื ืชืืงืื ืืื ืืฉ ืฆืืจื ืืกืคืง ืชืืืื ืืกืืืื ืืืจืื. ืื ื ืืงืืืื ืฉื ืืื ืืขืฉืืช ืืืช ืืขืชืื.
ืืืื ืืฉ ืื ืฉืืื, ืืื ืืืื ืืกืชืืื ื ืืกืืคืืจ ืืื ืขื ืืฉืื ืื ืฉื pg_repack, ืืื ืืฉืชืืฉื ื, ืืืฉื, ืืื ืืืืื ืฉืื? ืืฉืื ืืกืืื ืื ืืฉืื ื ืขื ืื, ืืื ืืืืืื ืืืืืืืช ืฉื ืฉืืืืฉ ืืืงืื ืืืชืจ, ืืืืืืืช ืืื ืืืืืฆืื ืืืืืื, ืื ืืขื ืืืชื ื ืื ืกืืช ืืืืื ืืช ืืืืช ืืืขืื ืืืชืงื ืืืชื. ืื ืืกืฃ, ืื ืฉืืืืฉ ืืคืชืจืื ืืช ืืืจืื ืืืจืฉ ืืื ืืขืจืืืช ืืืืงืืช, ืื ืืืืื ื ืฉืงืืื ืื ื ื ืกื ืืชืงื ืื ืืช ืืืขืื, ืืื ื ืืื ืฉืื ื ืืื ืืขืฉืืช ืืืช ืืืื ืกืืืจ, ืื ื ืชืืื ืืืกืชืื ืขื ืื ืืืืื .
ืืืฆืืื
ืื ืื ืื ื ืืืืืื ืืืืืืฅ โโืขื ืกืื ืื ืืกืืื ืฉืื ื:
- ืขืงืื ืืืจ ืื ืคืืืืช ืฉืื. ืืืชืืกืก ืขื ื ืชืื ื ื ืืืืจ, ืืชื ืืืื ืืืืื ืืืืื ืฆืืจื ืืืืืจืช ืืืืืงืื ืืืืืืืื.
- ืืืื ื ืืช AUTOVACUUM ืืื ืืฉืืืจ ืขื ืื ืคืืืืช ืืจืื ืืงืืืืช.
- ืื ืื ืคืืืืช ืขืืืื ืืืื ืืืชื ืื ืืืื ืืืชืืืจ ืขืืื ืืืืฆืขืืช ืืืื ืืืืฅ ืืงืืคืกื, ืื ืชืคืื ืืืฉืชืืฉ ืืืจืืืืช ืืืฆืื ืืืช. ืืขืืงืจ ืืืืืง ืืื ืืืื.
- ืื ืชืคืื ืืฉื ืืช ืคืชืจืื ืืช ืืืฆืื ืืื ืืื ืฉืืชืืืื ืืฆืจืืื ืฉืื - ืืคืขืืื ืื ืืืื ืืืืืช ืืขืื ืืืชืจ ืืืคืืื ืงื ืืืชืจ ืืืฉืจ ืืฉื ืืช ืืช ืืงืื ืฉืื.
ืืงืืจ: www.habr.com