[DB Study] 랜덤 액세스

Dae-Hee·2021년 3월 23일
0

Oracle Tuning Essential

목록 보기
6/6
post-thumbnail

[DB Study] 랜덤 액세스

👉 랜덤 액세스

  • 인덱스를 액세스하여 확인한 ROWID를 아용하여
    테이블을 액세스하는 경우 랜덤 액세스가 발생.

  • 확인 랜덤 액세스를 줄이는 것이 쿼리 성능 개선의 중요한 포인트

👉 랜덤 액세스의 종류

  1. 확인 랜덤 액세스 : WHERE 조건 또는 HAVING 절의 칼럼이 인덱스에 존재하지 않아 액세스하는 랜덤 액세스를 확인 랜덤 액세스 이다.
    랜덤 액세스의 횟수보다 최종 결과가 동일하거나 더 적게 추출되어 엑세스 발생 후 버려지는 데이터가 존재한다.

  2. 추출 랜덤 액세스 : SELECT 절의 컬럼이 인덱스에 존재하지 않을때 발생하는 액세스이다.

  1. 정렬 랜덤 액세스 : ORDER BY 절 또는 GROUP BY 절에 사용된 컬림이 인덱스에 존재하지 않을때 발생하는 액세스이다.

👉 추출 랜덤 액세스 감소 확인

  • 확인, 정렬과 다르게 추출 랜덤 액세스는 비교적 많은 칼럼을 소화하기 때문에 단순 인덱스 추가는 힘들수 있다.

  • 매우 자주 사용하는 SQL에 대해서는 추출 랜덤 액세스 제거 고려

  • 하나의 인덱스로 많은 SQL에 대해 추출 랜덤 액세스를 제거할 수 있다면 컬럼이 많더라도 인덱스에 컬럼 추가 고려

  • 인라인 뷰를 통해 데이터가 감소하는 경우 ROWID 이용하여 추출 랜덤 액세스 감소 고려

    SELECT 카드번호, 거래일자, 거래구분, 사용액
      FROM
         ( SELECT 카드번호, 거래일자, 거래구분, 사용액
             FROM 거래내역
            WHERE 카드번호 = '111'
            ORDER BY 거래일자
         )
     WHERE ROWNUM <= 5;
     /*
     예제에서 인라인 뷰의 결과는 1,000건이라고 가정
     최종 결과는 ROWNUM 연산자에 의해 5건의 데이터가 결과로 추출

     카드번호+거래일자 인덱스를 생성한다면 다른 랜덤 액세스는 발생하지 않으며
     추출 랜덤 액세스는 1,000번이 발생할 것이다.
     */

     -------------------------------------------------------------------

     SELECT 카드번호, 거래일자, 거래구분, 사용액
      FROM
         ( SELECT ROWID RID
             FROM 거래내역
            WHERE 카드번호 = '111'
            ORDER BY 거래일자
         ) A,
           거래내역 B
     WHERE A.RID = B.ROWID
       AND ROWNUM <= 5;
    /*
    A 인라인 뷰는 카드번호+거래일자 인덱스를 이용한다면 ROWID 값은 인덱스에 존재하므로
    A 인라인 뷰는 인덱스 스캔으로만 원하는 데이터를 모두 추출할 수 있게 된다.

    따라서 모든 랜덤 액세스는 발생하지 않게되며 A 인라인 뷰와 
    거래내역 테이블은 ROWNUM에 의해 5번만 조인을 수행하게 되어
    거래내역 테이블은 5번의 랜덤 액세스가 발생하게 된다.

    앞의 SQL과 뒤의 SQL은 동일한 결과를 추출하지만
    랜덤 액세스의 횟수는 1,000번에서 5번으로 감소하게 되었다.
    */



📖 참고 자료 : 구루비 http://www.gurubee.net/

0개의 댓글