SQL 튜닝의 시작

SQL 튜닝의 시작은 SQL의 의미(작성 의도)를 제대로 파악하는 것
단순히 plan과 index의 비교만으로 판단하게 되면 결과는 빠르게 나올지언정 최초 작성자의 의도를 해칠 수 있으니 주의해야 함.
작성 의도를 파악하여, 이를 해치지 않는 범위 내에서 개선해 나가는게 튜닝임.

INDEX NAMECOLUMN_LIST
INDEX_MBOX_STATUSUSERID, STATUS
INDEX_MBOX_SENDDATAUSERID, 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}로 생성할 수도 있다.*