Table Random Access는 엄청난 부하를 유발 하는 작업이며 대부분의 성능 저하 SQL은 Table Random Access에서 시작됩니다.
인덱스 스캔 후 실제 데이터를 가져오기 위해 Table Random Access를 수행 합니다.
해당 작업은 DBMS 성능 부하의 주 요인이 되며 SQL튜닝은 곧 Random I/O (일량) 를 줄이는 일 입니다.
Table Random Access 관련 성능 문제를 개선 하기 위해 신규 오라클 버전 ( 12c 이상 ) 에서 Batch I/O 기능이 출시되었습니다.
인덱스 스캔 후 추가 정보를 가져오기 위해 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 시)
장애 방지 방법
오라클 18c 버전 이상 부터는 정렬이 필요한 SQL은 반드시 ORDER BY 절을 기입하거나 Batch I/O 기능을 끔으로써 결과집합 오픈 전/후 같음을 보장할 수 있습니다.
*. 정렬이 필요한 SQL은 반드시 ORDER BY 문을 사용해야 합니다.
*. 기종의 INDEX, INDEX_ASC, INDEX_DESC 힌트등으로 정렬을 보장했던 SQL에 ORDER BY를 반드시 추가 해야 합니다.
Batch I/O 기능 끄기
_optimizer_batch_table_access_by_rowid 를 FALSE 로 변경해서 해결 가능 합니다.