Oracle优化器的optimizer_mode参数

optimizer_mode参数

  optimizer_mode是oracle 11g的一个优化器参数,在某些时候可以影响优化器的行为,是个不可忽视的细节参数。



SQL> show parameter optimizer;
optimizer_capture_sql_plan_baselines boolean FALSE
optimizer_dynamic_sampling integer 2
optimizer_features_enable string 11.2.0.4
optimizer_index_caching integer 0
optimizer_index_cost_adj integer 100
optimizer_mode string ALL_ROWS
optimizer_secure_view_merging boolean TRUE
optimizer_use_invisible_indexes boolean FALSE
optimizer_use_pending_statistics boolean FALSE
optimizer_use_sql_plan_baselines boolean TRUE

此参数的简单介绍如下,

  oracle优化器在解析sql前先查看这个参数的值。参数optimizer_mode 决定取出多少行后开始向用户返回第一批数据,当值为all_rows时,获取完所有的数据后再开始向用户返回数据。
  这么看来,貌似感觉和执行计划没多大关系,但是oracle优化器在选择执行计划的时候却是会考虑这个参数的,而这里主要体现在btree索引的特性。

Let's make a test

  我们来做一个测试。执行一个sql语句,从t1表中取出object_id列为1-3000的数据,结果以object_id列的值排序。测试情况如下。

SQL> show parameter optimizer_mode;
optimizer_mode string ALL_ROWS
SQL> select * from t1 where object_id between 1 and 3000 order by object_id;
2998 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 2148421099
-----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
-----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2959 | 283K| | 404 (1)| 00:00:05 |
| 1 | SORT ORDER BY | | 2959 | 283K| 400K| 404 (1)| 00:00:05 |
|* 2 | TABLE ACCESS FULL| T1 | 2959 | 283K| | 336 (1)| 00:00:05 |
-----------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter("OBJECT_ID"<=3000 AND "OBJECT_ID">=1)
Statistics
----------------------------------------------------------
          1 recursive calls
          0 db block gets
       1235 consistent gets
          0 physical reads
          0 redo size
     120248 bytes sent via SQL*Net to client
        523 bytes received via SQL*Net from client
          2 SQL*Net roundtrips to/from client
          1 sorts (memory)
          0 sorts (disk)
       2998 rows processed

  我们可以看到,当前optimizer_mode的值为all_rows,优化器选择了全表扫描TABLE ACCESS FULL。那么我们一般的认识是,数据量总量较小或者查询量的总量占比较大的情况下,优化器认为全表扫描的性能较索引检索性能更优。

接下来修改当前会话的optimizer_mode的值为first_rows_10

SQL> alter session set optimizer_mode='first_rows_10';
Session altered.

然后再次测试刚才的SQL语句

SQL> select * from t1 where object_id between 1 and 3000 order by object_id;
2998 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 1057374866
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 12 | 1176 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| T1 | 12 | 1176 | 3 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | I_T1_1 | 2959 | | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("OBJECT_ID">=1 AND "OBJECT_ID"<=3000)
Statistics
----------------------------------------------------------
          1 recursive calls
          0 db block gets
         53 consistent gets
          7 physical reads
          0 redo size
     276790 bytes sent via SQL*Net to client
        523 bytes received via SQL*Net from client
          2 SQL*Net roundtrips to/from client
          0 sorts (memory)
          0 sorts (disk)
       2998 rows processed

呃,,我们发现,调整完这个参数后,优化器立马就选择了索引。

那么,怎么去解释呢?
  这里就需要考虑到btree索引的特性了,因为索引的有序性,也就是获取到的数据是根据索引列排好序的。
  因此,当进行全表扫描时,由于列值杂乱,所以必须等到所有的数据全部获取完毕后才能进行排序,再开始返回第一批数据;而通过索引返回的数据都是有序的,取到第十行时就可以直接返回给用户。
  由于索引的这个小特性,加上optimizer_mode参数对数据操作的影响,间接地影响了优化器的选择行为。

时间: 2024-09-10 13:45:37

Oracle优化器的optimizer_mode参数的相关文章

