테마
한빛유통은 최저가 연동 배치가 매일 04시에 상품마다 그날 판매가를 정하고 가격 이력에 새 구간을 연다. 지난달 배치가 재처리되면서 같은 날 구간이 두 번 들어간 상품이 생겼고, 그 상품의 주문은 반품 화면에서 두 줄로 보였다. 그래서 데이터팀이 매일 06시에 겹친 구간을 찾는 점검을 넣었다. 결과는 몇 줄뿐인데 매번 7초 가까이 걸리고, 같은 시각에 도는 정산 배치를 밀어낸다. 조민우는 "읽는 블록이 820개뿐이라 더 줄일 데가 없다"라고 한다.
T_ITM_PRC_LOG 상품 판매가 이력 (이 문제에서 쓰는 파생 테이블, 선분이력): ITM_ID · ST_DTM (구간 시작, DATE) · ED_DTM (다음 구간의 시작 시각, 이 시각 미만까지) · SLE_PRCED_DTM은 DATE '9999-12-31'IX_ITM_PRC_LOG (ITM_ID, ST_DTM): PK나 유니크가 아닌 일반 인덱스라서 같은 시작 시각이 두 번 들어가도 막지 못한다 · 통계 최신SELECT a.ITM_ID, a.ST_DTM, a.ED_DTM, b.ST_DTM AS ST_DTM2, b.ED_DTM AS ED_DTM2
FROM T_ITM_PRC_LOG a, T_ITM_PRC_LOG b
WHERE b.ITM_ID = a.ITM_ID
AND b.ROWID <> a.ROWID
AND b.ST_DTM < a.ED_DTM
AND a.ST_DTM < b.ED_DTM
-------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Used-Mem |
-------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 12 |00:00:06.84 | 820 | |
|* 1 | HASH JOIN | | 1 | 133K| 12 |00:00:06.84 | 820 | 4318K (0) |
| 2 | TABLE ACCESS FULL| T_ITM_PRC_LOG | 1 | 73106 | 73106 |00:00:00.01 | 410 | |
| 3 | TABLE ACCESS FULL| T_ITM_PRC_LOG | 1 | 73106 | 73106 |00:00:00.01 | 410 | |
-------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("B"."ITM_ID"="A"."ITM_ID")
filter(("B"."ST_DTM"<"A"."ED_DTM" AND "A"."ST_DTM"<"B"."ED_DTM" AND "B".ROWID<>"A".ROWID))
[결과] 12행 (상품 6개의 겹친 구간 6쌍이 앞뒤를 바꿔 두 번씩) · CPU used by this session 6.71초