共计 1995 个字符,预计需要花费 5 分钟才能阅读完成。
Oracle 使用 Optimizer_mode 参数来控制优化器的偏好,9i 常用的几个参数有:first_rows,all_rows,first_rows_N,rule,choose 等。而 10g 少了 rule 和 choose.Oracle 在执行 SQL 语句时,有两种优化方法:即基于规则的 RBO 和基于代价的 CBO。在 SQL 执行的时候,到底采用何种优化方法,就由 Oracle 参数 optimizer_mode 来决定。
Rule Based Optimizer(RBO)基于规则
Cost Based Optimizer(CBO)基于成本,或者讲统计信息
SQL> show parameter optimizer_mode;
NAME TYPE VALUE
optimizer_mode string ALL_ROWS
oracle10g 开始默认是 all_rows
ALL_ROWS 不管是不是有统计信息,全部采用基于成本的优化方法,返回最大数的量数据
FIRST_ROWS_n 不管是不是有统计信息,全部采用基于成本的优化方法并以最快的速度,返回前 N 行记录
FIRST_ROWS 使用成本和试探法相结合的方法,查找一种可以最快返回前面少数行的方法
第一个是返回所有行的最小代价,第二个是返回前 N 行的最小代价,最后一个是返回前面的少量行的最好计划
修改全局
alter system set optimizer_mode=all_rows;
修改当前 session
alter session set optimizer_mode=all_rows;
几个参数的具体解释:
optimizer_mode =choose
这个是 Oracle 的默认值。采用这个值时,Oracle 即可以采用基于规则 RBO,也可以采用基于代价的 CBO,到底使用那个值,取决于当前 SQL 的被访问的表中是不是有可以使用的统计信息。如果有多个被访问的表,其中有一个或多个有统计信息,那么 Oralce 会对没有统计信息的表进行采样统计(即不全部采样),统计完成后,使用基于代价的优化方法 CBO。如果所有被访问的表都没有统计信息,Oracle 就会采用基于规则的优化方法 RBO。
Optimizer_mode=First_rows
在 oracle 9i 之后这一选项已经过时,出于向后兼容的目的保留了这一选项,该选项的作用在于寻找能够在最短的时间内返回结果集的第一行的执行计划。这一规则倾向于促使优化器使用索引访问路径,偶尔会出现非常不恰当的访问路径。
设置为这种 CBO 模式以后,SQL 语句返回结果的速度会尽可能的快,而不管系统全部的查询是否会耗时较长或者耗系统资源过多。由于利用索引会使查询速度加快,所以 first_rows 优化模式会在全表扫描上进行索引扫描。这种优化模式一般适合于一些 OLTP 系统,满足用户能够在较短时间内看到较小查询结果集的要求。
Optimizer_mode=all_rows
优化器将寻找能够在最短的时间内完成语句的执行计划。
设置为这种 CBO 模式以后,将保证消耗的所有计算资源最小,尽管有时查询结束以后没有结果返回。all_rows 的优化模式更倾向于全表扫描,而不是全索引扫描和利用索引排序,因此这种优化模式适合于数据查看实时性不是那么强的数据仓库、决策支持系统和面向批处理的数据库(batch-oriented databases)等。
Optimizer_mode=first_rows_N
N 的值可以为 1,10,100,1000,优化器首先通过彻底分析第一个连接顺序来估计返回行的总数目。这样就可以知道查询可能获得的整个数据集的片段,并重新启动整个优化过程,其目标在于找到能够以最小的资源消耗返回整个数据片段的执行计划。
Oracle 9i 对一些预期返回结果集的数据量小的 SQL 语句优化模式进行了加强,增加了四个参数值:first_rows_1、first_rows_10、first_rows_100、first_rows_1000。CBO 通过 first_rows_n 中的 n 值,决定了返回结果集数量的基数,我们可能仅仅需要查询结果集中的一部分,CBO 就根据这样的 n 值来决定是否使用索引扫描。
optimizer_mode = rule
基于规则的优化器模式,RBO,是早期 Oracle 版本使用过的一种优化模式。由于 RBO 不支持自 1994 年 Oracle 版本的新特性,如 bitmap indexes,table partitions,function-based indexes 等,所以在以后 Oracle 版本中已经不再更新 RBO,并且也不推荐用户使用 RBO 这种优化模式了。
更多 Oracle 相关信息见 Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2018-01/150041.htm