일반적인 세컨더리 인덱스인 경우 리프 노드 자체는 정렬되어 있지만 실제 데이터를 가리키는 레코드 주소는 레코드 한 건 단위로 랜덤 I/O가 일어난다. 인덱스를 통해 데이터 레코드를 읽는 작업은 비용이 많이 드는 작업으로 분류되는 이유이다.
인덱스에서 조건을 만족하는 값이 저장된 위치를 찾는다. 이 과정을 인덱스 탐색(Index seek)이라고 한다.
1번에서 탐색된 위치부터 필요한 만큼 인덱스를 차례대로 쭉 읽는다. 이 과정을 인덱스 스캔(Index scan)이라고 한다.
2번에서 읽어 들인 인덱스 키와 레코드 주소를 이용해 레코드가 저장된 페이지를 가져오고, 최종 레코드를 읽어온다.
쿼리가 필요한 데이터에 따라 3번 과정은 생략될 수 있다. 이것을 바로 커버링 인덱스라 한다. 커버링 인덱스로 처리되면 쿼리는 디스크의 레코드를 읽지 않아도 되기 때문에 랜덤 읽기가 상당히 줄어들고 성능이 빨라진다.
인덱스 풀 스캔
인덱스 레인지 스캔과 마찬가지로 인덱스를 사용하지만 인덱스 레인지 스캔과 달리 인덱스의 처음부터 끝까지 모두 읽는 방식을 인덱스 풀 스캔이라 한다.
일반적으로 인덱스의 크기는 테이블 크기보다 작으므로 직접 테이블을 처음부터 끝 까지 읽는 것 보다 인덱스만 읽는 것이 효율적이다. 쿼리가 인덱스에 명시된 컬럼만으로 조건을 처리할 수 있는 경우 주로 이 방식이 사용된다. 대신 인덱스 뿐만 아니라 데이터 레코드까지 모두 읽어야 한다면 절대 이 방식으로 처리되지 않는다.
이 방식은 인덱스 레인지 스캔보다 빠르지 않지만 테이블 풀 스캔보다 효율적이다. 인덱스 전체 크기는 테이블 자체의 크기보다는 훨씬 작기 때문에 인덱스 풀 스캔은 테이블 전체를 읽는 것 보다 적은 디스크 I/O로 쿼리를 처리할 수 있다.
인덱스의 효율적인 사용: 인덱스 레인지 스캔, 루스 인덱스 스캔
인덱스의 비효율적인 사용: 테이블 전체를 읽는 것, 인덱스 풀 스캔
인덱스 레인지 스캔
인덱스 레인지 스캔은 검색해야 할 인덱스의 범위가 결정되었을 때 사용하는 방식이다.
일반적인
세컨더리 인덱스
인 경우 리프 노드 자체는 정렬되어 있지만 실제 데이터를 가리키는 레코드 주소는 레코드 한 건 단위로 랜덤 I/O가 일어난다. 인덱스를 통해 데이터 레코드를 읽는 작업은 비용이 많이 드는 작업으로 분류되는 이유이다.쿼리가 필요한 데이터에 따라 3번 과정은 생략될 수 있다. 이것을 바로 커버링 인덱스라 한다. 커버링 인덱스로 처리되면 쿼리는 디스크의 레코드를 읽지 않아도 되기 때문에 랜덤 읽기가 상당히 줄어들고 성능이 빨라진다.
인덱스 풀 스캔
인덱스 레인지 스캔과 마찬가지로 인덱스를 사용하지만 인덱스 레인지 스캔과 달리 인덱스의 처음부터 끝까지 모두 읽는 방식을 인덱스 풀 스캔이라 한다.
일반적으로 인덱스의 크기는 테이블 크기보다 작으므로 직접 테이블을 처음부터 끝 까지 읽는 것 보다 인덱스만 읽는 것이 효율적이다. 쿼리가 인덱스에 명시된 컬럼만으로 조건을 처리할 수 있는 경우 주로 이 방식이 사용된다. 대신 인덱스 뿐만 아니라 데이터 레코드까지 모두 읽어야 한다면 절대 이 방식으로 처리되지 않는다.
이 방식은 인덱스 레인지 스캔보다 빠르지 않지만 테이블 풀 스캔보다 효율적이다. 인덱스 전체 크기는 테이블 자체의 크기보다는 훨씬 작기 때문에 인덱스 풀 스캔은 테이블 전체를 읽는 것 보다 적은 디스크 I/O로 쿼리를 처리할 수 있다.
예상 질문