Skip to content
튜닝 연습인덱스 스캔 효율과 테이블 액세스
ACC-048

감사용 판매상품 원장 추출이 정렬 때문에 TEMP를 46MB 쓰며 5초 가까이 첫 줄을 내지 못한다

실전SELECT유통123 / 700

상황 ​

외부 감사인이 2년 치 판매상품 원장을 판매번호, 상품번호 순으로 달라고 했다. 감사 기간에는 하루에도 몇 번씩 조건을 바꿔 다시 뽑는다. 추출 프로그램은 결과를 받는 대로 파일에 쓰는데, 정렬이 끝날 때까지 첫 줄이 나오지 않아 프로그램이 수 초 동안 멈춘 듯 보인다. 배치 담당 오과장의 조건은 이렇다. "낮에는 POS 판매 등록이 같은 서버에서 돈다. TEMP를 많이 쓰거나 병렬로 도는 방법은 피하고 싶다."

테이블과 인덱스 ​

  • CF11 판매상품: 1,096,708행 · 8,204블록 · 판매번호 순으로 쌓였다 · 컬럼은 모두 NOT NULL
  • 인덱스 CF11_PK (SLE_NO, ITM_NO): BLEVEL 2 · 리프 약 4,290블록 · CLUSTERING_FACTOR 8,211(테이블 블록 수와 거의 같다) · 통계 최신
  • 세션의 정렬 작업 영역은 약 20MB까지다(PGA 자동 관리) · 원장 한 줄은 약 40바이트라 110만 줄이면 정렬할 양이 약 46MB다
  • POS 판매 등록은 판매마다 CF11에 INSERT한다

원본 SQL ​

sql
SELECT SLE_NO, ITM_NO, SLE_QTY, SLE_UPRC
  FROM CF11
 ORDER BY SLE_NO, ITM_NO

실행계획 학습용 예시 · CF11_PK의 CLUSTERING_FACTOR는 판매번호 순 적재를 전제로 한 값 ​

xplan
----------------------------------------------------------------------------------------------------------------------------
| Id  | Operation          | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads | Writes | Used-Mem | Used-Tmp |
----------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |      1 |        |   1096K|00:00:04.71 |    8204 | 13996 |   5792 |          |          |
|   1 |  SORT ORDER BY     |      |      1 |   1096K|   1096K|00:00:04.71 |    8204 | 13996 |   5792 | 2241K (1)|    46M   |
|   2 |   TABLE ACCESS FULL| CF11 |      1 |   1096K|   1096K|00:00:00.62 |    8204 |  8204 |      0 |          |          |
----------------------------------------------------------------------------------------------------------------------------

[세션 통계] 첫 행이 나오기까지 4.1초 · sorts (disk) 1 · physical writes direct temporary tablespace 5,792

문제 ​

  1. 4.71초가 어디서 나오는지 실행계획의 Reads, Writes, Used-Tmp로 설명하시오.
  2. 대안 넷을 비교하시오. ① PK로 정렬을 대신한다(INDEX FULL SCAN) ② 작업 영역을 키워 메모리에서 정렬한다 ③ 병렬로 읽고 정렬한다 ④ 원장 컬럼을 다 담은 인덱스를 만든다. 각각의 Buffers, TEMP, 첫 줄이 나오는 시점, 오과장의 조건에 맞는지를 쓰시오.
  3. 하나를 골라 SQL을 작성하고, 그 방법이 기대는 전제와 그 전제가 깨지는 경우를 설명하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자