ORACLE优化器RBO与CBO介绍总结

RBO和CBO的基本概念   Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的优化器有两种,基于规则的优化器(RBO)与基于代价的优化器(CBO)          RBO: Rule-Based Optimization 基于规则的优化器          CBO: Cost-Based Optimization 基于代价的优化器 RBO 自ORACLE 6以来被采用,一直沿用至ORA

ORACLE优化器

oracle|优化 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . 你当然也在SQL句级或是会话(session)级对其进行覆盖. 为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令

如何选择Oracle优化器

1. 选用适合的Oracle优化器 Oracle的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性). 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS .你当然也在SQL句级或是会话(session)级对其进行覆盖. 为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行an

Oracle优化器CBO的知识点

ORACLE 提供了基于成本(CostBased)和基于规则(RuleBased)两种优化器,简称为CBO和RBO,用于确定查询操作的执行计划. 一.如何使用CostBased优化器优化查询操作? 如何使用CBO,那么首先要理解这些概念 1.CBO的成本计算的依据 (1)统计信息:与SQL语句所引用的对象相关以及主机的CPU和IO (2)SQL语句本身 (3).环境:例如与优化器相关的参数设置 2.优化器目标:optimizer_mode (1)ALL_ROWS (2)FIRST_ROWS_N

如何选择Oracle优化器使你事半功倍

  1. 选用适合的Oracle优化器 Oracle的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性). 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS .你当然也在SQL句级或是会话(session)级对其进行覆盖. 为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行

【SQL优化器】初始化参数

一些和优化器相关的初始化参数   1.OPTIMIZER_FEATURES_ENABLE   每个版本的Oracle 优化器特性都不相同,特别是做了版本升级以后一定要修改这个参数才可以使用仅被该版本支持的优化器特性.   可以赋予它的值如:9.2.0.9.0.2.9.0.1.8.1.7.8.1.6 等.   2.CURSOR_SHARING  这个参数会将SQL 语句中的常量用变量来替换,存在大量常量的OLTP 系统可以考虑启用这个参数.但是有一点要明白,绑定变量虽然可以使大量的SQL 重用,减

Oracle优化器:星型转换(Star Query Transformation )

 Oracle优化器:星型转换(Star Query Transformation )  Star query是一个事实表(fact table)和一些维度表(dimension)的join.每个维度表都跟事实表通过主外键join,且每个维度表之间不join. 星型模式设计的好处: 1) 提供了直接.直观的业务实体与终端用户schema设计的映射. 2) 对典型的star query提供了高性能的优化. 3) 通过大量的商业智能工具的广泛支持,可能会期望甚至要求数据仓库架构包含维度表. 星型模式

【云和恩墨大讲堂】从执行计划洞察ORACLE优化器的“小聪明”

作者简介黄浩  惠普 十年一剑,十年磨砺.3年通信行业,写就近3万条SQL:5年制造行业,遨游在ETL的浪潮:2年性能优化,厚积薄发自成一家 主题介绍: Oracle执行计划的另类解读:调皮的执行计划 | 诚实的执行计划 | 朴实的执行计划 说到执行计划,oracle的拥趸们自然而然会兴奋起来.在ORACLE的世界里,执行计划有着其特殊的地位,如果我们将SQL性能优化看成一个生物,那某种程度上,执行计划就是DNA.在某搜索网站中,"oracle 执行计划"关键字的搜索结果与"

【DBAplus】深入Oracle优化器:一条诡异执行计划的解决之道

深入Oracle优化器:一条诡异执行计划的解决之道 DBAplus社群 | 2016-05-05 19:51 CBO计算成本并选择最佳执行计划的至关重要输入物就是表和索引的统计信息,过旧或错误的统计信息则可能导致一个性能极差的执行计划被错误地选中.本文将以一个案例展示诡异的统计信息如何影响执行计划的生成. 1案例介绍 这是一个简单的sql,近两个月来对于告警明细表(分区)做月度汇总查询时,总是出现了异常缓慢的情况. 测试SQL: 字段NEALARM_TIME是固定条件,字段RELATED_EMS