Table Random Access는 엄청난 부하를 유발 하는 작업이며 대부분의 성능 저하 SQL은 Table Random Access에서 시작됩니다.

 

image

 

image

 

인덱스 스캔 후 실제 데이터를 가져오기 위해 Table Random Access를 수행 합니다.

 

해당 작업은 DBMS 성능 부하의 주 요인이 되며  SQL튜닝은 곧 Random I/O (일량) 를 줄이는 일 입니다.

 

Table Random Access 관련 성능 문제를 개선 하기 위해  신규 오라클 버전 ( 12c 이상 ) 에서  Batch I/O 기능이 출시되었습니다.

 

image

image

 

인덱스 스캔 후 추가 정보를 가져오기 위해 Table Random Access를 수행합니다.

 

빈번한 Table Random Access는 큰 부하가 발생 하기 때문에 이 작업을 모아서  읽을 블록이 일정량 쌓이면 한꺼번에 I/O 처리하게 됩니다.

 

장애 현상 발생

 

기존의 인덱스 스캔만으로 결과 집합의 정렬(인덱스 컬럼 기준)이 보장되었습니다. 하지만 Batch I/O 작동 시 이러한 방식의 결과 집합 정렬은 보장되지 않습니다.

 

#. 정렬 관련 주의 사항

*. 인덱스는 정렬된 상태로 저장되어 있고, 인덱스 스캔을 통해 Table Random Access의 결과 집합은 경유한 인덱스의 정렬 순서와 일치합니다. (Batch I/O 기능 False 시)

*. Batch I/O 기능을 작동 시키면 이러한 인덱스를 통한 결과 집합의 정렬보장은 더이상 불가능 합니다. Table Random Access  자체를 Batch 방식응로 처리하기 때문에 순차적으로 테이블을 Access학지 않게 되기 때문입니다.

 

#. 결과 집합의 정렬이 보장되지 않는 CASE ( Batch I/O 기능 True 시)

image

 

 

장애 방지 방법

 

오라클 18c 버전 이상 부터는 정렬이 필요한 SQL은 반드시 ORDER BY 절을 기입하거나 Batch I/O 기능을 끔으로써 결과집합 오픈 전/후 같음을 보장할 수 있습니다.

 

image

 

*. 정렬이 필요한 SQL은 반드시 ORDER BY 문을 사용해야 합니다.

*. 기종의 INDEX, INDEX_ASC, INDEX_DESC 힌트등으로 정렬을 보장했던 SQL에 ORDER BY를 반드시 추가 해야 합니다.

 

 

Batch I/O 기능 끄기

image

 

_optimizer_batch_table_access_by_rowid 를 FALSE 로 변경해서 해결 가능 합니다.

By haisins

오라클 DBA 박용석 입니다. haisins@gmail.com 으로 문의 주세요.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다