2012년 10월 25일 목요일

실행계획 데이터베이스 튜닝 - 실행계획분석 11

90

랜덤 엑세스는 말 그대로 무작위 데이터 추출을 의미한다.

테이블의 전체 데이터 중에서 어느 정도 엑세스해야 많은 데이터이며 어느 정도 엑세스해야 적은 데이터인지에 대한 기준을 제시하는 한 요소가 랜덤 엑세스

----

인덱스에는 키 컬럼의 값과 ROWID 값이 저장되어 있다.

ROWID는 테이블에 저장되어 있는 각 데이터에 할당된 주소와 같다.

그러므로 데이터 베이스에 있는 모든 데이터는 서로 다른 ROWID 값을 갖는다.

인덱스를 생성할 경우 인덱스 컬럼의 값과 함께 해당 데이터의 ROWID가 함께 저장된다.

따라서 인덱스에 엑세스하면 조건을 만족하는 값에 대해 ROWID를 제공받고 해당 ROWID 값으로 테이블에 엑세스한다.

인덱스를 이용한 테이블 엑세스는 인덱스에서 ROWID 값을 확인하고, 해당 ROWID 값을 이용하여 테이블에서 해당 데이터 만을 추출하는 것을 의미한다.

ROWID 값으로 테이블에 엑세스하는 방식을 랜덤 엑세스라고 한다.

----

SQL 수행 시 랜덤 엑세스가 증가하면 SQL의 성능이 저하되며 어느 시점부터는 테이블 전체 스캔보다 성능이 저하된다.

테이블 전체 스캔은 인덱스 스캔 후 테이블에 엑세스하는 방식처럼 ROWID 값으로 테이블에 엑세스하여 원하는 데이터를 추출하는 방식이 아니다.

테이블의 처음부터 끝까지 차례대로 엑세스하기 때문에 ROWID 값을 이용하지 않게 되며, 그러므로 랜덤 엑세스가 발생하지 않는다.

----

BY INDEX ROWID 실행 계획은 랜덤 엑세스를 의미한다.

실행 계획에서 BY INDEX ROWID나 BY LOCAL INDEX ROWID와 같은 형태는 반드시 랜덤 엑세스를 발생시킨다.

----

인덱스에 엑세스하는 방식을 이용할 것인지 아니면 테이블을 전체 스캔하는 방식을 선택할 것인지는 추출하려는 데이터의 양에 의해 결정될 것이다.

----

랜덤 엑세스에 의한 성능 저하는 I/O와 밀접한 관련이 있다.

인덱스에 엑세스하면 ROWID를 제공받는다.

100,000개의 블록으로 구성된 테이블이 있다고 가정하자.

인덱스로부터 100,000개의 ROWID를 제공받았다면 테이블에 대해 100,000번의 랜덤 엑세스를 수행해야하며, 해당 데이터들이 동일 블록에 존재할 가능성을 배제한다면 100,000번의 디스크 I/O를 발생시켜야 한다.

모든 데이터가 동일 블록에 있다면 메모리에서 엑세스가 발생할 것이다.

결국, 100,000건의 데이터에 대해서 인덱스 엑세스 후 ROWID 값으로 테이블에 엑세스한다면 디스크나 메모리에서 100,000번의 I/O가 발생한다.

테이블 전체 스캔은 테이블의 처음부터 끝까지 모든 데이터를 엑세스하는 실행 방식이다.

물론, 엑세스한 후에 필요없는 데이터에 대해서는 버리는 작업을 별도로 수행해야 한다.

하지만, 랜덤 엑세스처럼 ROWID 값에 의해 테이블에 엑세스하는 것이 아니므로 블록을 하나 하나 엑세스할 필요는 없다.

한 번의 I/O에서 여러 블록을 동시에 엑세스하기 위한 오라클 파라메터로 DB_FILE_MULTIBLOCK_READ_COUNT가 있다.

이 파라메터는 테이블 전체 스캔에서 한 번의 I/O 수행 시 동시에 엑세스하는 블록의 개수를 의미한다.

이 파라메터는 8, 16, 32, 64, 128로 설정된다.

128로 설정되어 있다면 전체 테이블 스캔 시 100,000개의 블록에 엑세스 하기 위해서 790번의 I/O가 발생한다.

----

많은 데이터에 대해 인덱스를 이용하며 엑세스하면 많은 양의 랜덤 엑세스가 발생하며, 랜덤 엑세스는 단일 블록 I/O를 수행하므로 엑세스하는 데이터 블록의 개수가 많다면 성능은 저하된다.

반면에 테이블을 전체 스캔한다면 다중 블록 I/O를 수행하므로 더 적은 I/O로 많은 데이터를 추출할 수 있다.

----

보통의 경우, 테이블의 3%~5% 미만에 대해서만 인덱스를 이용하는 것이 효과적이라고 말을 한다.

대용량의 테이블에 대해서는 1% 정도만 랜덤 엑세스해도 성능을 보장받기 힘들 수 있다.

인덱스 스캔 후 테이블에 엑세스하는 랜덤 엑세스가 증가한다면 어느 시점부터 테이블 전체 스캔 보다 성능이 저하된다.


댓글 없음:

댓글 쓰기