首页 > Linux操作系统 > Linux操作系统 > 参数OPTIMIZER_MODE
optimizer_mode = all_rows
10g默认方式,不管是不是有统计信息,全部采用基于成本的优化方法CBO。如果表没有统计信息,将进行动态采样。
optimizer_mode = first_rows
使用成本和试探法相结合的方法,查找一种可以最快返回前面少数行的方法;这个参数主要用于向后兼容。
设置为这种CBO模式以后,SQL语句返回结果的速度会尽可能的快,而不管系统全部的查询是否会耗时较长或者耗系统资源过多。由于利用索引会使查询速度加快,所以 first_rows 优化模式会在全表扫描上进行索引扫描。这种优化模式一般适合于一些OLTP系统,满足用户能够在较短时间内看到较小查询结果集的要求。
optimizer_mode = first_rows_n
不管是不是有统计信息,全部采用基于成本的优化方法CBO,并以最快的速度,返回前N行记录。
从Oracle 9i开始对一些预期返回结果集的数据量小的SQL语句优化模式进行了加强,增加了四个参数值:first_rows_1、first_rows_10、first_rows_100、first_rows_1000。CBO通过 first_rows_n 中的 n 值,决定了返回结果集数量的基数,我们可能仅仅需要查询结果集中的一部分,CBO就根据这样的 n 值来决定是否使用索引扫描。
optimizer_mode = choose
采用这个值时,Oracle既可以采用基于规则RBO,也可以采用基于代价的CBO,到底使用那个值,取决于当前SQL的被访问的表中是不是有可以使用的统计信息。如果有多个被访问的表,其中有一个或多个有统计信息,那么Oralce会对没有统计信息的表进行动态采样(即不全部采样),统计完成后,使用基于代价的优化方法CBO。
如果所有被访问的表都没有统计信息,Oracle就会采用基于规则的优化方法RBO。
optimizer_mode = rule
这个参数正好和ALL_ROWS相反,不管是不是统计信息,全部采用基于规则的优化方法。基于规则的优化器模式,是早期Oracle版本使用过的一种优化模式。由于RBO不支持自1994年Oracle版本的新特性,如 bitmap indexes,table partitions,function-based indexes等,所以在以后Oracle版本中已经不再更新RBO,并且也不推荐用户使用RBO这种优化模式了。
从上面的讨论可以看出,optimizer_mode 参数的设置对CBO是非常重要的,决定了CBO的基本模式。
会话级别修改optimizer_mode:
SQL> alter session set optimizer_mode='RULE';
会话已更改。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/23135684/viewspace-662503/ ,如需转载,请注明出处,否则将追究法律责任。