ν
μ΄λΈκ³Ό μΈλ±μ€μ λν ν½μ°½μ μν₯μ λ리 μλ €μ Έ μμΌλ©° Postgresμλ§ μ‘΄μ¬νλ κ²μ΄ μλλλ€. VACUUM FULLμ΄λ CLUSTERμ κ°μ΄ μ¦μ μ²λ¦¬ν μ μλ λ°©λ²μ΄ μμ§λ§ μλ μ€μ ν
μ΄λΈμ μ κ·ΈκΈ° λλ¬Έμ νμ μ¬μ©ν μλ μμ΅λλ€.
μ΄ κΈ°μ¬μλ ν½μ°½μ΄ μ΄λ»κ² λ°μνλμ§, μ΄λ»κ² λμ²ν μ μλμ§, μ§μ°λ μ μ½ μ‘°κ±΄ λ° pg_repack νμ₯ μ¬μ© μ λ°μνλ λ¬Έμ μ λν κ°λ¨ν μ΄λ‘ μ΄ ν¬ν¨λμ΄ μμ΅λλ€.
μ΄ κΈμ λ€μμ λ°νμΌλ‘ μμ±λμμ΅λλ€.
ν½λ§κ°μ μ λ°μνλμ?
Postgresλ λ€μ€ λ²μ λͺ¨λΈ(
λΆλͺ ν μ΄λ¬ν λ²μ μ λͺ¨λ μ μ₯λμ΄μΌ ν©λλ€. Postgresλ νμ΄μ§ λ¨μλ‘ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©νλ©°, νμ΄μ§λ λμ€ν¬μμ μ½κ±°λ μΈ μ μλ μ΅μ λ°μ΄ν° μμ λλ€. μ΄κ²μ΄ μ΄λ»κ² μΌμ΄λλμ§ μ΄ν΄νκΈ° μν΄ μμ μλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
μ¬λ¬ λ μ½λλ₯Ό μΆκ°ν ν μ΄λΈμ΄ μλ€κ³ κ°μ ν΄ λ³΄κ² μ΅λλ€. ν μ΄λΈμ΄ μ μ₯λ νμΌμ 첫 λ²μ§Έ νμ΄μ§μ μλ‘μ΄ λ°μ΄ν°κ° λνλ¬μ΅λλ€. μ΄λ μ»€λ° ν λ€λ₯Έ νΈλμμ μμ μ¬μ©ν μ μλ λΌμ΄λΈ λ²μ μ νμ λλ€(λ¨μνλ₯Ό μν΄ κ²©λ¦¬ μμ€μ΄ 컀λ°λ μ½κΈ°λΌκ³ κ°μ ν©λλ€).
κ·Έλ° λ€μ νλͺ© μ€ νλλ₯Ό μ
λ°μ΄νΈνμ¬ μ΄μ λ²μ μ λ μ΄μ κ΄λ ¨μ΄ μλ κ²μΌλ‘ νμνμ΅λλ€.
λ¨κ³λ³λ‘ ν λ²μ μ μ
λ°μ΄νΈνκ³ μμ νλ©΄μ λ°μ΄ν°μ μ½ μ λ°μ΄ "μ°λ κΈ°"μΈ νμ΄μ§κ° νμνμ΅λλ€. μ΄ λ°μ΄ν°λ μ΄λ€ κ±°λμλ νμλμ§ μμ΅λλ€.
Postgresμλ λ©μ»€λμ¦μ΄ μμ΅λλ€
λ°λΌμ μ΄ μμμλ νΉμ μμ μ ν μ΄λΈμ΄ XNUMXνμ΄μ§λ‘ ꡬμ±λμ§λ§ κ·Έ μ€ μ λ°μλ§ λΌμ΄λΈ λ°μ΄ν°κ° ν¬ν¨λ©λλ€. κ²°κ³Όμ μΌλ‘ ν μ΄λΈμ μ‘μΈμ€ν λ νμν κ²λ³΄λ€ ν¨μ¬ λ§μ λ°μ΄ν°λ₯Ό μ½κ² λ©λλ€.
μ΄μ VACUUMμ΄ κ΄λ ¨ μλ ν λ²μ μ λͺ¨λ μμ νλλΌλ μν©μ ν¬κ² κ°μ λμ§ μμ΅λλ€. μ νμ μν νμ΄μ§ λλ μ 체 νμ΄μ§μ μ¬μ 곡κ°μ΄ μμ§λ§ μ¬μ ν νμν κ²λ³΄λ€ λ λ§μ λ°μ΄ν°λ₯Ό μ½μ΅λλ€.
κ·Έλ°λ° μμ ν λΉ νμ΄μ§(μ΄ μμμλ λ λ²μ§Έ νμ΄μ§)κ° νμΌ λμ μμΌλ©΄ VACUUMμ΄ ν΄λΉ νμ΄μ§λ₯Ό μλΌλΌ μ μμ΅λλ€. νμ§λ§ μ΄μ κ·Έλ
λ μ€κ°μ μμΌλ―λ‘ κ·Έλ
μλ μ무κ²λ ν μ μμ΅λλ€.
μ΄λ κ² λΉμ΄ μκ±°λ λ§€μ° ν¬λ°ν νμ΄μ§μ μκ° λ§μμ§λ©΄ μ΄λ₯Ό ν½μ°½μ΄λΌκ³ νλ©° μ±λ₯μ μν₯μ λ―ΈμΉκΈ° μμν©λλ€.
μμμ μ€λͺ ν λͺ¨λ κ²μ ν μ΄λΈμμ λΆνμ΄μ€λ₯΄λ νμμ λ©μ»€λμ¦μ λλ€. μΈλ±μ€μμλ μ΄λ κ±°μ λμΌν λ°©μμΌλ‘ λ°μν©λλ€.
λΆνμ΄ μ€λ₯΄λμ?
ν½λ§κ°μ΄ μλμ§ νμΈνλ λ°©λ²μλ μ¬λ¬ κ°μ§κ° μμ΅λλ€. 첫 λ²μ§Έ μμ΄λμ΄λ ν
μ΄λΈμ ν μ, "λΌμ΄λΈ" ν μ λ±μ λν λλ΅μ μΈ μ λ³΄κ° ν¬ν¨λ λ΄λΆ Postgres ν΅κ³λ₯Ό μ¬μ©νλ κ²μ
λλ€. μΈν°λ·μμ κΈ°μ± μ€ν¬λ¦½νΈμ λ€μν λ³νμ μ°Ύμ μ μμ΅λλ€. μ°λ¦¬λ κΈ°μ΄λ‘ μΌμμ΅λλ€
λ λ€λ₯Έ λ°©λ²μ νμ₯ νλ‘κ·Έλ¨μ μ¬μ©νλ κ²μ
λλ€.
μ°λ¦¬λ μ΅λ 20%μ μμ ν½μ°½ κ°μ νμ© κ°λ₯ν κ²μΌλ‘ κ°μ£Όν©λλ€. fillfactorμ μ μ¬νλ€κ³ λ³Ό μ μμ΅λλ€.
ν½λ§κ°μ ν΄μΉνλ λ°©λ²
Postgresμλ κΈ°λ³Έμ μΌλ‘ ν½μ°½μ μ²λ¦¬νλ μ¬λ¬ κ°μ§ λ°©λ²μ΄ μμ§λ§ νμ λͺ¨λ μ¬λμκ² μ ν©ν κ²μ μλλλ€.
λΈλ‘νΈκ° λ°μνμ§ μλλ‘ AUTOVACUUM ꡬμ±. λλ λ μ ννκ²λ κ·νκ° μμ©ν μ μλ μμ€μΌλ‘ μ μ§νλ κ²μ λλ€. μ΄λ 'μ μ₯μ' μ‘°μΈμ²λΌ 보μ΄μ§λ§ μ€μ λ‘λ νμ λ¬μ±νκΈ° μ¬μ΄ κ²μ μλλλ€. μλ₯Ό λ€μ΄, λ°μ΄ν° μ€ν€λ§λ₯Ό μ κΈ°μ μΌλ‘ λ³κ²½νμ¬ κ°λ°μ΄ νλ°ν μ΄λ£¨μ΄μ§κ³ μκ±°λ μΌμ’ μ λ°μ΄ν° λ§μ΄κ·Έλ μ΄μ μ΄ μ§νλκ³ μμ΅λλ€. κ²°κ³Όμ μΌλ‘ λ‘λ νλ‘νμ μμ£Ό λ³κ²½λ μ μμΌλ©° μΌλ°μ μΌλ‘ ν μ΄λΈλ§λ€ λ€λ¦ λλ€. μ΄λ μ§μμ μΌλ‘ 미리 μμ νκ³ κ° ν μ΄λΈμ λ³ννλ νλ‘νμ λ§κ² AUTOVACUUMμ μ‘°μ ν΄μΌ ν¨μ μλ―Έν©λλ€. κ·Έλ¬λ λΆλͺ ν μ΄κ²μ μ½μ§ μμ΅λλ€.
AUTOVACUUMμ΄ ν μ΄λΈμ λ°λΌκ° μ μλ λ λ€λ₯Έ μΌλ°μ μΈ μ΄μ λ ν΄λΉ νΈλμμ μ μ¬μ© κ°λ₯ν λ°μ΄ν°λ₯Ό μ 리νμ§ λͺ»νκ² νλ μ₯κΈ° μ€ν νΈλμμ μ΄ μκΈ° λλ¬Έμ λλ€. μ¬κΈ°μ κΆμ₯ μ¬νλ λΆλͺ ν©λλ€. "맀λ¬λ € μλ" νΈλμμ μ μ κ±°νκ³ νμ± νΈλμμ μκ°μ μ΅μννλ κ²μ λλ€. κ·Έλ¬λ μ ν리μΌμ΄μ μ λ‘λκ° OLAPμ OLTPμ νΌν©μΈ κ²½μ° λΉλ²ν μ λ°μ΄νΈμ 짧μ 쿼리λ λ¬Όλ‘ λ³΄κ³ μ μμ±κ³Ό κ°μ μ₯κΈ° μμ λ λμμ μνν μ μμ΅λλ€. μ΄λ¬ν μν©μμλ μλ‘ λ€λ₯Έ κΈ°λ°μ λΆνλ₯Ό λΆμ°μμΌ κ° κΈ°λ°μ λ μΈλΆμ μΌλ‘ μ‘°μ ν μ μλ€λ μ μ κ³ λ €ν΄ λ³Ό κ°μΉκ° μμ΅λλ€.
λ λ€λ₯Έ μ - νλ‘νμ΄ λμ’ μ΄μ§λ§ λ°μ΄ν°λ² μ΄μ€μ λΆνκ° λ§€μ° λμ κ²½μ°μλ κ°μ₯ 곡격μ μΈ AUTOVACUUMλ λμ²ν μ μμΌλ©° ν½μ°½μ΄ λ°μν μ μμ΅λλ€. ν¬κΈ° μ‘°μ (μμ§ λλ μν)μ΄ μ μΌν μ루μ μ λλ€.
AUTOVACUUMμ μ€μ νμ§λ§ λΆνλ¦Όμ΄ κ³μ 컀μ§λ μν©μμ ν΄μΌ ν μΌ.
ν μ§κ³΅μ΄ κ°λ μ°Έ ν μ΄λΈκ³Ό μΈλ±μ€μ λ΄μ©μ λ€μ μμ±νκ³ κ΄λ ¨ λ°μ΄ν°λ§ λ¨κ²¨λ‘λλ€. λΆνλ¦Όμ μ κ±°νκΈ° μν΄ μλ²½νκ² μλνμ§λ§ μ€ν μ€μ ν μ΄λΈμ λν λ°°νμ μ κΈμ΄ μΊ‘μ²λμ΄(AccessExclusiveLock) μ΄ ν μ΄λΈμ λν 쿼리 μ€νμ νμ©νμ§ μμΌλ©° μ¬μ§μ΄ μ νλ νμ©νμ§ μμ΅λλ€. μλΉμ€ λλ κ·Έ μΌλΆλ₯Ό μΌμ μκ° λμ(λ°μ΄ν°λ² μ΄μ€ λ° νλμ¨μ΄μ ν¬κΈ°μ λ°λΌ μμ λΆμμ λͺ μκ°κΉμ§) μ€μ§ν μ μλ κ²½μ° μ΄ μ΅μ μ΄ κ°μ₯ μ’μ΅λλ€. μμ½κ²λ μμ λ μ μ§ κ΄λ¦¬ κΈ°κ° λμ VACUUM FULLμ μ€νν μκ°μ΄ μμΌλ―λ‘ μ΄ λ°©λ²μ μ°λ¦¬μκ² μ ν©νμ§ μμ΅λλ€.
ν CLUSTER VACUUM FULLκ³Ό λμΌν λ°©μμΌλ‘ ν μ΄λΈμ λ΄μ©μ λ€μ μμ±νμ§λ§ λμ€ν¬μμ λ°μ΄ν°κ° 물리μ μΌλ‘ μ λ ¬λλ μΈλ±μ€λ₯Ό μ§μ ν μ μμ΅λλ€(κ·Έλ¬λ λ―Έλμλ μ νμ λν΄ μμκ° λ³΄μ₯λμ§ μμ΅λλ€). νΉμ μν©μμλ μΈλ±μ€λ³λ‘ μ¬λ¬ λ μ½λλ₯Ό μ½λ μ¬λ¬ 쿼리μ λν μ’μ μ΅μ νμ λλ€. μ΄ λͺ λ Ήμ λ¨μ μ VACUUM FULLκ³Ό λμΌν©λλ€. μ¦, μλ μ€μ ν μ΄λΈμ μ κΈλλ€.
ν μ¬μμΈ μ΄μ λ κ°μ§μ μ μ¬νμ§λ§ νΉμ μΈλ±μ€ λλ ν
μ΄λΈμ λͺ¨λ μΈλ±μ€λ₯Ό λ€μ μμ±ν©λλ€. μ κΈμ μ½κ° μ½ν©λλ€. ν
μ΄λΈμ ShareLock(μμ μ λ°©μ§νμ§λ§ μ νμ νμ©) λ° λ€μ μμ±λλ μΈλ±μ€μ AccessExclusiveLock(μ΄ μΈλ±μ€λ₯Ό μ¬μ©νλ 쿼리 μ°¨λ¨)μ
λλ€. νμ§λ§ Postgres 12 λ²μ μμλ 맀κ°λ³μκ° λ±μ₯νμ΅λλ€.
μ΄μ λ²μ μ Postgresμμλ λ€μμ μ¬μ©νμ¬ REINDEX CONCURRENTLYμ μ μ¬ν κ²°κ³Όλ₯Ό μ»μ μ μμ΅λλ€.
λ°λΌμ μΈλ±μ€μ κ²½μ° "μ¦μ" ν½μ°½μ μ κ±°ν μ μλ λ°©λ²μ΄ μλ€λ©΄ ν
μ΄λΈμλ λ°©λ²μ΄ μμ΅λλ€. λ€μν μΈλΆ νμ₯μ΄ μλνλ κ³³μ
λλ€.
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μμ XNUMXλ‘ μ λ°μ΄νΈνλ©΄ 첫 λ²μ§Έ νλͺ©μ΄ λ λ²μ§Έ νλͺ©κ³Ό μΈ λ²μ§Έ νλͺ© μ¬μ΄μ μλμΌλ‘ "λκΈ°"λ©λλ€. μ΄ μ루μ μ μλνμ§λ§ λ κ°μ§ μ ν μ¬νμ΄ μμ΅λλ€. 첫째, κ°μ΄ μΈν°νμ΄μ€ μ΄λκ°μμ μ¬μ©λλ©΄ μλνμ§ μμ΅λλ€. λμ§Έ, λ°μ΄ν° μ νμ μ λ°λμ λ°λΌ λͺ¨λ λ μ½λμ κ°μ λ€μ κ³μ°νκΈ° μ μ κ°λ₯ν μ½μ μκ° μ νλ©λλ€.
μ΅μ XNUMX: μ»€λ° μμλ§ νμΈλλλ‘ μ μ½ μ‘°κ±΄μ μ°κΈ°ν©λλ€.
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 λͺ λ Ήμ΄ μ€νλ λ λ°μν©λλ€. μ΄λ λ κ²½μ° λͺ¨λμμ κ²μ¬κ° λμΌνκ² μνλλμ§ νμΈν΄μΌ ν¨μ μλ―Έν©λλ€. μ¦, νμ μ§μ°λκ±°λ νμ μ¦μ μνλ©λλ€.
κ·ΈλΌ μ°λ¦¬λ μ΄λ€ μμ΄λμ΄λ₯Ό κ°μ§κ³ μμλμ?
deferredμ μ μ¬ν μΈλ±μ€ μμ±
첫 λ²μ§Έ μμ΄λμ΄λ μ¦μ λͺ¨λμμ λ κ²μ¬λ₯Ό λͺ¨λ μννλ κ²μ λλ€. μ΄λ‘ μΈν΄ μ¬λ¬ κ°μ§ μ€ν μ νμ΄ λ°μν μ μμ§λ§ κ·Έ μκ° μ λλΌλ μ΄λ¬ν μΆ©λμ μ μμ μΈ μν©μ΄κΈ° λλ¬Έμ μ¬μ©μμ μμ μ μν₯μ μ£Όμ΄μλ μ λ©λλ€. μλ₯Ό λ€μ΄ λ λͺ μ μ¬μ©μκ° λμμ λμΌν μμ ― νΈμ§μ μμνκ³ λ λ²μ§Έ μ¬μ©μμ ν΄λΌμ΄μΈνΈκ° 첫 λ²μ§Έ μ¬μ©μκ° νΈμ§ν μ μλλ‘ μμ ―μ΄ μ΄λ―Έ μ°¨λ¨λμλ€λ μ 보λ₯Ό λ°μ μκ°μ΄ μλ κ²½μ°μ λ°μν©λλ€. μ΄λ¬ν μν©μμ μλ²λ λ λ²μ§Έ μ¬μ©μλ₯Ό κ±°λΆνκ³ ν΄λΉ ν΄λΌμ΄μΈνΈλ λ³κ²½ μ¬νμ λ‘€λ°±νκ³ μμ ―μ μ°¨λ¨ν©λλ€. μ μ ν 첫 λ²μ§Έ μ¬μ©μκ° νΈμ§μ μλ£νλ©΄ λ λ²μ§Έ μ¬μ©μλ μμ ―μ΄ λ μ΄μ μ°¨λ¨λμ§ μκ³ ν΄λΉ μμ μ λ°λ³΅ν μ μλ€λ μ 보λ₯Ό λ°κ² λ©λλ€.
κ²μ¬κ° νμ μ§μ°λμ§ μλ λͺ¨λμΈμ§ νμΈνκΈ° μν΄ μλ μ§μ° μ μ½ μ‘°κ±΄κ³Ό μ μ¬ν μ μΈλ±μ€λ₯Ό λ§λ€μμ΅λλ€.
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κ°μ λ μ½λμ λμΌν©λλ€. μ΄λ ν μ€νΈκ° μ±κ³΅ν μ΄μ λ₯Ό μ€λͺ ν©λλ€. "λ°°μΉ μ ν©"μ κ²½μ°λ λ€λ£¨μ§ μμμ΅λλ€. μ°λ¦¬λ insertμ updateλΌλ λ κ°μ§ λͺ λ Ήμ μ¬μ©νκΈ° λλ¬Έμ λ λͺ λ Ήμ μ νν 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λ‘ νν°λ§νλ κ° μμ²μ λν seqscanμ λΉμ©μ΄ λ무 λ§μ΄ λ€κ³ μΈλ±μ€κ° νμνμ§λ§ μ λ°μ΄νΈ μ€λ²ν€λλ‘ μΈν΄ λ°©λ² μλκ° λλ €μ§λλ€. μΌλ°μ μΌλ‘ νμ κ·Έλ λ―μ΄ λ¬΄μΈκ°λ₯Ό ν¬μν΄μΌ ν©λλ€.
κ·Έλμ μ°λ¦¬λ λ κ°λ¨ν 첫 λ²μ§Έ μ΅μ λΆν° μμνκΈ°λ‘ κ²°μ νμ΅λλ€. 첫째, κΈ΄ κ±°λκ° μ€μ λ‘ λ¬Έμ κ° λ μ§ μ΄ν΄νλ κ²μ΄ νμνμ΅λλ€. μ΄μ ν μ΄λΈμμ μ ν μ΄λΈλ‘μ μ£Όμ λ°μ΄ν° μ μ‘λ νλμ κΈ΄ νΈλμμ μμ λ°μνλ―λ‘ μ§λ¬Έμ "μ΄ νΈλμμ μ μΌλ§λ λ릴 κ²μΈκ°?"λ‘ μ νλ©λλ€. 첫 λ²μ§Έ νΈλμμ μ κΈ°κ°μ μ£Όλ‘ ν μ΄λΈ ν¬κΈ°μ λ°λΌ λ¬λΌμ§λλ€. μλ‘μ΄ κΈ°κ°μ λ°μ΄ν° μ μ‘ μ€μ ν μ΄λΈμ λμ λ λ³κ²½ μ¬ν μμ λ°λΌ λ¬λΌμ§λλ€. νμ€μ κ°λμ λ°λΌ. pg_repack μ€νμ μλΉμ€ λ‘λκ° μ΅μμΈ μκ°μ λ°μνμΌλ©° ν μ΄λΈμ μλ ν¬κΈ°μ λΉν΄ λ³κ²½λμ΄ λ무 μμμ΅λλ€. μ°λ¦¬λ μλ‘μ΄ κ±°λ μκ°μ 무μν μ μλ€κ³ κ²°μ νμ΅λλ€(λΉκ΅λ₯Ό μν΄ νκ· 1μκ° 2~3λΆμ λλ€).
μ€νμ κΈμ μ μ΄μμ΅λλ€. μμ°λ μμνμΈμ. λͺ νμ±μ μν΄ λ€μμ μ€ν ν λ°μ΄ν°λ² μ΄μ€ μ€ νλμ ν¬κΈ°λ₯Ό 보μ¬μ£Όλ κ·Έλ¦Όμ λλ€.
μ°λ¦¬λ μ΄ μ루μ
μ μμ ν λ§μ‘±νκΈ° λλ¬Έμ λ λ²μ§Έ μ루μ
μ ꡬννλ €κ³ μλνμ§λ μμμ§λ§ νμ₯ κ°λ°μμ λ
Όμν κ°λ₯μ±μ κ³ λ €νκ³ μμ΅λλ€. λΆννκ²λ μ°λ¦¬μ νμ¬ κ°μ νμ μμ§ κ²μν μ€λΉκ° λμ§ μμμ΅λλ€. μλνλ©΄ μ°λ¦¬λ κ³ μ ν μ§μ°λ μ ν μ¬νμΌλ‘λ§ λ¬Έμ λ₯Ό ν΄κ²°νκ³ μμ ν ν¨μΉλ₯Ό μν΄μλ λ€λ₯Έ μ νμ λν μ§μμ μ 곡ν΄μΌ νκΈ° λλ¬Έμ
λλ€. μ°λ¦¬λ λ―Έλμλ μ΄κ²μ ν μ μκΈ°λ₯Ό λ°λλλ€.
μλ§λ λΉμ μ μ§λ¬Έμ΄ μμ κ²μ λλ€. μ μ°λ¦¬λ pg_repackμ μμ νμ¬ μ΄ μ΄μΌκΈ°μ μ°Έμ¬νκ³ μλ₯Ό λ€μ΄ κ·Έ μ μ¬μ²΄λ₯Ό μ¬μ©νμ§ μμμ΅λκΉ? μ΄λ μμ μμ μ°λ¦¬λ μ΄κ²μ λν΄ μκ°νμ§λ§, μ§μ°λ μ μ½ μ‘°κ±΄μ΄ μλ ν μ΄λΈμμ λ μΌμ° κ·Έκ²μ μ¬μ©ν κΈμ μ μΈ κ²½νμ μ°λ¦¬κ° λ¬Έμ μ λ³Έμ§μ μ΄ν΄νκ³ ν΄κ²°νλ €κ³ λ Έλ ₯νλλ‘ λκΈ°λ₯Ό λΆμ¬νμ΅λλ€. λν λ€λ₯Έ μ루μ μ μ¬μ©νλ κ²½μ°μλ ν μ€νΈλ₯Ό μννλ λ° μκ°μ΄ νμνλ―λ‘ λ¨Όμ λ¬Έμ λ₯Ό ν΄κ²°νλ €κ³ λ Έλ ₯νκ³ ν©λ¦¬μ μΈ μκ° λ΄μ μ΄λ₯Ό μνν μ μλ€λ κ²μ κΉ¨λ«κ² λλ©΄ μ μ¬μ μ μ΄ν΄λ³΄κΈ° μμνμ΅λλ€. .
μ‘°μ¬ κ²°κ³Ό
μ°λ¦¬μ κ²½νμ λ°νμΌλ‘ μ°λ¦¬κ° μΆμ²ν μ μλ κ²:
- λΉμ μ λΆνμ΄ μ€λ₯Έ λΆλΆμ λͺ¨λν°λ§νμμμ€. λͺ¨λν°λ§ λ°μ΄ν°λ₯Ό ν΅ν΄ autovacuumμ΄ μΌλ§λ μ ꡬμ±λμ΄ μλμ§ μ΄ν΄ν μ μμ΅λλ€.
- ν½μ°½μ νμ© κ°λ₯ν μμ€μΌλ‘ μ μ§νλ €λ©΄ AUTOVACUUMμ μ‘°μ νμΈμ.
- λΆνμ΄μ€λ₯΄λ λΆλΆμ΄ μ¬μ ν 컀μ§κ³ κΈ°λ³Έ λꡬλ₯Ό μ¬μ©νμ¬ μ΄λ₯Ό 극볡ν μ μλ κ²½μ° μΈλΆ νμ₯ κΈ°λ₯μ μ¬μ©νλ κ²μ λλ €μνμ§ λ§μμμ€. κ°μ₯ μ€μν κ²μ λͺ¨λ κ²μ μ ν μ€νΈνλ κ²μ λλ€.
- νμμ λ§κ² μΈλΆ μ루μ μ μμ νλ κ²μ λλ €μνμ§ λ§μΈμ. λλ‘λ μμ μ μ½λλ₯Ό λ³κ²½νλ κ²λ³΄λ€ μ΄κ²μ΄ λ ν¨κ³Όμ μ΄κ³ λ μ¬μΈ μλ μμ΅λλ€.
μΆμ² : habr.com