PostgreSQL 병행 리팩

PostgreSQL concurrent repack

PostgreSQL 19 베타의 REPACK CONCURRENTLY는 읽기·쓰기를 막지 않고 테이블을 재구성합니다.

···
html
<div class="demo"><div class="head"><b>REPACK CONCURRENTLY</b><span>PG 19 beta</span></div><div class="stage repack"><div class="blockrow"><span>old</span><i></i><i></i><i></i><i></i></div><div class="blockrow compact"><span>new</span><i></i><i></i><i></i><i></i></div><div class="traffic"><b>READ</b><b>WRITE</b></div></div><div class="foot"><span id="repackstatus">copy block 1 / 4</span><span>traffic continues</span></div></div>
css
*{box-sizing:border-box}.demo{width:min(96vw,820px);height:min(94vh,350px);padding:clamp(8px,2vmin,18px);border:1px solid var(--line);border-radius:14px;background:var(--surface);color:var(--fg);display:flex;flex-direction:column;gap:clamp(5px,1.5vmin,12px);font:600 clamp(12px,3.5vmin,15px)/1.25 var(--font-sans),sans-serif;overflow:hidden}.head,.foot,.row{display:flex;justify-content:space-between;align-items:center;gap:8px}.head b{color:var(--accent)}.head span,.foot,.muted{color:var(--muted)}.stage{flex:1;min-height:0;display:flex;align-items:center;justify-content:center;gap:8px}.cell,.pill{border:1px solid var(--line);border-radius:8px;background:var(--bg);padding:clamp(4px,1.2vmin,9px);text-align:center}.pill{border-radius:999px}.on{border-color:var(--accent)!important;background:color-mix(in srgb,var(--accent) 17%,var(--surface))!important;color:var(--fg)!important}.bad{border-color:#e16a5d!important;background:color-mix(in srgb,#e16a5d 18%,var(--surface))!important}.foot{font-size:clamp(12px,3vmin,14px)}.repack{flex-direction:column;justify-content:center;gap:6px}.blockrow{display:flex;align-items:center;gap:6px;width:90%}.blockrow span{width:32px;color:var(--muted)}.blockrow i{height:clamp(13px,4vmin,23px);flex:1;border:1px solid var(--line);border-radius:3px;background:var(--bg)}.blockrow.compact i{opacity:.2;transition:.25s}.blockrow.compact i.on{opacity:1;background:var(--accent)!important;border-color:var(--accent)}.traffic{display:flex;justify-content:space-around;width:90%;color:var(--accent);font-size:clamp(11px,3vmin,14px)}.traffic b{padding:2px 8px;border:1px solid var(--accent);border-radius:99px}
js
let n=0;function tick(){document.querySelectorAll('.compact i').forEach((e,i)=>e.classList.toggle('on',i<=n));document.getElementById('repackstatus').textContent=n===3?'compact copy ready':'copy block '+(n+1)+' / 4';n=(n+1)%4}tick();const t=setInterval(tick,650);document.querySelector('.demo').onclick=()=>{clearInterval(t);tick()}

PostgreSQL 19 베타에는 테이블 공간을 회수하고 내용을 재배치하는 REPACK 명령이 추가됐습니다. CONCURRENTLY 옵션은 재구성 중에도 테이블의 읽기와 쓰기가 계속되도록 합니다.

데모는 기존 블록에서 새 블록으로 데이터가 옮겨지는 동안 조회·쓰기가 흐르는 모습을 보여줍니다. 병행 실행도 추가 디스크 공간과 I/O를 사용하므로 여유 용량과 부하를 확인해야 합니다. 정식 릴리스 전까지는 베타 기능입니다.

언제 쓰나

테이블 재구성이 필요하지만 장시간 읽기·쓰기 차단을 피해야 할 때 베타 기능으로 평가합니다.

페이지로 열기 ↗