- empno, deptno 컬럼을 가지는 tab 테이블이 존재하고, tab테이블의 empno 컬럼만 인덱스가 생성 되어 있다고 가정하고요..
- 아래와 같이 empno 인덱스를 사용하여 데이터를 조회 할 때 인덱스가 생성되지 않은 deptno가 조건절에 함께 사용된다면
SELECT /*+ index(tab tab_empno_ix) */ empno FROM tab WHERE deptno = 10 AND empno BETWEEN 1 AND 100;
deptno 을 조건을 비교하기 위해 테이블에서 데이터를 조회해야 합니다.
이때 ROWID로 deptno을 가져오기 위해 Random ACCESS가 발생합니다. (TABLE ACCESS BY INDEX ROWID)
- RANDOM ACCESS는 질문하신 것 처럼 하나의 row를 읽더라도 블록단위로 I/O 가 발생합니다.
Random ACCESS가 많다면 많은 블록을 읽어야 하기 때문에 성능문제가 발생 할 수 있겠죠..
일반적으로 랜덤 ACCESS는 sequential 하게 테이블 데이터를 Access하는게 아니라 ROWID를 이용하여 랜덤으로 테이블 데이터를 Access하는 경우를 말합니다.
답변 감사합니다.
찾아본 결과로는 확인, 추출, 정렬 랜덤 인덱스가 있던데
내용을 보니 확인 랜덤엑세스의 경우는 where절의 컬럼이 인덱스에 없어서
발생하는 것이라 쳐도, 추출 랜덤엑세스의 경우는 인덱스에 해당 컬럼이 있어도
테이블 조회시 불가피하게 랜덤엑세스가 발생하는것으로 보이는데요.
그렇다면 어떠한 쿼리를 실행하여도 랜덤엑세스는 무조건 발생하는것인가요?
아니면 랜덤 엑세스 자체가 일어나지 않는 방법이 있는것인가요?
더불어 추출 랜덤 엑세스의 경우는 불가피하게 발생하는 것이고,
인덱스에 where의 컬럼이 없어서 발생하는 확인 랜덤 엑세스의 발생을
방지해야하는 것인가요?
랜덤 엑세스를 발생하지 않게 하려면 인덱스의 ROWID를 이용하여 테이블을 ACCESS하지 않고, 테이블의 처음부터 sequential 하게 스캔하면 되겠죠. 가장 간단한 방법은 FULL 스캔이 있습니다.
보통 이론적으로 OLTP 환경은 화면에 적은 ROW를 출력하기 때문에 인덱스를 이용한 ACCESS를 사용하며, OLAP 환경은 전체 FULL 스캔을 해야 하는 경우가 많다고 합니다.
하지만 실제 업무에서는 이렇게 단순하지 않기 때문에 튜너의 역할이 중요한 거 같습니다.
말씀해 주신 랜덤 엑세스에 대해서 잘 정리된 강좌가 있었네요.. ^^
http://www.gurubee.net/lecture/2230
http://www.gurubee.net/lecture/2235