1.
optimizer_mode
RULE, COST,CHOOSE,ALL_ROWS,FIRST_ROWS
设置优化程序模式
? 例程级别:
optimizer_mode =
{choose|rule|first_rows|all_rows}
? 会话级别:
alter session set optimizer_mode =
{choose|rule|first_rows|all_rows}
alter system set optimizer_mode='RULE' scope=spfile
为了使用基于成本的优化器(CBO, Cost-Based Optimizer),
你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性。
如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关。 如果table已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器。
在缺省情况下,ORACLE采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器。
2.访问Table的方式
避免全表扫描,通过索引
3.共享SQL语句
共享的语句必须满足三个条件:
A、 字符级的比较: 当前被执行的语句和共享池中的语句必须完全相同。
B、 两个语句所指的对象必须完全相同:
C、 两个SQL语句中必须使用相同的名字的绑定变量(bind variables)。
4.选择最有效率的表名顺序(只在基于规则的优化器中有效)
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理。
在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。
5.WHERE子句中的连接顺序
ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。
6.SELECT子句中避免使用 ' * '
7.减少访问数据库的次数
8.使用DECODE函数来减少处理时间
本内容试读结束,登录后可阅读更多
下载后可阅读完整内容,剩余1页未读,立即下载