오라클에 select를 날릴 시 만약 인덱스를 이용하는 경우에는 HDD에서 한번에 하나씩의 블록을 읽어오기 때문에 이를 Single Block I/O라고 한다.
인덱스를 이용하지 않는 경우에는 필요한 모든 데이터를 HDD에서 읽어오기 때문에 이를 Multi Block I/O라고 한다.

아래 표를 보자.
표 안의 수치는 (I/O 횟수 / 블록의 갯수)로 보면 된다.
현재 emp테이블에는 100건의 총 데이터가 들어있고, 블록에 관련한 파라미터는 db_file_multiblock_read_count인데 이 값이 20이라고 가정했을 때의 상황이다.

 첫번째 경우  두번째 경우  세번째 경우
 Index  6 / 6  4 / 4  5 / 5
 Full Scan  5 / 100  5 / 100  5 / 100

첫번째 경우를 보면 6건인 경우에는 인덱스를 타는 것보다 풀스캔이 더 효율이 좋으므로 이때는 인덱스를 타지 않고 풀스캔을 해버린다.

위 표를 보면 대략 일반적으로 인덱스 사용의 마지노선을 5%로 한다. 5% 이하일 경우는 인덱스가 유리하고 그 이상일 경우는 풀스캔이 유리하다고들 한다.
그러나 모든 경우에 이것을 적용하는 것은 아니다.
이론적으로는 5% 이하일 경우에는 인덱스를 써야 하는 것이 유리하다고 하는데, 꼭 정해진 대로 해야 하는 것은 아니다. 데이터 건수가 많아지면 풀스캔을 타는 경우도 많다.

이렇게 생각해보자.
수치가 100만 / 1만 이라면 1%이므로 이론적으로는 인덱스를 타야 하지만 이 경우 인덱스를 탔다가는 성능이 좋지 않다. 이때는 풀스캔이 유리하다. 왜냐하면 데이터 건수가 많기 때문에 인덱스를 탄다고 해도 그때의 시간을 무시하지 못하기 때문이다.
대용량의 경우는 인덱스 스캔과 더불이 풀스캔 또한 많이 쓴다.

내가 테이블에서 홍길동 데이터를 찾고 싶은데, 홍길동이 몇 %인지를 어떻게 알 수 있을까? 이에 대해 걱정할 필요는 없다. 우리는 단지 인덱스만 만들어 놓으면 오라클 옵티마이저가 인덱스를 쓸지 안쓸지를 결정한다.
우리는 왜 옵티마이저가 그 인덱스를 쓰기로 결정했을까 쓰지 않기로 결정했을까를 잘 알아야 한다.

'오라클 > SQL' 카테고리의 다른 글

[SQL] 사용자 권한 제어  (0) 2010.08.24
[SQL] 인덱스의 단점  (2) 2010.08.24
[SQL] Index  (0) 2010.08.24
[SQL] View  (0) 2010.08.24
[SQL] Data Dictionary  (0) 2010.08.19
Posted by 겨울섬
,