ืื ืืืืจืงืื ื ืคืื ืืืึธืืืื ื ืืืืฃ ืืืฉื ืืื ืื ืืขืงืกืื ืืื ืืืืืืื ืืึทืืืืกื ืืื ืืื ืคืึธืจืฉืืขืื ื ืื ืืืืื ืืื Postgres. ืขืก ืืขื ืขื ืืืขืื ืฆื ืืึทื ืืืขื ืืื ืขืก ืืืืก ืคืื ืื ืงืขืกืื, ืืื VACUUM FULL ืึธืืขืจ CLUSTER, ืึธืืขืจ ืืื ืฉืืึธืก ืืืฉื ืืขืฉืึทืก ืึธืคึผืขืจืึทืฆืืข ืืื ืืขืจืืืขืจ ืงืขื ืขื ื ืื ืฉืืขื ืืืง ืืืื ืืขืืืืื ื.
ืืขืจ ืึทืจืืืงื ืืืขื ืึทื ืืืึทืืื ืึท ืืืกื ืืขืึธืจืืข ืืืขืื ืืื ืืืึธืึทื ืึทืงืขืจื, ืืื ืืืจ ืงืขื ืขื ืงืขืืคื ืขืก, ืืืขืื ืืืคืขืจื ืงืึทื ืกืืจืืื ืฅ ืืื ืื ืคืจืืืืขืืขื ืืืึธืก ืืื ืืจืขื ืืขื ืฆื ืื ื ืืฆื ืคืื ืื pg_repack ืคืึทืจืืขื ืืขืจืื ื.
ืืขืจ ืึทืจืืืงื ืืื ืืขืฉืจืืื ืืืืืจื ืืืืฃ
ืคืืจืืืืก ืืื ืืืึธืืืื ื ืคืึทืื?
Postgres ืืื ืืืืืจื ืืืืฃ ืึท ืืืืื-ืืืขืจืกืืข ืืึธืืขื (
ืืึธื, ืึทืืข ืื ืืืขืจืกืืขืก ืืึทืจืคึฟื ืฆื ืืืื ืกืืึธืจื. Postgres ืึทืจืืขื ืืื ืืึผืจืื ืืืึทื ืคึฟืึทืจ ืืืึทื ืืื ืึท ืืืึทื ืืื ืื ืืื ืืืื ืกืืืข ืคืื โโโโืืึทืื ืืืึธืก ืงืขื ืขื ืืืื ืืืืขื ืขื ืคืื ืืืกืง ืึธืืขืจ ืืขืฉืจืืื. ืืึธืืืจ ืงืืงื ืืื ืึท ืงืืืื ืืืึทืฉืคึผืื ืฆื ืคึฟืึทืจืฉืืืื ืืื ืืึธืก ืืึทืคึผืึทื ื.
ืืื ืก ืืึธืื ืืืจ ืืึธืื ืึท ืืืฉ ืฆื ืืืึธืก ืืืจ ืืึธืื ืฆืืืขืืืืื ืขืืืขืืข ืจืขืงืึธืจืืก. ื ืื ืืึทืื ืืขื ืขื ืืจืืืก ืืืืฃ ืืขืจ ืขืจืฉืืขืจ ืืืึทื ืคืื ืืขืจ ืืขืงืข ืืื ืื ืืืฉ ืืื ืกืืึธืจื. ืืึธืก ืืขื ืขื ืืขืื ืืืขืจืกืืขืก ืคืื ืจืึธืื ืืืึธืก ืืขื ืขื ืืืจืขืืืืื ืคึฟืึทืจ ืื ืืขืจืข ืืจืึทื ืืึทืงืฉืึทื ื ื ืึธื ืึท ืืืขืจืืขืื (ืคึฟืึทืจ ืคึผืึทืฉืืขืก, ืืืจ ืืืขืื ืืืขืจื ืขืืขื ืึทื ืื ืืคืืขืืื ืืขืจืืงืืื ืืืจืื ืืื ืืืืขื ืขื ืงืึทืืืืึทื).
ืืืจ ืืขืจื ืึธื ืืขืจืืืึทื ืืืงื ืืืื ืขืจ ืคืื ืื ืืืื ืกื, ืืขืจืืื ืืึทืจืงืื ื ืื ืึทืื ืืืขืจืกืืข ืืื ื ืื ืืขืจ ืืึทืืืึทืืืง.
ืฉืจืื ืืืจื ืฉืจืื, ืึทืคึผืืืืืื ื ืืื ืืืกืืขืงื ืจืืืขืจื ืืืขืจืกืืขืก, ืืืจ ืขื ืืืงื ืืื ืืื ืึท ืืืึทื ืืื ืืืึธืก ืืขืขืจืขื ืืึทืื ืคืื ืื ืืึทืื ืืื "ืืืกื". ืื ืืึทืื ืืขื ืขื ื ืืฉื ืงืขื ืืืง ืคึฟืึทืจ ืงืืื ืืจืึทื ืกืึทืงืืืึธื.
Postgres ืืื ืึท ืืขืงืึทื ืืืึทื
ืึทืืื ืืื ืืื ืืืขืจ ืืืึทืฉืคึผืื, ืืื ืขืืืขืืข ืคืื ื ืืื ืฆืืื, ืื ืืืฉ ืืืขื ืฆืื ืืืคืฉืืขืื ืืื ืคืื ืคืืจ ืืืขืืขืจ, ืึธืืขืจ ืืืืื ืืึทืื ืคืื ืขืก ืืืขื ืึทื ืืืึทืืื ืืขืื ืืึทืื. ืืื ืึท ืจืขืืืืืึทื, ืืืขื ืึทืงืกืขืก ืื ืืืฉ, ืืืจ ืืืขืื ืืืืขื ืขื ืคืื ืืขืจ ืืึทืื ืืื ื ืืืืืง.
ืืคืืื ืืืื VACUUM ืืืฆื ืืืกืืขืงื ืึทืืข ืืจืขืืึทืืืึทื ื ืจืืืขืจื ืืืขืจืกืืขืก, ืื ืกืืืืึทืฆืืข ืืืขื ื ืืฉื ืคึฟืึทืจืืขืกืขืจื ืืจืึทืืึทืืืงืื. ืืืจ ืืืขืื ืืึธืื ืคืจืื ืคึผืืึทืฅ ืืื ืืืขืืขืจ ืึธืืขืจ ืืคืืื ืืึทื ืฅ ืืืขืืขืจ ืคึฟืึทืจ ื ืืึทืข ืจืึธืื, ืึธืืขืจ ืืืจ ืืืขืื ื ืึธื ืืืืขื ืขื ืืขืจ ืืึทืื ืืื ื ืืืืืง.
ืืืจื ืืขื ืืืขื, ืืืื ืึท ืืึธืจ ืืืืืืง ืืืึทื (ืืขืจ ืฆืืืืืืขืจ ืืื ืืื ืืืขืจ ืืืึทืฉืคึผืื) ืืื ืืขืืืขื ืืื ืื ืกืืฃ ืคืื ืืขืจ ืืขืงืข, ืืืึทืงืืื ืืืึธืื ืืืื ืืืืืืช ืฆื ืืจืื ืขืก. ืึธืืขืจ ืืืฆื ืืื ืื ืืื ืืืื, ืึทืืื ืืขื ืงืขื ืืึธืจื ืืฉื ืืึธื ืืื ืืืจ.
ืืืขื ืื ื ืืืขืจ ืคืื ืึทืืึท ืืืืืืง ืึธืืขืจ ืืขืืกื ืฉืืืขืจ ืืืขืืขืจ ืืืขืจื ืืจืืืก, ืืืึธืก ืืื ืืขืจืืคื ืืืึธืืืื ื, ืขืก ืืืืื ืฆื ืืืืจืงื ืคืึธืจืฉืืขืืื ื.
ืึทืืฅ ืืืกืงืจืืืื ืืืืื ืืื ืื ืืึทืงืึทื ืืงืก ืคืื ืื ืคึผืึทืกืืจืื ื ืคืื ืืืึธืืืื ื ืืื ืืืฉื. ืืื ืื ืืขืงืกืื ืืึธืก ืืึทืคึผืึทื ื ืืื ืคืื ืื ืืขืืืข ืืืขื.
ืฆื ืืื ืืึธืื ืึท ืืืึธืืข?
ืขืก ืืขื ืขื ืขืืืขืืข ืืืขืื ืฆื ืืึทืฉืืืกื ืืืื ืืืจ ืืึธืื ืึท ืืืึธืืืื ื. ืืขืจ ืืขืืึทื ืง ืคืื ืืขืจ ืขืจืฉืืขืจ ืืื ืฆื ื ืืฆื ืื ืขืจืืขื Postgres ืกืืึทืืืกืืืง, ืืืึธืก ืึผืืื ืืขืจื ืขื ืืขืจื ืืื ืคึฟืึธืจืืึทืฆืืข ืืืขืื ืื ื ืืืขืจ ืคืื ืจืึธืื ืืื ืืืฉื, ืื ื ืืืขืจ ืคืื "ืืขืื" ืจืึธืื, ืืื"ื ื. ืืืจ ืงืขื ืขื ืืขืคึฟืื ืขื ืคืืืข ืืืขืจืืืืฉืึทื ื ืคืื ืคืึทืจืืืง ืกืงืจืืคึผืก ืืืืฃ ืืขืจ ืืื ืืขืจื ืขืฅ. ืืืจ ืืขื ืืืขื ืืื ืึท ืืงืขืจ
ืื ืื ืืขืจ ืืืขื ืืื ืฆื ื ืืฆื ืื ืคืึทืจืืขื ืืขืจืื ื
ืืืจ ืืึทืืจืึทืืื ืึท ืงืืืื ืืืึธืื ืืืขืจื, ืึทืจืืืฃ ืฆื 20%, ืคึผืึทืกืืง. ืขืก ืงืขื ืขื ืืืื ืืืืจืืื ืืื ืึทื ืึทื ืึทืืึธื ืคืื ืคืืืคืึทืงืืึธืจ ืคึฟืึทืจ
ืืืขืื ืฆื ืงืึทืืืึทื ืืืึธืืืื ื
Postgres ืืื ืขืืืขืืข ืืืขืื ืฆื ืืึทื ืืืขื ืืื ืืืึธืืืื ื ืืืืก ืคืื ืื ืงืขืกืื, ืึธืืขืจ ืืื ืืขื ืขื ื ืืฉื ืฉืืขื ืืืง ืคึผืึทืกืืง ืคึฟืึทืจ ืึทืืขืืขื.
ืงืึทื ืคืืืืขืจ AUTOVACUUM ืึทืืื ืึทื ืืืึธืืืื ื ืงืขื ื ืืฉื ืคึผืึทืกืืจื. ืึธืืขืจ ืืขืจ ืืขื ืื, ืฆื ืืึทืืื ืขืก ืืืืฃ ืึท ืืืืึทื ืคึผืึทืกืืง ืคึฟืึทืจ ืืืจ. ืืึธืก ืืืื ื ืืื ืึท "ืงืึทืคึผืืืึทื ืก" ืขืฆื, ืึธืืขืจ ืืื ืคืึทืงื ืืึธืก ืืื ื ืืฉื ืฉืืขื ืืืง ืืจืื ื ืฆื ืืขืจืืจืืืื. ืคึฟืึทืจ ืืืึทืฉืคึผืื, ืืืจ ืืึธืื ืึทืงืืืื ืึทื ืืืืืงืืื ื ืืื ืจืขืืืืขืจ ืขื ืืขืจืื ืืขื ืฆื ืื ืืึทืื ืกืืขืืข, ืึธืืขืจ ืขืืืขืืข ืืื ืคืื ืืึทืื ืืืืจืึทืืืึธื ืืื ืืขื ืืืขื. ืืื ืึท ืจืขืืืืืึทื, ืืืื ืืึทืกืข ืคึผืจืึธืคืื ืงืขื ืึธืคื ืืืืฉื ืืื ืืืขื ืืืคึผืืงืื ืืืึทืื ืคืื ืืืฉ ืฆื ืืืฉ. ืืขื ืืืื ืืืจ ืืึทืจืคึฟื ืฆื ืงืขืกืืืืขืจ ืึทืจืืขื ืึท ืืืกื ืคืึธืจืืืก ืืื ืกืืจืืืขืจื AUTOVACUUM ืฆื ืื ืืฉืึทื ืืื ื ืคึผืจืึธืคืื ืคืื ืืขืืขืจ ืืืฉ. ืืืขืจ ืืึธื ืืื ืืึธืก ื ืืฉื ืืจืื ื ืฆื ืืึธื.
ืื ืื ืืขืจ ืคึผืจืึธืกื ืกืืื ืืืึธืก AUTOVACUUM ืงืขื ื ืืฉื ืืึทืืื ืืื ืืื ืืืฉื ืืื ืืืืึทื ืขืก ืืขื ืขื ืืึทื ื-ืืืืคื ืืจืึทื ืืึทืงืฉืึทื ื ืืืึธืก ืคืึทืจืืืืื ืขืก ืคืื ืจืืื ืืงืื ื ืื ืืึทืื ืืืึธืก ืืขื ืขื ืืืจืขืืืืื ืคึฟืึทืจ ืื ืืจืึทื ืืึทืงืฉืึทื ื. ืื ืจืขืงืึธืืขื ืืึทืฆืืข ืืึธ ืืื ืืืื ืงืืึธืจ ืืื ืืขืจ ืืึธื - ืืึทืงืืืขื ืืึทืคืจืืึทืขื ืคืื "ืืึทื ืืืื ื" ืืจืึทื ืืึทืงืฉืึทื ื ืืื ืืื ืึทืืืื ืื ืฆืืื ืคืื ืึทืงืืืื ืืจืึทื ืืึทืงืฉืึทื ื. ืึธืืขืจ ืืืื ืื ืืึทืกืข ืืืืฃ ืืืื ืึทืคึผืืึทืงืืืฉืึทื ืืื ืึท ืืืืืจืื ืคืื OLAP ืืื OLTP, ืืืจ ืงืขื ืขื ืกืืืืึทืืืืื ืืึทืกืื ืืึธืื ืคืืืข ืึธืคื ืืขืจืืืึทื ืืืงืื ืืขื ืืื ืงืืจืฅ ืคึฟืจืืื, ืืื ืืขืืื ื ืืื ืืึทื ื-ืืขืจืืื ืึทืคึผืขืจืืืฉืึทื ื - ืืืฉื, ืืืืขื ืึท ืืึทืจืืื. ืืื ืึทืืึท ืึท ืกืืืืึทืฆืืข, ืขืก ืืื ืืืขืจื ืฆื ืืจืึทืืื ืืืขืื ืคืึทืจืฉืคึผืจืืืื ืื ืืึทืกืข ืืืืฃ ืคืึทืจืฉืืืขื ืข ืืึทืกืขืก, ืืืึธืก ืืืขื ืืึธืื ืืขืจ ืคืืื-ืืื ืื ื ืคืื ืืขืืขืจ ืคืื ืืื.
ืื ืื ืืขืจ ืืืืฉืคึผืื - ืืคืืื ืืืื ืืขืจ ืคึผืจืึธืคืื ืืื ืืึธืืืึทืืืฉืื ืืึทืก, ืึธืืขืจ ืื ืืึทืืึทืืืืก ืืื ืืื ืืขืจ ืึท ืืืืขืจ ืืืื ืืึทืกืข, ืืคืืื ืื ืืขืจืกื ืึทืืจืขืกืืื AUTOVACUUM ืงืขื ื ืืฉื ืงืึธืคึผืข, ืืื ืึท ืืืึธืืืื ื ืืืขื ืคึผืึทืกืืจื. ืกืงืืืืื ื (ืืืขืจืืืงืึทื ืึธืืขืจ ืืึธืจืืืึธื ืืึทื) ืืื ืื ืืืืื ืืืืืื ื.
ืืืึธืก ืฆื ืืึธื ืืื ืึท ืกืืืืึทืฆืืข ืืืขื ืืืจ ืืึธื ืืึทืฉืืขืืืงื AUTOVACUUM, ืึธืืขืจ ืื ืืืึธืืืื ื ืืืื ืฆื ืืืึทืงืกื.
ืงืึธืืขืงืืืื ืืืึทืงืืื ืคืื ืจืืืืืื ืื ืืื ืืึทืื ืคืื ืืืฉื ืืื ืื ืืขืงืกืื ืืื ืืึธืื ืืืืื ืืึทืืืึทืืืง ืืึทืื ืืื ืืื. ืฆื ืขืืืืื ืืจื ืืืึธืืืื ื, ืขืก ืึทืจืืขื ืืืฉืืืืืขืก, ืึธืืขืจ ืืขืฉืึทืก ืืืึทื ืืืจืืคืืจืื ื ืึท ืืืกืฉืืืกืืง ืฉืืึธืก ืืืืฃ ืื ืืืฉ ืืื ืงืึทืคึผืืฉืขืจื (ืึทืงืกืขืกืขืงืกืงืืืกืืืืขืืึทืง), ืืืึธืก ืืืขื ื ืืฉื ืืึธืื ืขืงืกืึทืงืืืืื ื ืงืืืืจืื ืืืืฃ ืืขื ืืืฉ, ืืคืืื ืกืึทืืขืงืฅ. ืืืื ืืืจ ืงืขื ืขื ืคืึทืจืืื ืขื ืืื ืฆื ืืึทืืื ืืืื ืืื ืกื ืึธืืขืจ ืืืื ืคืื ืขืก ืคึฟืึทืจ ืขืืืขืืข ืืึธื (ืคืื ืืขื ืก ืคืื ืืื ืื ืฆื ืขืืืขืืข ืฉืขื ืืืคึผืขื ืืื ื ืืืืฃ ืื ืืจืืืก ืคืื ืื ืืึทืืึทืืืืก ืืื ืืืื ืืึทืื ืืืึทืจื), ืืขืจ ืึธืคึผืฆืืข ืืื ืืขืจ ืืขืกืืขืจ. ืฆืื ืืึทืืืืขืจื, ืืืจ ืืึธื ื ืื ืืึธืื ืฆืืื ืฆื ืืืืคื ืืืึทืงืืื ืคืื ืืขืฉืึทืก ืื ืกืงืขืืืฉืืื ืืืฉืึทืื, ืึทืืื ืืขื ืืืคึฟื ืืื ื ืืฉื ืคึผืึทืกืืง ืคึฟืึทืจ ืืื ืื.
ืงืึธืืขืงืืืื ืงื ืืื ืจืืืืืื ืื ืืื ืืึทืื ืคืื ืืืฉื ืืื ืื ืืขืืืข ืืืขื ืืื VACUUM FULL, ืึธืืขืจ ืึทืืึทืื ืืืจ ืฆื ืกืคึผืขืฆืืคืืฆืืจื ืึทื ืืื ืืขืงืก ืืืื ืืืึธืก ืื ืืึทืื ืืืขื ืืืื ืคืืืืงืื ืึธืจืืขืจื ืืืืฃ ืืืกืง (ืึธืืขืจ ืืื ืืขืจ ืฆืืงืื ืคึฟื, ืื ืกืืจ ืืื ื ืืฉื ืืขืจืึทื ืืื ืคึฟืึทืจ ื ืืึทืข ืจืึธืื). ืืื ืืืืขืจ ืกืืืืึทืืืึธื ืก, ืืึธืก ืืื ืึท ืืื ืึทืคึผืืึทืืึทืืืืฉืึทื ืคึฟืึทืจ ืึท ื ืืืขืจ ืคืื ืคึฟืจืืื - ืืื ืืืืขื ืขื ืงืืืคื ืจืขืงืึธืจืืก ืืืื ืืื ืืขืงืก. ืื ืืืกืึธืจื ืคืื ืื ืืึทืคึฟืขื ืืื ืื ืืขืืืข ืืื ืื ืืืึทืงืืื ืคืื - ืขืก ืืึทืงืก ืื ืืืฉ ืืขืฉืึทืก ืึธืคึผืขืจืึทืฆืืข.
ืงืึธืืขืงืืืื REINDEX ืขื ืืขื ืฆื ืื ืคืจืืขืจืืืงืข ืฆืืืื, ืึธืืขืจ ืจืืืืืื ืึท ืกืคึผืขืฆืืคืืฉ ืืื ืืขืงืก ืึธืืขืจ ืึทืืข ืื ืืขืงืกืื ืคืื ืื ืืืฉ. ืืึทืงืก ืืขื ืขื ืึท ืืืกื ืฉืืืึทื: ืฉืึทืจืขืืึธืงืง ืืืืฃ ืื ืืืฉ (ืคึผืจืืืืขื ืฅ ืืึธืืืคืืงืึทืืืึธื ืก, ืึธืืขืจ ืึทืืึทืื ืืืืกืงืืืึทืื) ืืื AccessExclusiveLock ืืืืฃ ืืขืจ ืืื ืืขืงืก ืจืืืืื (ืืืึทืงืก ืงืืืืจืื ื ืืฆื ืืขื ืืื ืืขืงืก). ืึธืืขืจ, ืืื ืื 12 ืืืขืจืกืืข ืคืื โโPostgres ืึท ืคึผืึทืจืึทืืขืืขืจ ืืจืืืก
ืืื ืคืจืืขืจ ืืืขืจืกืืขืก ืคืื Postgres, ืืืจ ืงืขื ืขื ืืขืจืืจืืืื ืึท ืจืขืืืืืึทื ืขื ืืขื ืฆื REINDEX ืงืึทื ืงืขืจืึทื ืืื ื ืืฆื
ืืืื, ืืืื ืคึฟืึทืจ ืื ืืขืงืกืื ืขืก ืืขื ืขื ืืืขืื ืฆื ืขืืืืื ืืจื ืืืึธืืืื ื "ืืืืฃ ืื ืคืืืขื," ืขืก ืืขื ืขื ืงืืื ืคึฟืึทืจ ืืืฉื. ืืึธืก ืืื ืืื ืคืึทืจืฉืืื ืคืื ืืจืืืกื ืืืง ืืงืกืืขื ืฉืึทื ื ืงืืืขื ืืื ืฉืคึผืื:
ืืื pg_repack ืึทืจืืขื
ืืึธืืืจ ืืึธืื ืึทื ืืืจ ืืึธืื ืึท ืืึธืจ ืคึผืจืึธืกื ืืืฉ - ืืื ืื ืืขืงืกืื, ืจืืกืืจืืงืฉืึทื ื ืืื, ืืืืืขืจ, ืืื ืืืึธืืืื ื. ืืขืจ ืขืจืฉืืขืจ ืฉืจืื ืคืื pg_repack ืืื ืฆื ืฉืึทืคึฟื ืึท ืงืืึธืฅ ืืืฉ ืฆื ืงืจืึธื ืืึทืื ืืืขืื ืึทืืข ืขื ืืขืจืื ืืขื ืืฉืขืช ืขืก ืืื ืคืืืกื ืืืง. ืืขืจ ืฆืื ืื ืืืขื ืจืขืคึผืืึทืงืืื ืื ืขื ืืขืจืื ืืขื ืคึฟืึทืจ ืืขืืขืจ ืึทืจืืึทื ืืืืื, ืืขืจืืืึทื ืืืงื ืืื ืืืกืืขืงื. ืืขืจื ืึธื ืึท ืืืฉ ืืื ืืืฉืืคื, ืขื ืืขื ืฆื ืืขืจ ืึธืจืืืื ืขื ืืื ืกืืจืืงืืืจ, ืึธืืขืจ ืึธื ืื ืืขืงืกืื ืืื ืจืืกืืจืืงืฉืึทื ื, ืึทืืื ื ืืฉื ืฆื ืคึผืึทืืขืืขื ืื ืคึผืจืึธืฆืขืก ืคืื ืื ืกืขืจืืื ื ืืึทืื.
ืืขืจื ืึธื, pg_repack ืืจืึทื ืกืคืขืจืก ืื ืืึทืื ืคืื ืื ืึทืื ืืืฉ ืฆื ืื ื ืืึทืข ืืืฉ, ืืืืืึธืืึทืืืฉ ืคืืืืขืจืื ื ืึทืืข ืืจืขืืึทืืืึทื ื ืจืึธืื ืืื ืงืจืืืืฅ ืื ืืขืงืกืื ืคึฟืึทืจ ืื ื ืืึทืข ืืืฉ. ืืขืฉืึทืก ืื ืืืจืืคืืจืื ื ืคืื ืึทืืข ืื ืึทืคึผืขืจืืืฉืึทื ื, ืขื ืืขืจืื ืืขื ืึธื ืงืืืึทืื ืืื ืื ืงืืึธืฅ ืืืฉ.
ืืขืจ ืืืืึทืืขืจ ืฉืจืื ืืื ืฆื ืึทืจืืืขืจืคืืจื ืื ืขื ืืขืจืื ืืขื ืฆื ืื ื ืืึทืข ืืืฉ. ืื ืืืืจืึทืืืึธื ืืื ืืืจืืืขืงืึธืื ืืืืขืจ ืขืืืขืืข ืืืขืจืืืฉืึทื ื, ืืื ืืืขื ืขืก ืืขื ืขื ืืืืื ืืงืขืจืข ืืื 20 ืืืื ืกื ืืื ืงืก ืืื ืื ืงืืึธืฅ ืืืฉ, pg_repack ืึทืงืืืืืขืจื ืึท ืฉืืึทืจืง ืฉืืึธืก, ืืืืืจืืื ืื ืืขืฆืืข ืืึทืื ืืื ืจืืคึผืืืืกืื ืื ืึทืื ืืืฉ ืืื ืื ื ืืึทืข ืืื ืื Postgres ืกืืกืืขื ืืืฉื. ืืึธืก ืืื ืื ืืืืื ืืื ืืืืขืจ ืงืืจืฅ ืฆืืื ืืืขื ืืืจ ืืืขื ื ืืฉื ืงืขื ืขื ืฆื ืึทืจืืขืื ืืื ืื ืืืฉ. ื ืึธื ืืขื, ืื ืึทืื ืืืฉ ืืื ืื ืืืฉ ืืื ืืึธืืก ืืขื ืขื ืืืืกืืขืืขืงื ืืื ืคึผืืึทืฅ ืืื ืคืจืื ืืื ืื ืืขืงืข ืกืืกืืขื. ืืขืจ ืคึผืจืึธืฆืขืก ืืื ืืึทื ืฅ.
ืึทืืฅ ืงืืงื ืืจืืืก ืืื ืืขืึธืจืืข, ืึธืืขืจ ืืืึธืก ืืึทืคึผืึทื ื ืืื ืคืืจ? ืืืจ ืืขืกืืขื pg_repack ืึธื ืืึทืกืข ืืื ืืื ืืขืจ ืืึทืกืข, ืืื ืึธืคึผืืขืฉืืขืื ืืืึทื ืึธืคึผืขืจืึทืฆืืข ืืื ืคืึทื ืคืื ืฆื ืคืจื ืืึทืืื (ืืื ืื ืืขืจืข ืืืขืจืืขืจ, ื ืืฆื Ctrl + C). ืึทืืข ืืขืกืฅ ืืขื ืขื positive.
ืืืจ ืืขืืื ืืขื ืฆื ืื ืขืกื ืืืึทืจื ืงืจืึธื - ืืื ืืขืืึธืื ืึทืืฅ ืืื ื ืืฉื ืืขืืื ืืขื ืืื ืืืจ ืืขืจืืืึทืจื.
ืขืจืฉืืขืจ ืคึผืึทื ืงืืืง ืืืืฃ ืคืึทืจืงืืืฃ
ืืืืฃ ืืขืจ ืขืจืฉืืขืจ ืงื ืืื ืืืจ ืืืงืืืขื ืึท ืืขืืช ืืืขืื ืึท ืืืืขื ืคืื ืึท ืืื ืฆืืง ืงืึทื ืกืืจืืื ืฅ:
$ ./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 ืืึทืคึฟืขื ืืื ืขืงืกืึทืงืืืืึทื.
ืืืื, ืื ืขืกืึทื ืก ืคืื ืื ืคึผืจืึธืืืขื ืืืื ืืื ืื "ืคืึทืจืืึทืืื" ืคืื ืื ืืฉืขืง: ืืื ืืขืจ ืึธืจืืืื ืขื ืืืฉ ืขืก ืึทืงืขืจื ืืื ืืขืจ ืฆืืื ืคืื ืืืขืจืืขืื, ืืื ืืื ืื ื ืืึทืข ืืืฉ ืืื ืืขืจ ืฆืืื ืืืขื ืื sql ืืึทืคึฟืขื ืืื ืขืงืกืึทืงืืืืึทื. ืืขื ืืืื ืืืจ ืืึทืจืคึฟื ืฆื ืืึทืื ืืืืขืจ ืึทื ืื ืืฉืขืงืก ืืขื ืขื ืืืจืืืขืงืึธืื ืื ืืขืืืข ืืื ืืืืืข ืงืึทืกืขืก: ืึธืืขืจ ืฉืืขื ืืืง ืืืืืื ืึธืืขืจ ืฉืืขื ืืืง ืืื.
ืึทืืื ืืืึธืก ืืขืืื ืงืขื ืืึธืื ืืืจ ืืึธืื?
ืฉืึทืคึฟื ืึทื ืืื ืืขืงืก ืขื ืืขื ืฆื ืืืคืขืจื
ืืขืจ ืขืจืฉืืขืจ ืืขืืึทื ืง ืืื ืฆื ืืืจืืคืืจื ืืืืืข ืืฉืขืงืก ืืื ืืึทืืืืง ืืึธืืข. ืืึธืก ืงืขื ืืืฉืขื ืขืจืืื ืขืืืขืืข ืคืึทืืฉ positive ืจืืกืืจืืงืฉืึทื ื, ืึธืืขืจ ืืืื ืขืก ืืขื ืขื ืืืืื ืืง ืคืื ืืื, ืืึธืก ืืึธื ื ืืฉื ืืืืจืงื ืื ืึทืจืืขื ืคืื ื ืืฆืขืจืก, ืืืืึทื ืึทืืึท ืงืึธื ืคืืืงื ืืื ืึท ื ืึธืจืืึทื ืกืืืืึทืฆืืข ืคึฟืึทืจ ืืื. ืืื ืคืึทืื, ืืืฉื, ืืืขื ืฆืืืื ืืืืขืจื ืึธื ืืืืื ืฆื ืจืขืืึทืืืจื ืื ืืขืืืข ืืืืืืฉืื ืืื ืืขืจ ืืขืืืืงืขืจ ืฆืืื, ืืื ืืขืจ ืงืืืขื ื ืคืื ืื ืฆืืืืื ืืึทื ืืฆืขืจ ืืื ื ืืฉื ืืึธืื ืฆืืื ืฆื ืืึทืงืืืขื ืืื ืคึฟืึธืจืืึทืฆืืข ืึทื ืื ืืืืืืฉืื ืืื ืฉืืื ืืคืืขืฉืืขืื ืคึฟืึทืจ ืขืืืืื ื ืืืจื ืืขืจ ืขืจืฉืืขืจ ืืึทื ืืฆืขืจ. ืืื ืึทืืึท ืึท ืกืืืืึทืฆืืข, ืืขืจ ืกืขืจืืืขืจ ืืืื ืื ืจืืข ืืึทื ืืฆืขืจ, ืืื ืืืื ืงืืืขื ื ืจืึธืืืก ืฆืืจืืง ืื ืขื ืืขืจืื ืืขื ืืื ืืืึทืงืก ืื ืืืืืืฉืื. ื ืืืกื ืฉืคึผืขืืขืจ, ืืืขื ืืขืจ ืขืจืฉืืขืจ ืืึทื ืืฆืขืจ ืงืึทืืคึผืืืฅ ืขืืืืื ื, ืืขืจ ืฆืืืืืืขืจ ืืืขื ืืึทืงืืืขื ืืื ืคึฟืึธืจืืึทืฆืืข ืึทื ืื ืืืืืืฉืื ืืื ื ืื ืืขืจ ืืคืืขืฉืืขืื ืืื ืงืขื ืขื ืืืืขืจืืืจื ืืืืขืจ ืงืึทืืฃ.
ืฆื ืขื ืฉืืจ ืึทื ืืฉืขืงืก ืืขื ืขื ืฉืืขื ืืืง ืืื ื ืื-ืืืคืขืจื ืืึธืืข, ืืืจ ืืืฉืืคื ืึท ื ืืึท ืืื ืืขืงืก ืขื ืืขื ืฆื ืืขืจ ืึธืจืืืื ืขื ืืืคืขืจื ืงืึทื ืกืืจืืื ืฅ:
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 ืืขืืจืืขื ืคึผืื ืงื ืึทืืื). ืืืขืจ ืขืก ืืื ืึท ืคึผืจืึธืืืขื - ืืืจ ืืขื ืขื ืฉืืคื ืึท ืืึทื ื-ืืืืคื ืืจืึทื ืกืึทืงืืืึธื, ืืื ืืึธืก, ืืื ืคืจืืขืจ ืืขืืืื, ืืื ืึท ืกืึทืงืึธื ืข ืฆื ืื ืืืขืจืืืฉืึทื ืก ืคืื ืึท ื ืืึท ืืืึธืึทื.
ืื ืจืืข ืืืืืื ื ืืื ืืขืจ ืงืึธืืคึผืืืฆืืจื, ืึธืืขืจ ืืืกืืึธืืข ืืขืจ ืจืืืืืง: ืฉืึทืคึฟื ืึท ืืืึทื ืืื ืื ืงืืึธืฅ ืืืฉ ืืื ืื ืืืืขื ืึทืคืืื ืืจืึทื ืกืึทืงืืืึธื ืืืึธืก ืฆืืืขืืขืื ืืึทืื ืฆื ืื ืืืฉ. ืืขืจื ืึธื, ืืืขื ืืืจ ื ืึธืืืึทืื ืืึทืื, ืืืจ ืงืขื ืขื ืืจืืคึผืข ืขืก ืืืจื ืืขื ืึทืืจืืืืื ืืื ืขื ืฉืืจ ืึทื ืคึฟืึทืจืืื ืืขื ืข ืขื ืืขืจืื ืืขื ืืขื ืขื ืืจืึทื ืกืคืขืจื ืฆืืืึทืืขื. ืืขืจ ืคึผืขืงื ืืืขื ืืืื ืืขืฉืืคื ืคืื ืขืืืขืืข ืืจืึทื ืืึทืงืฉืึทื ื (ืึธืืขืจ ืืืื ืืจืืืก ืืืื ืขืจ) ืืื ืืืึทื ืืจืืืก ืืืขื ืืืึทืื ืืืคึผืขื ืืื ื ืืืืฃ ืืื ืคืื ืืึทืื ืืื ืืฉืืื ืืืฉื ืืื ืื ืืจืึทื ืืึทืงืฉืึทื ื. ืขืก ืืื ืืืืืืืง ืฆื ืืึธื ืึทื ืืื ื ืืึทืื ืคืื ืคืึทืจืฉืืืขื ืข ืืจืึทื ืืึทืงืฉืึทื ื ืึทืจืืึทื ืื ืงืืึธืฅ ืืืฉ ืืื ืึท ืืจืึทืค - ืกืืจ, ืขืก ืืืขื ื ืื ืืขืจ ืืืื ืืขืืืขื ืฆื ืืืืขื ืขื ืขืก ืกืึทืงืืืขื ืืฉืึทืื, ืืื ืขืก ืืื ืืขืืืขื ืคืจืืขืจ. ืกืขืงืกืงืึทื ืคึฟืึทืจ ืืขืืขืจ ืืงืฉื ืืื ืคึฟืืืืจืืจืื ื ืืืจื tx_id ืืื ืฆื ืืืึทืขืจ, ืึทื ืืื ืืขืงืก ืืื ืืืจืฃ, ืึธืืขืจ ืขืก ืืืขื ืืืื ืคึผืึทืืขืืขื ืึทืจืึธืคึผ ืืขื ืืืคึฟื ืจืขืื ืฆื ืืขืจ ืึธืืืืขืจืืขื ืคืื ืึทืคึผืืืืืื ื ืขืก. ืืื ืึทืืืขืืืื, ืืื ืฉืืขื ืืืง, ืืืจ ืืึทืจืคึฟื ืฆื ืงืจืื ืขืคึผืขืก.
ืึทืืื, ืืืจ ืืึทืฉืืึธืกื ืฆื ืึธื ืืืืื ืืื ืืขืจ ืขืจืฉืืขืจ ืึธืคึผืฆืืข, ืืืืึทื ืขืก ืืื ืกืืืคึผืืขืจ. ืขืจืฉืืขืจ, ืขืก ืืื ื ืืืืืง ืฆื ืคึฟืึทืจืฉืืืื ืฆื ืึท ืืึทื ื ืืจืึทื ืกืึทืงืืืึธื ืืืึธืื ืืืื ืึท ืคืึทืงืืืฉ ืคึผืจืึธืืืขื. ืืื ื ืื ืืืืคึผื ืึทืจืืืขืจืคืืจื ืคืื ืืึทืื ืคืื ืื ืึทืื ืืืฉ ืฆื ืื ื ืืึทืข ืืื ืืืื ืึทืงืขืจื ืืื ืึท ืืึทื ื ืืจืึทื ืกืึทืงืืืึธื, ืื ืงืฉืื ืืื ืคืืจืืืื ืืืขื ืืื "ืืื ืคืื ืืืขื ืืืจ ืคืึทืจืืจืขืกืขืจื ืืขื ืืจืึทื ืกืึทืงืืืึธื?" ืืขืจ ืืขืืืืขืจ ืคืื ืืขืจ ืขืจืฉืืขืจ ืืจืึทื ืกืึทืงืืืึธื ืืขืคึผืขื ืืก ืืขืจ ืืืืคึผื ืืืืฃ ืื ืืจืืืก ืคืื ืืขื ืืืฉ. ืืขืจ ืืขืืืืขืจ ืคืื ืึท ื ืืึท ืืืื ืขืจ ืืขืคึผืขื ืืก ืืืืฃ ืืื ืคืืืข ืขื ืืขืจืื ืืขื ืึทืงืืืืืึทืืืื ืืื ืื ืืืฉ ืืขืฉืึทืก ืื ืืึทืื ืึทืจืืืขืจืคืืจื, ื.ืข. ืืืืฃ ืื ืื ืืขื ืกืืื ืคืื ืื ืืึทืกืข. ืื ืคึผื_ืจืขืคึผืึทืงืง ืืืืคื ืืื ืคืืจืืขืงืืืขื ืืื ืึท ืฆืืื ืคืื ืืื ืืืึทื ืกืขืจืืืืก ืืึทืกืข, ืืื ืื ืืึทื ื ืคืื ืขื ืืขืจืื ืืขื ืืื ืืขืืืขื ืืืกืคึผืจืึทืคึผืึธืจืฉืึทื ืึทืืื ืงืืืื ืงืึทืืคึผืขืจื ืฆื ืื ืึธืจืืืื ืขื ืืจืืืก ืคืื ืืขื ืืืฉ. ืืืจ ืืึทืฉืืึธืกื ืึทื ืืืจ ืงืขื ืขื ืคืึทืจืืึธืื ืื ืฆืืื ืคืื ืึท ื ืืึทืข ืืจืึทื ืกืึทืงืืืึธื (ืคึฟืึทืจ ืคืึทืจืืืืึทื, ืขืก ืืื ืืืจืืฉื ืืืืขื 1 ืฉืขื ืืื 2-3 ืืื ืื).
ืื ืืงืกืคึผืขืจืึทืืึทื ืฅ ืืขื ืขื positive. ืงืึทืืขืจ ืืืืฃ ืคึผืจืึธืืืงืฆืืข ืืืื. ืคึฟืึทืจ ืงืืขืจืืื, ืืึธ ืืื ืึท ืืืื ืืื ืื ืืจืืืก ืคืื ืืืื ืขืจ ืคืื ืื ืืึทืืึทืืืืกืื ื ืึธื ืคืืืกื ืืืง:
ืืื ื ืืืจ ืืขื ืขื ืืึธืจ ืฆืืคึฟืจืืื ืืื ืืขื ืืืืืื ื, ืืืจ ืืึธืื ื ืืฉื ืคึผืจืืืืจื ืฆื ืื ืกืืจืืืขื ื ืื ืจืืข, ืึธืืขืจ ืืืจ ืืึทืืจืึทืืื ืื ืืขืืืขืืงืืื ืฆื ืืืกืงืืืืจื ืขืก ืืื ืื ืคืึทืจืืขื ืืขืจืื ื ืืขืืืขืืึธืคึผืขืจืก. ืืื ืืืขืจ ืงืจืึทื ื ืจืขืืืืืืข, ืืืืืขืจ, ืืื ื ืึธื ื ืืฉื ืืจืืื ืคึฟืึทืจ ืืจืืืกืืขืื, ืืืืึทื ืืืจ ืืืืื ืกืึทืืืื ืืขื ืคึผืจืึธืืืขื ืืื ืืื ืฆืืง ืืืคืขืจื ืจืืกืืจืืงืฉืึทื ื, ืืื ืคึฟืึทืจ ืึท ืคืื-ืคืืขืืืฉื ืืึทืืข ืขืก ืืื ื ืืืืืง ืฆื ืฆืืฉืืขืื ืฉืืืฆื ืคึฟืึทืจ ืื ืืขืจืข ืืืืคึผืก. ืืืจ ืืึธืคื ืฆื ืงืขื ืขื ืฆื ืืึธื ืืึธืก ืืื ืืขืจ ืฆืืงืื ืคึฟื.
ืืึธืืขืจ ืืืจ ืืึธื ืึท ืงืฉืื, ืืืึธืก ืืึธืื ืืืจ ืืคืืื ืืึทืงืืืขื ืื ืืืึทืืืื ืืื ืืขื ืืขืฉืืืืข ืืื ืื ืืึธืืืคืืงืึทืืืึธื ืคืื pg_repack, ืืื ืืึธื ื ืื, ืืืฉื, ื ืืฆื ืืืึทื ืึทื ืึทืืึธืืืขืก? ืืื ืขืืืขืืข ืคืื ื ืืืจ ืืืื ืืขืืึทื ืง ืืืขืื ืืขื, ืึธืืขืจ ืื positive ืืขืจืคืึทืจืื ื ืคืื ื ืืฆื ืขืก ืคืจืืขืจ, ืืืืฃ ืืืฉื ืึธื ืืืคืขืจื ืงืึทื ืกืืจืืื ืฅ, ืืึธืืืึทืืืืืืึทื ืืื ืื ืฆื ืคึผืจืืืืจื ืฆื ืคึฟืึทืจืฉืืืื ืื ืขืกืึทื ืก ืคืื ืืขื ืคึผืจืึธืืืขื ืืื ืคืึทืจืจืืืื ืขืก. ืืื ืึทืืืฉืึทื, ืื ื ืืฆื ืคืื ืื ืืขืจืข ืกืึทืืืฉืึทื ื ืจืืงืืืืืขืจื ืฆืืื ืฆื ืืืจืืคืืจื ืืขืกืฅ, ืึทืืื ืืืจ ืืึทืฉืืึธืกื ืึทื ืืืจ ืืืขืื ืขืจืฉืืขืจ ืคึผืจืืืืจื ืฆื ืคืึทืจืจืืืื ืืขื ืคึผืจืึธืืืขื ืืื ืขืก, ืืื ืืืื ืืืจ ืืืื ืืขืืขื ืึทื ืืืจ ืงืขื ืขื ื ืืฉื ืืึธื ืืึธืก ืืื ืึท ืืืืึทื ืฆืืื, ืืืจ ืืืขืื ืึธื ืืืืื ืงืืงื ืืื ืึทื ืึทืืึธืืืขืก. .
ืคืืื ืืื ืื
ืืืึธืก ืืืจ ืงืขื ืขื ืจืขืงืึธืืขื ืืืจื ืืืืืจื ืืืืฃ ืืื ืืืขืจ ืืืืืขื ืข ืืขืจืคืึทืจืื ื:
- ืืึธื ืืืึธืจ ืืืื ืืืึธืืืื ื. ืืึทืืืจื ืืืืฃ ืืึธื ืืืึธืจืื ื ืืึทืื, ืืืจ ืงืขื ืขื ืคึฟืึทืจืฉืืืื ืืื ืืขืืื ื ืึทืืืึธืืืึทืงืืื ืืื ืงืึทื ืคืืืืขืจื.
- ืกืืจืืืขืจื ืื AUTOVACUUM ืฆื ืืึทืืื ืืืึธืืืื ื ืืืืฃ ืึท ืคึผืึทืกืืง ืืืจืื.
- ืืืื ืื ืืืึธืืืื ื ืืื ื ืึธื ืืจืึธืืื ื ืืื ืืืจ ืงืขื ืขื ื ืืฉื ืืึทืงืืืขื ืขืก ืืื ืืืฉืืจืื, ืืึธื ื ืื ืืืื ืืขืจืฉืจืึธืงื ืฆื ื ืืฆื ืคืื ืืจืืืกื ืืืง ืืงืกืืขื ืฉืึทื ื. ืื ืืืืคึผื ืืึทื ืืื ืฆื ืคึผืจืืืืจื ืึทืืฅ ืืขืืื ื.
- ืื ืืืืกื ื ืืฉื ืืืื ืืขืจืฉืจืึธืงื ืฆื ืืึธืืืคืืฆืืจื ืคืื ืืจืืืกื ืืืง ืกืึทืืืฉืึทื ื ืฆื ืืืื ืืืืขืจืคืขื ืืฉื - ืืื ืืึธืก ืงืขื ืืืื ืืขืจ ืขืคืขืงืืืื ืืื ืืคืืื ืืจืื ืืขืจ ืืื ืืฉืึทื ืืื ื ืืืื ืืืืืขื ืข ืงืึธื.
ืืงืืจ: www.habr.com