á¨ááľ áĽáĽá áľ á á¨á´ááá˝ áĽá á˘áá´ááśá˝ (áĽááľ) á°á˝áĽá á á°áá á¨ááłáá
áĽá á Postgres ááľáĽ áĽáť á áá°áá. áĽáá° VACUUM FULL ááá CLUSTER áŤá âá¨áłáĽá ááŞâá ááááá ááááśá˝ á áᣠááá áá á áá°áŠá áľ áá á á¨á´ááá˝á ááááá áĽá áľááá
áááá áĽá
á áá ááá á áá˝ááá˘
á˝áá áĽáĽá áľ áĽáá´áľ áĽáá°áá¨á°áľáŁ áĽáąá áĽáá´áľ áááá áĽáá°áá˝áᣠáľáá°ááአáá°áŚá˝ áĽá á¨pg_repack á
áĽáŤáá á áá áá áľáááŤáľá¨áľáá¸á á˝ááŽá˝ á ááłááľ ááľá ááłáŚá˝ ááá¨ááá˘
áá
á˝áá á¨á°áá°á¨á°á á
ááá áĽáĽá áľ á á
Postgres á á ááŤáł áľáŞáľ áá´á áá á¨á°áá°á¨á° áá (
á ááá˝ ááá¨áľ áĽáá°ááťáá, áĽááá áá áľáŞáśá˝ áááἠá ááŁá¸á. Postgres á¨áá áŤá á¨áá á°á¨ áľááľáł áá˝ á áá˝ á˛áá áá˝ á°áá á¨á˛áľá ááá ἠááá ááťá á¨áá˝á á ááľá°áá á¨ááἠáá á ááᢠáá áĽáá´áľ áĽáá°áá¨á°áľ ááá¨áłáľ á ááľ áľáá˝ ááłá áĽáááá¨áľá˘
áĽá ááááŚá˝á á¨á¨áááá áľ á á¨á´á á áá áĽáá áᢠá á¨á´áá á¨á°á¨áá¸á áľ á¨ááá á¨ááááŞáŤ áá˝ á á˛áľ ááἠá ááᢠáĽááá á¨ááá áááľ á áá áááá˝ ááĽááśá˝ á¨ááá á¨ááĽáł á¨á¨áľáá˝ áľáŞáśá˝ áá¸á (ááááááľáŁ á¨ááá á á°á¨áá á¨á°áá á áá áĽáá áĽááááłááá˘
á¨á፠á ááąá áá¤áśá˝ á áááá áĽá á¨áľáŽáá áľáŞáľ ááá áŤááá áľ áááá ááááľ á áľááááá˘
á¨á¨áľá áľáŞáśá˝á á°á¨á á á°á¨á á áááá áĽá á áá°á¨á á¨ááᥠááľáĽ ááá˝ áŤá
á "ááťáť" á¨ááá áľ áá˝ á ááá°ááᢠáá
ááἠáááááá ááĽááľ á ááłááá˘
Postgres áá´ á ááá˘
áľááá á áĽá ááłá, á á°áá°á áá ááľáĽ, á áá á¨áĄ á áŤáľ áážá˝á áááá, ááá áá á ááľáĄ áŤáá á¨ááĽáł áá¨á ááá˝ áĽáť áááá. á áá¤áąá, á°áá á¨áĄá á˛á°ááą, á¨ááŤáľáááá á áá áĽá áá¨ááá˝á áĽáááŁáá.
ááá áĽááłá VACUUM á áá áááá á°ááá
ááľ á¨ááá¸á á¨á¨áľá áľáŞáśá˝á á˘áŤá áá, áááłá ââá á¨áá°á áááł á ááťáťáá. áá á˛áľ ááľááŽá˝ á áážá˝ ááá áá ááá˝ áá áŚáł ááá¨ááᣠááá áá á ááá á¨áááááá á áá áĽá áá¨ááá˝á áĽáááŁááá˘
á áááŤá˝á áá, áá á áá áŁáś áá˝ (á áĽá ááłá ááľáĽ ááá°áá) á ááá áá¨á¨áť áá á¨áá, VACUUM ááŤááá á áá˝áá. á áá áá ááá áá áľáááľáá ááá ááľá¨á á ááťááá˘
áĽáá°áá
áŤá áŁáś ááá á áŁá áľáá˝ áŤááá áážá˝ ááĽá áľáá
á˛áá áá
á áĽáĽá áľ ááŁáá, á á áááá áá á°á˝áá ááłá°á ááááŤá.
á¨áá á¨á°áááá ááá ááá á á á¨á´ááá˝ ááľáĽ á¨ááľ áĽáĽá áľ áá¨á°áľ ááŤáááľ áá. á áá¨á á áááá˝ ááľáĽ, áá á á°ááłáłá ááááľ áá¨á°áłá.
áĽáĽá áľ á ááĽá?
á¨ááľ áĽáĽá áľ áĽááłááĽá áááá
áĽá ááááśá˝ á áᢠá¨ááááŞáŤá ááłáĽ á á á¨á´ááá˝ ááľáĽ áľáááľ á¨áľáá˝ áĽáᾠᣠáľá âááĽáłâ á¨áľáá˝ áĽáᾠᣠááá° áááłá áá¨á á¨áŤááá ᨠPostgres ááľáŁá áľáłá˛áľá˛ááľá áá áá áá ᢠá á áááá¨áĽ áá áĽá ááá-á¨á°ááá áľááŞááśá˝ á áᢠáá°á¨áľ á áľááá áá á¨áá°áľáá
ááá ááááľ á
áĽáŤáá áá áá áá
á ááľá°á áá á áŤáá áĽáĽá áľ, áĽáľá¨ 20% áľá¨áľ, á°ááŁáááľ á áá. á fillfactor áĽáá° á ááá á°á°áá ááá°áľ áá˝áá
áĽáĽá áľá ááááá ááááśá˝
á ááľáľááŹáľ ááľáĽ áĽáĽá áľá ááááá á¨áłáĽá áá áŤá áĽá ááááśá˝ á á ááá áá áĽááą áááá á áŁá á¨áŤá áá¸á áĽá áááá á°á áááľáá áá˝ááá˘
áĽáĽá áľ áĽááłáá¨á°áľ AUTOVACUM á áŤáá áŠ. áĽá á¨á áá áľáááá áááá ᣠááĽááľá á°ááŁáááľ áŁáá á°á¨á áááá¨áľá˘ áá áĽáá° "áŤáá´á" ááá áááľáá, ááá áá á áĽáááą áá áááľá¨áľ áááá ááá á áá°áá. áááłáᣠá áá¨á ááľá áá áá°á á ááἠáŤáá áá áĽáľááľ á áá ᣠááá á¨áá á áááľ á¨ááἠááá°áľ áĽá¨á°áŤáá° ááᢠá áá¤áąá, á¨áááľ ááááŤá á á°á°ááá áááἠáĽá áá°ááŤáŠ á á¨á´ááá˝ á¨á°áᨠááá áá˝áá. áá áááľ áŤáááá¨áĽ á¨á ááááá áľáá˝ ááľáá ááá á ááĽá áĽá AUTOVACUUMá á á¨á á¨á´áá á°áááá ááá፠áá ááľá°áŤá¨á á ááĽá áááľ ááᢠáá áá á ááľá¨á ááá áĽááłááá ááá˝ áá.
AUTOVACUUM á°áá á¨áŚá˝á ááľáŤáľ áŤááťáá áľ ááá á¨á°ááá° ááááŤáľ á áĽááá ááĽááśá˝ ááľáĽ á ááááą áá¨áá á¨áá˝áłáľ á¨áá¨ááááľ á¨á á áá á¨ááá ááĽááśá˝ áááŤá¸á ááᢠáĽáá áŤáá ááá ááá˝ áá - "á¨á°áá áá á" ááĽááśá˝á áŤáľáááą áĽá á¨áá ááĽááśá˝á áá ááááą. ááá áá á áá°áá áŞáŤá áá áŤáá ááᾠᨠOLAP áĽá OLTP áľáĽáá á¨áá á á°ááłáłá áá áĽá á°á°ááá ááááá˝á áĽá á áá áá ááá˝á áĽáá˛áá á¨á á áľáŤáá˝á áááłá áŞáááľ ááááŁáľ áá˝ááᢠá áĽáá°áá ááááľ áááł, á¸ááá á á°ááŤáŠ áá á¨áśá˝ áá ááá°áŤá¨áľ áá°áĽ á ááĽááľ, áá á áĽáŤááłááłá¸áá á á°áἠáĽáá˛áŤáľá°áŤáá áŤáľá˝áááłá.
áá ááłá - ááá áĽááłá ááááŤá á°ááłáłáááľ áŤáá á˘ááá á¨ááἠááł á áŁá á¨áá°á á áá áááľ ááľáĽ á˘ááá á áŁá ááááá AUTOVACUUM áĽááłá áááá á áá˝áá, áĽá áĽáĽá áľ áá¨á°áłá. áľáŹá (á ááŁá ááá á ááľá) áĽá¸áá áááľá áá.
AUTOVACUUM á á˛áŤáá አáĽáá´áľ á á ááľ áááł ááľáĽ áĽáá°áááᣠááá áá áĽáĽá áľ áá°áá áááĽááá˘
áĄáľá áŤáŠá áá á¨á°áá á¨áŚá˝á áĽá á˘áá´ááśá˝á áááśá˝ áĽáá°áá ááááŁá áĽá á ááľáŁá¸á áá áłá áá¨ááá˝á áĽáť áŤáľáááŁáᢠáĽáĽá áľá áááľáááľ á áľááá áá áŤá ᣠáá á áá°áá áá áľ áá á á á¨á´áá áá áአáááá፠(AccessExclusiveLock) á°ááá ᣠáá á áá°áá á á¨á´á áá áĽáŤááá˝á á ááá áľá ᣠááááŁáᢠáá°áá°á áá á áááááľáá ááá á¨ááá áááá á á á áŤááľ (á¨á áľá á°áááá˝ áĽáľá¨ áĽá á°á áłáľ áĽáá° áłáłá¤á áá á áĽá áĽáá° áááľááá áá á) áá á ááŤá á áŁá áĽáŠá ááᢠáĽá, á ááŤáłáá áááł, á áłáá°ááľ áĽáá áá áľ VACUUM FULLá áááľáŹáľ áá á¨ááá, áľááá áá áá´ á ááľáááá.
áĄáľá áááľá°á á¨á áá á¨áĄá áááśá˝ áá áĽáá° VACUUM FULL á á°ááłáłá ááአááááŁáᣠáá¨áá á á áŤá á á˛áľá áá á¨ááłááá áľá á˘áá´ááľ áĽáá˛áááš áŤáľá˝áááłá (ááá áá áľááá ááá°ááą á á˛áľ á¨áľáá˝ ááľáľá á áá°áĽá)ᢠá á°áá°á áááłáá˝ ááľáĽ, áá ááĽá áá ááá˝ áĽáŠ áááťá¸áľ áá - á áá¨á á áá ááľáĽ áĽá ááááŚá˝á á ááá áĽ. á¨áľááá ááłáą ᨠVACUUM FULL áá á°ááłáłá áá - á áá áŤá áľ áá á á¨á´ááá ááááá.
áĄáľá REINDEX á¨áá°ááľ áááą áá á°ááłáłá áá ᣠáá á ááľ á¨á°áá°á á˘áá´ááľ ááá áááá á˘áá´ááśá˝ á á á¨á´á áá áĽáá°áá ááááŁáᢠáááááŤáá˝ á áľááš á°áŤá áá¸áᥠShareLock á á á¨á´á áá (ááťáťáŤáá˝á áá¨ááááᣠáá áááŤáá˝á ááá
áłá) áĽá AccessExclusiveLock á áĽáá°áá áááᣠá áá˝á á˘áá´ááľ áá (áá
áá á˘áá´ááľ á áá áá áá ááá˝á áŤááłáᢠááá ááľáľááŹáľ 12 á ááŤáŠá á áľá°áááá
á áá°ááľ á¨ááľáľááŹáľ áľáŞáśá˝ ᨠREINDEX áá á°ááłáłá á¨áá áá¤áľ ááááľ áá˝ááá˘
áľááá
, á˘áá´ááśá˝ áľáŠáľ áĽáĽá áľá áááľáááľ ááááśá˝ áŤá, áá á¨á´ááá˝ ááá á¨áá. ááŤá ááŤáááŤáá˝ á¨ááŤááąáľ áĽáá
áááĄ
pg_repack áĽáá´áľ áĽáá°áá°áŤ
á áŁá á°áŤ á¨áá á á¨á´á á áá áĽáá á - á áá¨á á áááὠᣠáá°áŚá˝ áĽá ᣠá ááŤáłáá áá᳠ᣠᨠáĽáĽá áľ ááᢠáĽáá° ááááŞáŤ á°á¨áᣠpg_repack áĽá¨áá° áĽáŤá áááá áááŚá˝ ááá¨áłá°á á¨áááἠááľáłááť á áá á¨áĽ áááĽáŤáᢠááľá
á´á áĽááá
á áááŚá˝ á áĽáŤááłááą ááľááŁáľáŁ áááá áĽá áá°á¨á áá áá°áááᢠá¨ááŤá á áááአá¨ááááŞáŤá áá á°ááłáłáááľ áŤáá á áá á¨áĽ ááá áŤá, ááá áá áŤá á˘áá´ááśá˝ áĽá áá°áŚá˝, áá¨áá á¨ááľááŁáľ áá°áľ áĽááłáááá.
á ááá á pg_repack áá¨áá á¨á áŽáá á áá á¨áĽ áá° á á˛áą á°áá á¨áĽ áŤáľá°áááá ᣠáááá á°ááá áŤááá á¨áľáá˝á á áŤáľ-á°á á ááŁáŤáľ áĽá á¨á፠áá á˛áą á°áá á¨áĽ á˘áá´ááśá˝á áááĽáŤáᢠáĽááá áá áľáŤáá˝ á áá¨áááá áľ áá áááŚá˝ á áá á áá á¨áĽ ááľáĽ áá¨ááťá.
ááŁáŠ á°á¨á áááŚášá áá° á á˛áą á°áá á¨áĽ ááľá°ááá áá. ááá°áľ á á ááŤáł áľáááážá˝ ááľáĽ áá¨áááá, áĽá á áá á áá á¨áĽ ááľáĽ ᨠ20 áŤááą áá¤áśá˝ á˛ááŠ, pg_repack á ááŤáŤ áááá፠áŤááá, á¨á áἠáááá ááἠáŤáááłá áĽá á¨áľáŽáá á°áá á¨áĽ á ááľáľááŹáľ áľáááľ á°áá á¨áŚá˝ ááľáĽ á á á˛áą áá°áŤáá. áá á¨á á¨á´áá áá ááľáŤáľ á¨ááá˝áá áľ áĽá¸áá áĽá á áŁá á áá áá áá. á¨á፠á áá, á áŽáá á á¨á´á áĽá áááἠááľáłááť áŤáá á á¨á´á áá°á¨áá áĽá á ááá áľáááą ááľáĽ áŚáł ááááá. áá°áľ á°á áá ááá˘
á ááľá ááłáĽ, ááá ááá á áŁá áĽáŠ áááľáá, áá á á°ááŁááľ? 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.
áá
áá°áĽ á pg_repack á¨á°áá ᨠá áŤáľ-á¨ááᨠáľá index_16508 áá á¨áᢠá á áťáťá ááľáĽ á á°áŤá°áąáľ áŁá
áŞáŤáľ, á¨áĽáą áá á¨ááľáááá "á¨áĽáá" áá°áĽ ááľááá. á˝áአá¨ááá áá
á°áŤ áá°áĽ áłááá á¨ááᨠáá (
á¨ááአáá°áŚá˝áĄ ááá áĽáá°áááá áĽá áĽáá´áľ áĽáá°áá°áŠ
áľá ááአáá°áŚá˝ áľáá˝ ááľá ááłáĽá˘
á ááľ ááá ááłá á áľáĽá áľáĄ áááľ áŁá
áŞáŤáľ áŤááľ á¨ááŞá áá፠á á¨á´á á áá - á áááŤá ááľáĽ á¨ááŞáá áľá áĽá á
á°á á°á¨á°áá˘
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 ááľáĽ áŁáá á¨áĽááł á áááľ áá á áááľá¨áľáŁ á¨áá¨áááŤá¸á áśáľáľ á¨áĽáŤáĽáŹááľ á°á¨ááá˝ á áᥠá¨áľáᣠááĽááľ áĽá á áááá˝á˘
ááá:
áźá áĽá 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á âááľá°ááâᢠááá°ááá ááá áá.
á á á˛áľ á áá á¨áĽ ááľáĽ á˘áá´ááśá˝á á¨ááááŞáŤá á°áá á¨áĽ á á°ááአáá°áŚá˝ áá°áŠ
á¨ááťáťáŤá ááá ááá˝ áá á - á¨ááááŞáŤá á áá á¨áĽ á¨ááᨠáá°áĽ áŤáá, áá á˛áą áĽáá˛á á áááľ áá°áĽ ááá á á áľááá áá, áĽá á˘áá´ááľ á áá°áá.
áááŚáťá˝áá áááá°á˝ ááá áá°á á˝ááááĄ-
- á¨ááᨠáá°áĽ áŤáá á á¨á´á áĽá á ááľ ááááĽ;
- á áá áŤáá áááἠáá á¨ááá áá¨áá á loop ááľáĽ áĽááľááŁáá á¤
- ááťáťáŤ áŤáľáá - ááᥠá¨á áá á áá á áááá;
- áááŚá˝á ááľá¨á.
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 áŤáááá˘
- áĽáĽá áą á ááá áĽáŤá°á á¨áá áĽá á¨áłáĽá áá áŁá ááłáŞáŤáá˝ áá áááá áŤááťá ááŤá á áĽáŤáá˝á ááá áá á áááŠ. ááá ááá áááá ááá á á°áἠááá¨á áá.
- á¨áĽááľáá ááááľ áááááľ ááŤá áááľááá˝á áááá¨á á ááአ- á ááłááľ áá á¨áŤáľáá áŽáľ á¨ááá¨á á¨á áá áááŁá áĽá áĽáá˛áŤáá ááá ááá áá˝áá.
ááá: hab.com