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

19c로 올린 다음 날 판매 SQL 37개에서 실행계획 변경 경보가 울렸다

기초SELECT유통105 / 700

상황 ​

유통 본사 DB를 11g에서 19c로 올린 다음 날, 성능 모니터링 도구가 판매 SQL 37개에 「실행계획 변경」 경보를 띄웠다. 거의 모두 TABLE ACCESS BY INDEX ROWID가 TABLE ACCESS BY INDEX ROWID BATCHED로 바뀐 것이다. 인프라팀은 이렇게 제안했다. "OPTIMIZER_FEATURES_ENABLE을 '11.2.0.4'로 되돌리면 경보가 다 사라진다. 오늘 밤 반영하겠다." 오과장이 대표로 「일별 판매 목록」 SQL의 전후 계획을 보내왔다. 캐시를 비우고 잰 값이다.

테이블과 인덱스 ​

  • CF10 판매: 500,000행 · 4,583블록 · 판매 날짜순으로 쌓였다 · 2023-06-01 706건이 13블록에 모여 있다
  • 인덱스 IX_CF10_SLE_DT (SLE_DT): BLEVEL 2 · 리프 1,393 · CLUSTERING_FACTOR 9,921(교재 03화 실측) · 통계 최신

원본 SQL ​

sql
SELECT SLE_NO, SLE_HMS, SHP_NO
  FROM CF10
 WHERE SLE_DT = :v_dt
 ORDER BY SLE_NO

실행계획 학습용 예시 · 건수와 블록은 적재 데이터(CF10) 그대로 ​

xplan
[11g]
-------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                            | Name           | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads |
-------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                     |                |      1 |        |    706 |00:00:00.05 |      18 |    18 |
|   1 |  SORT ORDER BY                       |                |      1 |    685 |    706 |00:00:00.05 |      18 |    18 |
|   2 |   TABLE ACCESS BY INDEX ROWID        | CF10           |      1 |    685 |    706 |00:00:00.05 |      18 |    18 |
|*  3 |    INDEX RANGE SCAN                  | IX_CF10_SLE_DT |      1 |    685 |    706 |00:00:00.01 |       5 |     5 |
-------------------------------------------------------------------------------------------------------------------------

[19c]
-------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                            | Name           | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads |
-------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                     |                |      1 |        |    706 |00:00:00.02 |      18 |    18 |
|   1 |  SORT ORDER BY                       |                |      1 |    685 |    706 |00:00:00.02 |      18 |    18 |
|   2 |   TABLE ACCESS BY INDEX ROWID BATCHED| CF10           |      1 |    685 |    706 |00:00:00.02 |      18 |    18 |
|*  3 |    INDEX RANGE SCAN                  | IX_CF10_SLE_DT |      1 |    685 |    706 |00:00:00.01 |       5 |     5 |
-------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   3 - access("SLE_DT"=:V_DT)

[대기 이벤트 · 테이블 블록 13개]  11g: db file sequential read 13번 · 19c: db file parallel read 2번

문제 ​

  1. 두 계획에서 무엇이 바뀌었고 무엇이 그대로인지 Buffers, Reads, A-Time, 대기 이벤트로 설명하시오. BATCHED가 하는 일을 설명하시오.
  2. 인프라팀의 제안을 받아들일지 판단하시오. 그 대신 경보 37개 가운데 무엇을 골라 고쳐야 하는지 설명하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자