SQL> SELECT name, value FROM v$sysstat
2 WHERE name LIKE '%table scans%';
NAME VALUE
--------------------------------------------------------- -----
table scans (short tables) 125
table scans (long tables) 30
table scans (rowid ranges) 0
table scans (cache partitions) 0
table scans (direct read) 0
table scan rows gotten 21224
table scan blocks gotten 804
7 rows selected.
表扫描长表和表扫描短表的值与全表扫描有关
如果表扫描长表的数量较大那么被访问的表中有很大比例不是按索
引查找的应用程序可能需要优化或者需要增加索引确保有适当的索引
优化全表扫描
DB_FILE_MULTIBLOCK_READ_COUNT 初始化参数可以确定在全表扫描期
间一个 I/O 操作中读取的最大数据库块数
该参数的设置可以减少全表扫描所需的 I/O 调用数量从而改进性能
I/O 是操作系统的一个功能因此操作系统特有的限制会对该参数的设置有影
响Oracle 服务器读取多个块的能力受到操作系统的限制上限为一次 I/O 调
用中能够读取的字节数
在大多数平台7.3 版本之前上最大的读取内存块为 64 KB 所以将
上面提到的 DB_FILE_MULTIBLOCK_READ_COUNT 参数设置为 64 KB 每
DB_BLOCK_SIZE 对性能没有任何额外的好处
大多数平台7.3 或更高版本不再设置
DB_FILE_MULTIBLOCK_READ_COUNT 参数的上限另外该参数是动态
的所以单独的会话可以使用 ALTER SESSION SET 命令为批处理类型工作
设置更大的大小
设置 DB_FILE_MULTIBLOCK_READ_COUNT 参数规定了完成表扫描所需的 I/
O 调用的次数例如如果 DB_FILE_MULTIBLOCK_READ_COUNT 设置为
16 并且 Oracle 块的大小等于 4 KB 那么在一次过程中可以读取一个 64 KB
表的连续扫描这改善了表扫描的速度并增强了总体查询性能设置
DB_FILE_MULTIBLOCK_READ_COUNT 参数的目的是在更少更大的 I/O
中执行表扫描达到此目标的方法是评估这段时间内完成每个表扫描所需的
块数然后调整该参数以使大多数扫描可以在一次 I/O 中完成执行全表扫描实际所需的 I/O 总数取决于其它因素诸如表的大小和是否使用
并行查询
基于成本的优化程序使用所有这些因素包括
DB_FILE_MULTIBLOCK_READ_COUNT 参数来确定全表扫描的成本如果
全表扫描的成本小于索引扫描则基于成本的优化程序支持全表扫描
监
阅读(1758) | 评论(0) | 转发(0) |