랜덤 엑세스가 무엇인가요? 0 3 3,186

by 푸른기린 [Oracle Tuning] 랜덤엑세스 [2014.06.13 18:22:34]


안녕하세요. 인덱스나 물리적 조인 방법을 공부하다보면
랜덤 엑세스라는 단어를 종종접하는데, 이 랜덤 엑세스의 정확한 의미를 모르겠습니다.


어렴풋이 블록(mssql의 경우 페이지) 단위의 i/o가 수행되므로, 단 하나의 레코드를 읽어도
페이지를 통째로 읽는것이 비효율적인것은 알겠는데
여기서 저 통째로 읽는 것 자체가 랜덤 엑세스라고 간략히 쓰여있는 곳이있어서,
랜덤 엑세스라는 것이  무엇인지 좀더 쉽고 자세히 이해하고 싶어서 질문을 남기게 되었습니다.
도움 주시면 감사하겠습니다.

by 김정식 [2014.06.14 23:46:12]

- 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하는 경우를 말합니다.


by 푸른기린 [2014.06.15 18:19:45]

답변 감사합니다.
찾아본 결과로는 확인, 추출, 정렬 랜덤 인덱스가 있던데
내용을 보니 확인 랜덤엑세스의 경우는 where절의 컬럼이 인덱스에 없어서
발생하는 것이라 쳐도, 추출 랜덤엑세스의 경우는 인덱스에 해당 컬럼이 있어도
테이블 조회시 불가피하게 랜덤엑세스가 발생하는것으로 보이는데요.

 

그렇다면  어떠한 쿼리를 실행하여도 랜덤엑세스는 무조건 발생하는것인가요?
아니면 랜덤 엑세스 자체가 일어나지 않는 방법이 있는것인가요?

더불어 추출 랜덤 엑세스의 경우는 불가피하게 발생하는 것이고,
인덱스에 where의 컬럼이 없어서 발생하는 확인 랜덤 엑세스의 발생을
방지해야하는 것인가요?


by 김정식 [2014.06.15 23:26:19]

 랜덤 엑세스를 발생하지 않게 하려면 인덱스의 ROWID를 이용하여 테이블을 ACCESS하지 않고, 테이블의 처음부터 sequential 하게 스캔하면 되겠죠.  가장 간단한 방법은 FULL 스캔이 있습니다. 
 보통 이론적으로 OLTP 환경은 화면에 적은 ROW를 출력하기 때문에 인덱스를 이용한 ACCESS를 사용하며,  OLAP 환경은 전체 FULL 스캔을 해야 하는 경우가 많다고 합니다.
하지만  실제 업무에서는 이렇게 단순하지 않기 때문에 튜너의 역할이 중요한 거 같습니다.
 
말씀해 주신 랜덤 엑세스에 대해서 잘 정리된 강좌가 있었네요.. ^^
http://www.gurubee.net/lecture/2230
http://www.gurubee.net/lecture/2235

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입