=> 시스템통계의 CPU관련 옵션은 비공식 파라미터를 통해 컨트롤 가능.
오라클 커널코드가 확장됨에 따라, 운영환경을 보다 잘 인지하여, 적절한 실행계획 생성가능하게 됨.
=> 단, 위의 4가지 환경이 테이블 스캔비용이 전부가 아니다.
ASSM기능과 관련된 예외적사실, 병렬처리를 사용한 테이블스탠여부, 파티션 테이블 스캔여부도 함께 고려해야한다.
db_file_multiblock_read_count | 비용 | 조정된 dbf_mbrc |
---|---|---|
4 | 2,396 | 4.17 |
8 | 1,518 | 6.59 |
16 | 962 | 10.40 |
32 | 610 | 16.39 |
64 | 387 | 25.84 |
128 | 245 | 40.82 |
=> dbf_mbrc는 어느 지점을 지나서는 더이상 변하지 않음
오라클은 인스턴스를 시작할때, 운영시스템이 허용하는 최대물리일기크기를 확인하여 db_file_multiblock_read_count의 한계치로 사용하므로
블록크기 | 10,000블록 스캔비용 | 조정된 dbf_mbrc | 80MB스캔비용 |
---|---|---|---|
2KB | 611 | 16.39 | 2,439 |
4KB | 963 | 10.43 | 1,925 |
8KB | 1,519 | 6.59 | 1,519 |
8KB ASSM | 1,540 | N/A | 1,540 |
16KB | 2,397 | 4.17 | 1,199 |
=> 디폴트 블록크기가 8KB인데, 테이블이 4KB크기의 테이블스페이스에 저장되어 있다면 옵티마이저는 db_file_multiblock_read_count를 사실상 2배 늘림으로써 비용계산전에 읽기 크기를 64KB로 고정시킴
=> 블록크기를 증가시키면 테이블 스캔비용이 감소
=> ASSM을 사용하는경우 테이블스켄비용이 약 1.5%증가 (ASSM은 공간관리를 위한 비트맵 영영으로 몇개블록을 사용하므로)
병렬도 | 8i | 9i(I/O) | 10g(I/O) | 9i(CPU) | 10g(CPU) |
---|---|---|---|---|---|
Serial | 1518 | 1519 | 1519 | 5031 | 5030 |
2 | 1518 | 760 | 844 | 2502 | 2779 |
3 | 1518 | 507 | 563 | 1668 | 1852 |
4 | 1518 | 380 | 422 | 1252 | 1389 |
5 | 1518 | 304 | 338 | 1002 | 1111 |
6 | 1518 | 254 | 282 | 835 | 926 |
7 | 1518 | 217 | 242 | 716 | 794 |
8 | 1518 | 190 | 211 | 627 | 695 |
=> 8i:최적의 직렬경로에 대해서 쿼리비용을 계산해서 최적화후, 실제 런타임시에만 병렬로 수행
9i:서로 충돌이 없는 상태에서 100% 병렬수행이가능하다고 가정하고, 병렬도로 나누어진 크기만큼의 데이터 집합에 대해서 효율적으로 최적화 수행
10g:비용계산시 병렬 효율도가 90%로 가정
버전에 따른 병렬처리비용
8i 병렬도가 N일 때의 처리비용 = 직렬처리비용
9i 병렬도가 N일 때의 처리비용 = ceil(직렬처리비용/병렬도)
10g 병렬도가 N일 때의 처리비용 = ceil(직렬처리비용/(0.9*병렬도)
\- optimizer_percent_parallel=75 : 9i에서 병렬도가 4인경우 최종비용은 1519의 25%와 380의 75%를 합산하여 664.75가 된다.
파티션된 테이블에 대해서, 데이터를 가져오는 범위에 따라 실행계획의 차이를 확인한다.