오라클의 Table Full Scan과 Index Range Scan

테이블에 저장된 데이터를 읽는 방식은 두 가지이다.

Table Full Scan은 해당 테이블에 전체 블록을 읽어서 사용자가 원하는 데이터를 찾는 방식이다. 그리고 Index Range Scan은 인덱스를 이용하여 데이터를 일정부분읽어서 ROWID로 테이블 레코드를 찾아가는 방식이다. ROWID는 테이블 레코드가 디스크 상에 어디 저장됐는지를 가리키는 위치 정보이다.

상당수의 툴(Toad, Orange)에서 데이터를 Full Scan 하는 경우에 실행계획에서 빨간색으로 경고를 보여준다.

그래서 Table Full Scan에 경우 더 느리다는 고정관념이 있으나 모두 그런것은 아니다. Index를 이용한 스캔방식이 더 느린 경우도 있다.

Table Full Scan에 경우 읽고자 하는 데이터의 블록을 Multi Block I/O로 읽기 때문에 프로세스가 데이터를 바로 처리할 수 있으나, Index의 경우 Single Block I/O로 데이터를 읽는다. 그렇기 때문에 데이터를 모두 읽는 I/O Call이 끝날 때까지 정작 프로세스는 대기 상태에 들어가기 때문에 비효율적인 상태가 된다.

그리고 인접한 데이터 500개를 찾을 경우 Single Block I/O를 사용하는 Index의 경우에는 같은 블록을 500번 방문하는 안좋은 경우가 발생할 수 있다.

경우에 따라 Full Scan이 더 좋은 방법일 수 있고, Index Scan이 좋은 방법일 수 있다. 앞으로 더 공부하면서 어떤경우가 더 좋고 나쁜지 알아봐야겠다.

댓글()