α₯αααα·ααααααΆαα αΎαααααα
ααΎαα» αα·ααααααααααααααΌαααΆαααααααΆαααααΆαααΌααααΌααΆα α αΎαααΆαααααααΆααα·αααααΉααααα
αααα»α Postgres ααα»αααααααα ααΆααα·ααΈααΎααααΈαααααααΆαααΆα
ααααΈαααα’αα ααΌα
ααΆ VACUUM FULL α¬ CLUSTER ααα»αααααα½αααΆα
αΆαααααα»ααα‘α»ααααααααα·ααααα·ααΆα ααΌα
ααααα αΎααα·αα’αΆα
ααααΎααΆαααΆαα·α
αα
ααα
α’αααααααΉαααΆαααααΉααααΈααΌα
αα½αα’αααΈαααααααα αΎααααααΎαα‘αΎα αααααααα’αααα’αΆα
ααααααααΉαααΆ α’αααΈα§ααααααααααΆααααααΆαααα αα·ααααα αΆααααα½αααααΆααα
αααααΆαααααΎααααΆααααααααααααα pg_repack α
α’ααααααααααααΌαααΆαααααααααααα’ααααΎ
α ααα»α’αααΈααΆαααΆα αΎααααααΎαα‘αΎα?
Postgres ααΊααα’ααααΎααααΌαα α»αααα (
ααΆααααααα ααααααΆααα’αααααααααΌααααααΆαα»αα Postgres ααααΎαααΆαααΆαα½ααααααα’αααα αα αΆααααααααααα½α α αΎαααααααα½αααΊααΆα ααα½ααα·ααααααα’αααααααΆαααα’αΆα α’αΆαααΆαααΈααΆα α¬αααααα ααΌααααα‘ααααΎαα§ααΆα αααααΌα αα½αααΎααααΈαααααΈαααααααααΆααΎαα‘αΎαα
α αΌααα·ααΆαααΆααΎαααΆαααΆααΆααααααΎαααΆααααααααααααααααΆααΆα αααΎαα αα·ααααααααααΈααΆααααα αΆααααα½ααα αααα»ααααααααααΌαααα―αααΆααααααΆααΆαααααΌαααΆααααααΆαα»αα ααΆαααααααΊααΆααααααααααααΆαααααα½ααααααΆααααααΆααααααα·ααααα·ααΆααααααααααααααΆααααΈααΆαααααααααΆα α·ααααα½α (αααααΆααααΆαααΆαααα ααΎαααΉαααααααααΆααααα·αα―ααααΊ Read Committed)α
αααααΆααβαα ααΎαβααΆαβααααΎβαα
αα
α»ααααααααΆαβααΆαα»βαα½αβαααβαααααΆααβααααβα
αΆααβααΆβαα·αβααΆαααααααβαααβααα
αα½αααα αΆαααααα ααΆαααααΎαα
αα
α»ααααααααΆα αα·αααΆααα»ααααααα½α ααΎαααΆααααα
ααααααααααααααααα ααααΆαααααααΆααααα·ααααααααΊ "ααααΆα" α αα·ααααααααααα·αα’αΆα
ααΎαααΎαα
ααααααααα·ααααα·ααΆαααΆαα½αα‘αΎαα
Postgres ααΆαααααααΆααα½αα
ααΌα αααααααα»αα§ααΆα αααααααααΎα αααα»ααααααΆαα½α ααΆααΆαααΉαααΆααα½αααααα ααα»ααααααΆαααααΆαααααααΆαααα»ααααααααααΉαααΆααα·ααααααααααΆααα ααΆαααααααα αααα αΌαααααΎααΆααΆαααΎαααΉαα’αΆααα·ααααααα αααΎαααΆαααΆαα αΆαααΆα αα
αααααΈααΆα₯α‘αΌαααα VACUUM αα»ααααααα½ααααααααα·αααΆαααααααααΆααα’ααααααα ααααΆαααΆαααΉααα·ααααααΎαα‘αΎαααααΆαααααααα ααΎαααΉαααΆαααα αααααααα
αααα»αααααα α¬ααΌααααΈαααααααααΆααααΌααααααΆαααα½αααααΈ ααα»ααααααΎαααΉααα
ααα’αΆααα·ααααααα
αααΎαααΆαααΆαα
αΆαααΆα
αα
ααααα·ααΈααα ααααα·αααΎααααααααααΆαααααα»α (αααααααΈααΈααααα»αα§ααΆα αααααααααΎα) ααΊαα
α
α»ααααα
ααααα―αααΆαααα VACUUM ααΉαα’αΆα
ααΆααααΆααΆαα ααα»ααααβα₯α‘αΌαβααΆαβαα
βαααααΆα ααΌα
ααααβαα·αβα’αΆα
βααααΎβα’αααΈβααΆαα½αβααΆαβααΆαβα‘αΎαα
αα
ααααααα
ααα½ααααααααααα α¬αα·ααΆαααΆαααααΆααααααΆαααΆαα αααααααΌαααΆαααα α
ααΆα αΎαααα ααΆα
αΆααααααΎααααααΆαααααααααΎαααΆαα
α’αααΈααααααααΆααααααΆααα·αααααΆααΆαααΎααΊααΆααααααΆαααααΆαααΎαα‘αΎαααααΆαα αΎαααααα αααα»αααΆααΆαα αα αααα»ααα·αα·αααα ααΆααΎαα‘αΎαααΆαααααααΌα ααααΆα
ααΎαααα»αα αΎαααααα?
ααΆααα·ααΈααΆα
αααΎαααΎααααΈαααααααΆααΎα’αααααΆαα αΎαααααααα¬ααα αααα·αααΈαα½αααΊααααΌαααααΎαααα·αα· Postgres ααΆααααα»ααααααΆαααααααΆααααα αΆαααααα ααα’αααΈα
ααα½ααα½αααααααα»αααΆααΆα α
ααα½ααα½αααα "ααααααααΆαα" ααΆααΎαα α’αααα’αΆα
ααααΎαααΆααααααααα½αααΆα
αααΎαααααααααΈααααααααααα½α
ααΆααααα
αα
ααΎα’ααΈαααΊαα·αα ααΎαααΆαααααΆααΌαααααΆα
αα·ααΈαα½ααααααΊααααΎααααααααααα
ααΎααα·α
αΆαααΆαααααααααααΌα
αα½ααα αΌαααα 20% α’αΆα
ααα½αααααΆαα ααΆα’αΆα
ααααΌαααΆαα
αΆαααα»αααΆααΆ analogue αα fillfactor αααααΆαα
αα·ααΈααΎααααΈααααα»ααααααααΆααααΉαααΆαα αΎαααα
Postgres ααΆααα·ααΈααΆα αααΎαααΎααααΈαααααααΆαααΆαα αΎααααα ααααΈαααα’αα ααα»ααααααΆαα·ααααααααΆααααααααΆααααα»ααααααααααααΆαααααα
ααααααα ααΆαααααααα AUTOVACUUM ααΎααααΈαα»αα±ααα αΎαααα. α¬α αααΆααααΆαααααα ααα ααΎααααΈαααααΆααΆαα ααααα·ααααα’αΆα ααα½αααααΆααααααΆααα’αααα αααα αΆααααΈααΌα ααΆααααΌααααΆα "αααααΆααααα»α" ααα»ααααααΆααα·α ααΆαα·ααααααααΆααααα½ααααα»αααΆααααααα αααααα α§ααΆα ααα α’αααααΆαααΆαα’αα·αααααααααααααΆαα½αααΉαααΆαααααΆααααααΌαααΆαααααΆααα αααααααααααΆααααα·αααααα α¬ααααααααααΆαααααΆααααααΌααα·αααααααα½αα ααα½ααααα»αααΎαα‘αΎαα ααΆαααααα αααααααααα»αααααα’αααα’αΆα ααααΆααααααΌαααΆααΉαααΆαα α αΎαααΆααααααΆααΉααααααααα½αααΈααΆααΆααα½ααα ααΆααΆααα½αα αααααΆααααααΆα’αααααααΌαααααΎααΆααααααα αα»αααααα·α α αΎααααααααΌα AUTOVACUUM αα ααΉαααααααααααΆααααααΌαααααΆααΆαααΈαα½ααα ααα»ααααααΆααααααα ααααα·αααΆααααα½αααααΎαααααα
α ααα»ααααΌαα αα½ααααααα AUTOVACUUM αα·αα’αΆα αααααΆααΆααΆαααΆαααΊαααααΆαααααΆαααααα·ααααα·ααΆαααααΌααααααΆααΆααααΆααΈααΆααααα’αΆααα·αααααααααααΆααααααΆααααααα·ααααα·ααΆαααΆαααααα α’αα»ααΆααααα ααΈαααααααΆαααααααααααα - αααα αΆααααααα·ααααα·ααΆα "α ααααΌαα ααααα" αα·αααΆααααααααααααααΆααααααα·ααααα·ααΆααααααα ααα»ααααααααα·αααΎααΆααααα»ααα ααΎαααααα·ααΈααααα’αααααΊααΆααΌαααΆαααα OLAP αα·α OLTP αααα’αααα’αΆα ααααΎαα αα α»ααααααααΆαααΉαααΆαα αα·ααααα½αααααΈαααΆα αααΎααααα»ααααααααΆαααααΆ ααααΌα ααΆααααα·ααααα·ααΆαααααααααα - α§ααΆα ααα ααΆααααΆααααΆαααΆαααα αααα»αααααΆαααΆαααααααααΆααΆαααααααα·αα’αααΈααΆαααΈαααΆαααΆαααααα»ααα ααΌααΆααααΌαααααΆααααααααααΆαααααΉαα’αα»ααααΆαα±ααααΆαααΆααααααααΌαααααααααααααα½αααΆααΈαα½ααα
α§ααΆα ααααα½αααα - αααααΈααΆααααααααΆαααααααααΌα ααααΆααααα ααα»ααααααΌαααααΆααα·αααααααααα·ααα αααααααααα»αααααα ααΌααααΈαα AUTOVACUUM αααααααΆαααΆααααα»ααααα·αα’αΆα αααααααΆαααΆαααα α αΎαααΆαα αΎααααααΉαααΎαα‘αΎαα ααΆαααααΎααΆαααααααΆα (αααααα¬ααααα) ααΊααΆαααααααααΆααααα½ααααα
α’αααΈαααααααΌαααααΎαααα»αααααΆαααΆααααα’αααααΆαααα‘αΎα AUTOVACUUM ααα»ααααααΆαα αΎαααααα ααααααααΎαα‘αΎαα
αααα»αααΆαααΆα Vacuum ααα αααααΎαα‘αΎααα·αααΌαααΆαα·ααΆααααΆααΆα αα·ααα·αα·αααα α αΎααα»ααααα·αααααααααααΆααααααααα αααα»ααα½αααΆα ααΎααααΈαα»αααααΆααααΆαα αΎαααα ααΆααααΎαααΆααααΆαααα’α₯αααα αα ααα»αααααααα»αα’αα‘α»ααααααααα·ααααα·ααααααΆ ααααααΆα ααα»ααα ααΎαα»ααααΌαααΆαα αΆαααα (AccessExclusiveLock) αααααΉααα·αα’αα»ααααΆαα±ααααααα·ααααα·αααα½ααα ααΎααΆααΆααααααΌααααΈααααααΎαααΎαα ααααα·αααΎα’αααα’αΆα ααΆαααααααΆαααααααααααΆααααααααα’ααα α¬αααααααααααΆαααααΆααααααααα (ααΈααΆαααα·αααΆααΈαα α αααΎαααααα’αΆαααααααΎααα αααααΌαααααΆααα·αααααα αα·ααααααααΉαααααα’ααα) ααααααααΎααααααΊααα’αααα»αα ααΆα’αα»αα ααΎααα·αααΆααααααααΆααΎααααΈααααΎαααΆα VACUUM FULL αααα»αα’αα‘α»ααααααααΆααααααΆααααααααααα ααΌα αααααα·ααΈααΆαααααααααα·αααΆααααααααΆααααΎαααα
αααα»αααΆαααΆα αααα»α αααααΎαα‘αΎααα·αααΌαααΆαα·ααΆααααΆααΆαααΆαααααααΌα ααααΆααΉα 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α ααααααααΆααααα½αααααααααααααα ααΉαααΆααααααΆαα·ααααααααΌαααΆαααΆααΆααΆαα·αααΆααα αααα»αααΆααΆα α§ααΆα ααα "-XNUMX" α αααα»αβααΆαβαααααβαααααα·ααΈ αααβααααΌαβααΆαβααβα α βααΆ "ααΆαβααααΆααβααααΌαβαααααβααβα’αααβααΈαβααΆαβαα½αβααΆαβααΈ"α α§ααααααααα½αααααααα·ααΈααΆααααααααααΊααΆαααααΎαα αα α»ααααααααΆαααααααα
αααααΎαααΈααΈαα αα ααΆααΆααΆαα‘αΎααα·αααΎααααΈααααΎαααααααα·ααααααα ααα»α α’αααααααΉααααααΆαααααααααααΆαααααα½αα±ααα ααα½ααααα αααααΆαααα αα αααααααΎαα αα α»ααααααααΆααααααααΈ 1 ααΆα§ααΆα ααα αα 2.5 ααΆαα»ααΈαα½αααΉα "αα" αααααααααααααααα·αααΆαααΈααΈα αα·αααΈααΈα αααααααααΆααααααααΎαααΆα ααα»ααααααΆαααααααααααΈαα ααααΌα ααΆααΉααα·αααααΎαααΆααααααΆααα’ααααα ααααα·αααΎαααααααααΌαααΆαααααΎαα ααααααααΆαα½ααα αααα»αα ααα»α αααααΆααα ααΈααΈα α’αΆαααααααΎααΆαααΆααααΆαααααααααααα·αααααα α’αααααΉαααΆαα ααα½ααααααααααΆααααα αΌααααα’αΆα ααααΎαα ααΆα αα»ααααααααΆα‘αΎααα·αααΌαααααααααααααααααΆααΆααα’ααα
αααααΎαααΈ 3α αααααααΆααααααΆααα ααΌα ααααααΆααααΌαααΆααα·αα·ααααααα αααααααΎαα·α αα αααααΆα
create table cars
(
name text constraint pk_cars primary key,
ord integer not null constraint uk_cars unique deferrable initially deferred
);
α αΆααααΆααααΈαααααα·ααααΆααααααΎααααΌαααααααΎαααΆααΆααΆαααααααΆααα’ααααΊααΆααααα½αααααα αααααααΆαααααααααΆα α·ααααααααΆααΉαααα½αααΆαααααααα
α§ααΆα αααβαααβααΆαβαα·ααΆααααΆβααΆαβααΎβααΊβααΆβααΆαβαααααβααΆαα ααα»ααααβααΆβαααα αΆαβααΈβαααα·αα αα αααα»ααααααα·ααΈααααααΎα ααΎαααααΎααΆααααααΆαααααΎααααΈα’αα»αααααααααα·ααααΆαααααα½ααα»αααααΌααααα»αααΆααααααααΆααααααα αα ααααααα’αααααααΎααααΆααααααΎααΆααααα»ααααααααΆαααααΆααΆαα½αααααα»ααΆαα»ααααΆα ααα·ααααααΆαα ααααααααα ααΎααααΆαα ααΆαααααΎααααΆααααΆαααΉααααααΉαααααααα’αα»ααααΆαα±ααααΎαααααΎα±ααααΌααααααα·ααΈααΆααααααΆααααααααα·α α
ααΆααΌαα
α’αΆαααααααΎααααααααα§ααααα Postgres ααΆαααΈααααα·ααα granularity αααααΆαααααα½ααα·αα·ααααα½αααΆα αα½αααα ααααα·ααααα·ααΆα αα·αααααα·αααααααα
ααααα:
αα·αα·ααα αα·ααα·αααα 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 ααααΌαααΆαααααα·ααααα·α
ααΌα ααααααααΉαααΆααααααα αΆαααα·ααα αααα»α "ααΆααααααΆααα" ααααΆααααα½ααα·αα·αααα αα αααα»αααΆααΆαααΎαααΆααΎαα‘αΎααα αααααααΎααΆα α αΎααα αααα»αααΆααΆαααααΈαα ααααααααΆ 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 ααΆααΈ) α
ααΆααα·αααααααΆαααΆααα·αααααΆαα ααΎαααααΎαααΆαααα·ααααααααααα ααΎααααΈα’ααααΆααααα αααΆαα αααααΆααΌαααΆααααααΆαααα ααα databases αααααΆααααΈααααΎαααΆαα
αααααΆαααΎααααα
α·αααααΆαααααα»αααΆαα½αααΉααααααααααΆαααα ααΎααα·αααΆαααααΆααΆαα’αα»αααααα·ααΈααΈααΈαααααα ααα»ααααααΎααααα»ααα·α
αΆαααΆα’αααΈααααααΆαααααΆααα·ααΆααααΆααΆααΆαα½αα’αααα’αα·αααααααααααααααααα ααΆα’αα»αα ααΆααααααααα
αα
α»ααααααααααααΎααα·αααΆαααα½α
ααΆαααααααΆααααΆαααααα»ααααα αααααΆαααΎαααααΆαααααααααααΆααααα αΆααΆαα½αααΉαααΆαααΉααααααΉααα·ααααααααΆααααααΆα α αΎααααααΆαααααααααααα ααΆα
αΆαααΆα
ααααα»αααΆααααααααΆαααΆαααααααααΆααααααααααααααααα ααΎααααααΉαααΆααΉαα’αΆα
ααααΎααΆααΆαααΆαααα’ααΆααα
αααα ααααΆα’αααααΆααααα½ααα½α α ααα»α’αααΈααΆαααΆααΎααααααΆααα αΌααα½ααααα»αααΏααααααΆαα½αααΉαααΆααααααα pg_repack α αΎαα§ααΆα ααααα·αααααΎ analogues ααααααΆ? αα α ααα»α αααα ααΎαααααΆααα·αα’αααΈαααα αΆαααααα ααα»αααααααα·ααααααα·αααααΆαααααΆαααααΎααααΆααααΆααΈαα»ααα αα ααΎαα»αααααααΆαα§αααααααΆααΆαα ααΆααααα»αα±ααααΎαααααΆααΆαααααααααααΈααααΉαααΆααααααα αΆ αα·ααα½ααα»αααΆα ααΎαααΈααα ααΆαααααΎααααΆαααααααααααΆαααααααααααααΆαααΆααααααααΆααΎααααΈααααΎααΆαααααΎαααααααααα ααΌα ααααα αΎαααΎαααΎααααααα α α·αααααΆ ααΎαααΉαααααΆααΆααααααααΆααααα αΆαα αααα»ααααααΆαα»ααα·α α αΎαααααα·αααΎααΎαααΉαααΆααΎααα·αα’αΆα ααααΎαααααααααα»ααααααααΆααααααααα ααΎαααΉαα αΆααααααΎαααΎα analogues α .
ααΆαααααΎα
α’αααΈαααααΎαα’αΆα ααααΆααααααα’ααααΎαααα·αααααααααΆααααααααΎαα
- ααΆαααΆαααΆαα αΎααααααααα’αααα αααααα’ααααΎαα·αααααααααα½ααα·αα·ααα α’αααα’αΆα αααααΈααααααα autovacuum ααααΌαααΆαααααααα ααΆααααααααααΆαααα’α
- αααααααΌα AUTOVACUUM ααΎααααΈαααααΆααΆαα αΎαααααα ααααα·ααααα’αΆα ααα½αααααΆαα
- ααααα·αααΎααΆαα αΎαααααα ααααΎαα‘αΎα α αΎαα’ααααα·αα’αΆα ααααααααΆαααααααΎα§ααααααααα αααα’αα αα»αααααΆα αααα»αααΆαααααΎααααΆαααααααααααααααΆααααα α ααΏαα αααααΊααααΌαααΆαααααα’αααΈαααααααααΆαα±ααααΆαααα’α
- αα»αααααΆα αααα»αααΆααααααααααααααααΆαααΆααααα ααΎααααΈααααααααααΌαααΆαααααα’ααα - αααααααααΆα’αΆα ααΆαααααα·αααααΆαααΆα αα·αααΆααααα½αααΆαααΆαααααΆααααααΌααααααΌαααααΆαααααα½αααααα’αααα
ααααα: www.habr.com