-- 통계 정보 설정 (EXECUTE -> BEGIN ~ END)
BEGIN DBMS_STATS.GATHER_TABLE_STATS('SCOTT', 'S_CUST22');
END;
ALTER SESSION SET WORKAREA_SIZE_POLICY=AUTO;
2. 확인하고자 하는 쿼리
--sh index1
SELECT /*+ gather_plan_statistics */ *
FROM S_CUST22
WHERE CUST_CD BETWEEN '190' AND '200'
AND DIV IN ('30', '40', '50', '60', '20')
AND FLAG = '160';
2-(1). 확인하고자 하는 쿼리 ID 찾기
SELECT SQL_TEXT, SQL_ID, CHILD_NUMBER
FROM V$SQL
WHERE SQL_TEXT LIKE '--sh index1%'
ORDER BY LAST_ACTIVE_TIME DESC;
2-(2). 쿼리 실행계획 확인 - DBMS_XPLAN.DISPLAY_CURSOR
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('dutvb1xyrj5n2', NULL, 'ALLSTATS LAST'));
INDEX SKIP SCAN
3. 실행 계획
3-(1) 인덱스 설정 - (DIV, FLAG, CUST_CD)
CREATE INDEX SCOTT.IX_S_CUST22_02 ON SCOTT.S_CUST22(DIV, FLAG, CUST_CD);
--sh index2
SELECT /*+ gather_plan_statistics */ *
FROM S_CUST22
WHERE CUST_CD BETWEEN '190' AND '200'
AND DIV IN ('30', '40', '50', '60', '20')
AND FLAG = '160';
SELECT SQL_TEXT, SQL_ID, CHILD_NUMBER
FROM V$SQL
WHERE SQL_TEXT LIKE '--sh index2%'
ORDER BY LAST_ACTIVE_TIME DESC;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('5w8jkmzrpw8bu',NULL, 'ALLSTATS LAST'));
INDEX RANGE SCAN
3-(2) 인덱스 설정 - (FLAG, DIV, CUST_CD)
CREATE INDEX SCOTT.IX_S_CUST22_03 ON SCOTT.S_CUST22(FLAG, DIV, CUST_CD);
--sh index3
SELECT /*+ gather_plan_statistics */ *
FROM S_CUST22
WHERE CUST_CD BETWEEN '190' AND '200'
AND DIV IN ('30', '40', '50', '60', '20')
AND FLAG = '160';
SELECT SQL_TEXT, SQL_ID, CHILD_NUMBER
FROM V$SQL
WHERE SQL_TEXT LIKE '--sh index3%'
ORDER BY LAST_ACTIVE_TIME DESC;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('1kytkpa4y5jfq',NULL, 'ALLSTATS LAST'));
INDEX RANGE SCAN
3-(3) 인덱스 설정 - (FLAG, CUST_CD, DIV)
CREATE INDEX SCOTT.IX_S_CUST22_04 ON SCOTT.S_CUST22(FLAG, CUST_CD, DIV);
--sh index4
SELECT /*+ gather_plan_statistics */ *
FROM S_CUST22
WHERE CUST_CD BETWEEN '190' AND '200'
AND DIV IN ('30', '40', '50', '60', '20')
AND FLAG = '160';
SELECT SQL_TEXT, SQL_ID, CHILD_NUMBER
FROM V$SQL
WHERE SQL_TEXT LIKE '--sh index4%'
ORDER BY LAST_ACTIVE_TIME DESC;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('6xbkvxp309qz6',NULL, 'ALLSTATS LAST'));
INDEX RANGE SCAN
4. SQL 튜닝
인덱스에서 38개 블록 + ROW 95건 =133건 읽음인덱스에서 17개 블록 + ROW 95건 =112건 읽음인덱스에서 16개 블록 + ROW 95건 = 111건 읽음인덱스에서 10개 블록 + ROW 95건 = 105건 읽음
INDEX ID
IX_1
IX_2
IX_ 3
👍 IX_ 4
인덱스 순서
CUST_CD, FLAG, DIV
DIV, FLAG, CUST_CD
FLAG, DIV, CUST_CD
FLAG, CUST_CD, DIV
조건
BETWEEN, =, IN
IN, =, BETWEEN
=, IN, BETWEEN
=, BETWEEN, IN
인덱스 매칭도
D, C, C [1]
D, D, D [3]
D, D, D [3]
D, D, C [2]
스캔 방식
INDEX SKIP SCAN
INDEX RANGE SCAN - INLIST ITERATOR
INDEX RANGE SCAN - INLIST ITERATOR
INDEX RANGE SCAN
스캔 순서
2-1-0
3-2-1-0
3-2-1-0
2-1-0
Buffers (Logical Read)
133
112
111
105
Q1. 인덱스 선두 컬럼 : FLAG "=" 조건으로 둠
1-(1). 선두 컬럼에 "=" 조건과 IN 비교 ▶ 큰 차이 없음
Q2. 인덱스 매칭도가 클수록 좋은가 ? ▶ =, BETWEEN, IN 순서의 인덱스가 더 좋은 효율
2-(1). IN이 2~3개면 빠를텐데 5개나 되기 때문에 ? ▶ X, 1개 이외에는 모두 BETWEEN이 우선 순위임이 나음
2-(2). I IN도 인접해있어야한다? ▶ X, 1개 이외에는 모두 BETWEEN이 우선 순위임이 나음
댓글