테마
버거원 DBA가 저장 공간을 줄이려고 운영 주문 테이블 ORD_RANDOM의 인덱스 셋을 압축하는 스크립트를 일요일 09:00에 돌렸다. "두 컬럼짜리는 COMPRESS 2, 한 컬럼짜리는 COMPRESS 1." 결과는 셋이 다 달랐고, 그동안 문을 연 매장의 POS 결제가 몇 초씩 멈췄다는 문의도 들어왔다.
박팀장은 "결과를 설명하고, 고친 스크립트와 다음부터 운영을 막지 않고 미리 재는 방법을 적어 와라"고 했다.
ORD_RANDOM(운영 주문): 1,000,000행 · 22,414블록 · 순서 없이 쌓였다 · ORD_DT VARCHAR2(8) 730일, 하루 약 1,370건 · ORD_HMS VARCHAR2(6)이 09:00:00 ~ 22:59:59에 고르게 분포 · SHOP_NO 200곳에 고르게 · POS가 주문을 계속 INSERT한다ORD_RANDOM_PK (ORD_NO): 유일 인덱스 · 리프 약 2,080블록ORD_RANDOM_X01 (ORD_DT, ORD_HMS): 리프 3,774블록 · 「일별 주문 조회」가 쓴다(첫 화면 1,378블록 가운데 대부분이 테이블 블록, ACC-027)ORD_RANDOM_X02 (ORD_DT, SHOP_NO): 리프 3,774블록 · 월마감 「가맹점별 주문 건수」가 쓴다(한 달 160블록)ORD: 같은 데이터에 같은 정의의 인덱스(ORD_X01, ORD_X02) · 운영 SQL은 쓰지 않는다-- 일요일 09:00 DBA 스크립트
ALTER INDEX ORD_RANDOM_PK REBUILD COMPRESS 1;
ALTER INDEX ORD_RANDOM_X01 REBUILD COMPRESS 2;
ALTER INDEX ORD_RANDOM_X02 REBUILD COMPRESS 2;
[스크립트 결과]
ALTER INDEX ORD_RANDOM_PK REBUILD COMPRESS 1
ORA-25194: invalid COMPRESS prefix length value
ALTER INDEX ORD_RANDOM_X01 REBUILD COMPRESS 2 (09:00:02 ~ 09:00:09)
LEAF_BLOCKS 3,774 → 4,570
ALTER INDEX ORD_RANDOM_X02 REBUILD COMPRESS 2 (09:00:09 ~ 09:00:15)
LEAF_BLOCKS 3,774 → 1,990
[그 뒤 SQL]
월마감 · 2013년 12월 ORD_RANDOM_X02 INDEX RANGE SCAN Buffers 160 → 84
일별 주문 조회 · 첫 화면 ORD_RANDOM_X01 + TABLE ACCESS BY ROWID Buffers 1,378 → 1,379
[09:00:02 ~ 09:00:15 POS 결제 세션]
enq: TM - contention 대기 · 결제 응답 평균 0.4초 → 최대 7초