SQL 튜닝의 시작은 SQL의 의미(작성 의도)를 제대로 파악하는 것
단순히 plan과 index의 비교만으로 판단하게 되면 결과는 빠르게 나올지언정 최초 작성자의 의도를 해칠 수 있으니 주의해야 함.
작성 의도를 파악하여, 이를 해치지 않는 범위 내에서 개선해 나가는게 튜닝임.
INDEX NAME | COLUMN_LIST |
---|---|
INDEX_MBOX_STATUS | USERID, STATUS |
INDEX_MBOX_SENDDATA | USERID, SENDDATE |
SELECT *
FROM (SELECT /*+ INDEX_DESC(A IDX_MOX_SENDDATA) */
A.*,
ROWNUM AS RNUM
FROM TBS_MBOX A
WHERE USERID = :B1
AND STATUS = :B2
AND ROWNUM <= :B3
)
WHERE RNUM >= :B4;
VIEW
COUNT STOPKEY
TABLE ACCESS (BY INDEX ROWID) OF 'TBS_MBOX' (TABLE)
INDEX (RANGE SCAN DESCENDING) OF 'IDX_MBOX_SENDDATE' (INDEX)
위의 실행계획을 보고 조건절을 모두 충족 시키는 INDEX_MBOX_STATUS인덱스를 이용하게 되면 결과 값이 달라 질 수 있음.
위의 SQL의 의도는 USERID, SENDDATE순으로 DESCENDING 정렬된 데이터를 추출하고자 함.
SELECT X.*
FROM (SELECT A.*,
ROWNUM AS RNUM
FROM (SELECT A.*
FROM TBS_MBOX A
WHERE USERID = :B1
AND STATUS = :B2
ORDER BY A.USERID DESC, A.SENDDATE DESC
) A
WHERE ROWNUM <= :B3
) X
WHERE RNUM >= :B4;
위 SQL의 개선안 중 하나는 IDX_MBOX_SENDDATE 인덱스에 STATUS 컬럼을 추가하여 재 생성하는 것.
{*}{color:#ff0000}{*}USER_ID + STATUS + SENDDATE{*}{color} 나 {color:#ff0000}{}USER_ID + SENDDATE + STATUS{*}{color}로 생성할 수도 있다.*