테마
유통 매장 POS의 「반품·교환」 화면은 영수증 바코드(판매번호 SLE_NO)를 찍어 원래 판매를 찾는다. 다섯 매장에서 하루 약 3,000번 호출된다. 지난달 CF10을 월별 파티션 CF10_P로 옮긴 뒤 이 SQL이 AWR의 논리 읽기 상위 목록에 올라왔다.
바코드에는 판매번호만 있고, POS는 판매번호 말고는 아무것도 넘기지 않는다. POS 프로그램은 이번 분기에 고칠 수 없다.
CF10_P 판매(파티션 복사본, 문제 설정): CF10 500,000행을 PARTITION BY RANGE (SLE_DT) 월별 24칸(P202201 ~ P202312)과 빈 PMAX로 나눠 CTAS로 지었다. 칸 하나는 약 20,800행이고 FULL로 약 191블록이다. 빈 PMAX는 세그먼트가 없다. P202311은 23번째 칸이다.SLE_NO VARCHAR2(15)는 판매일자 8자리 + - + 그날의 일련번호 4자리다('20231107-0215'). 적재 프로그램이 SLE_DT로 번호를 만들기 때문에 앞 8자리는 지금까지 언제나 그 행의 SLE_DT와 같았다. 이 규칙을 지키는 제약은 없다.CF10_P_PK (SLE_NO, SLE_DT)는 LOCAL이다(PK를 LOCAL로 만들려고 파티션 키를 뒤에 붙였다). 칸마다 높이 2다. 다른 인덱스는 없고 통계는 최신이다.CF10에서는 CF10_PK (SLE_NO)로 4블록을 읽었다.SELECT SLE_NO, SLE_DT, SLE_HMS, SHP_NO
FROM CF10_P
WHERE SLE_NO = :sle_no
[:sle_no = '20231107-0215']
-----------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Pstart | Pstop |
-----------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 | 00:00:00.01 | 49 | | |
| 1 | PARTITION RANGE ALL | | 1 | 1 | 1 | 00:00:00.01 | 49 | 1 | 25 |
| 2 | TABLE ACCESS BY LOCAL INDEX ROWID | CF10_P | 24 | 1 | 1 | 00:00:00.01 | 49 | 1 | 25 |
|* 3 | INDEX RANGE SCAN | CF10_P_PK | 24 | 1 | 1 | 00:00:00.01 | 48 | 1 | 25 |
-----------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("SLE_NO"=:SLE_NO)