Oracle的Optimizer(优化器)

 

ORACLE 提供了CBORule Based OptimizerRBORule Based Optimizer两种SQL优化器。

我們可以使用以下語句查看ORACLE处于何种模式:show parameter optimizer_mode Oracle V7以来缺省的设置应是"choose",即如果对已分析的表查询的话选择CBO,是否选择RBO。如果该参数设置为"rule",则不论表是否分析过,一概选用RBO,除非在语句中用hint强制.

CBOORACLE7 引入,但在ORACLE8i 中才成熟。Oracle7版以来采用的许多技术都是基于CBO,:星型连接排列查询,哈希连接查询,和并行查询等.CBO计算各种可能"执行计划""代价",Cost,从中选用Cost最低的方案,作为实际运行方案."执行计划"的计算根据,依赖于数据表中数据的统计分布,Oracle数据库本身对该统计分布并不清楚,需要分析表和相关的索引,才能收集到CBO所需的数据.

RBOOracle6版以来被采用,有着一套严格的使用规则,只要你按照它去写SQL,无论数据表中的内容怎样,也不会影响到你的"执行计划",也就是说对数据不"敏感" ORACLE 已经明确声明在ORACLE9i之后的版本中,RBO将不再支持。选择CBO 是必然的趋势。

一般而言,CBO所选择的"执行计划"都不会比RBO"执行计划",而且相对而言,CBO对程序员的要求没有RBO那么苛刻,节省了程序员为了从多个可能的"执行计划"中选择一个最优的方案而花费的调试时间,但在某些场合下也会存在问题:
   
较典型的问题有:有时,表明明建有索引,但查询过程显然没有用到相关的索引,导致查询过程耗时漫长,占用资源巨大,问题到底出在哪儿呢?按照以下顺序查找,基本上能发现原因所在
.
   
查找原因步骤
:
    
首先,确定数据库运行于何种优化模式下,相应的参数是:optimizer_mode(可以用"show parameter optimizer_mode"查看).

其次,检查被索引的列或组合索引的首列是否出现在PL/SQL语句的Where子句中,这是"执行计划"能用到相关索引的必要条件.
   
第三,看采用了哪些类型的连接方式.Oracle的共有Sort Merge Join(SMJ),Hash Join(HJ)Nested Loop Join(NJ).在两张表连接,且内表的目标列上建有索引时,只有Nested Loop才能有效的利用到该索引.SMJ即使相关列上建有索引,最多只能因索引的存在,避免数据排序过程.HJ由于需做HASH运算,索引的存在对数据查询速度几乎没有影响
.
   
第四,看连接顺序是否允许使用相关的索引.假设表empdeptno列上有索引,dept的列deptno上无索引,where语句有emp.deptno=dept.deptno条件,在做nl连接时,emp做为外表,先被访问,由于连接机制原因,外表的数据访问方式是全表扫描,emp.deptno上的索引显然是用不上,最多在其上做索引全扫描或索引快速全表扫描。

   
第五,是否用到系统数据字典或视图.由于系统数据字典表都未被分析过,可能导致极差的"执行计划".但是不要擅自对数据字典做分析,否则可能导致死锁,或系统性能下降。
   
第六,是否存在潜在的数据类型转换,如将字符型数据与数值型数据比较,Oracle 会自动将字符型用to_number()函数进行转换。

 

    以下小结几点在CBO下写SQL语句的注意事项:

1、 使用CBO 时,编写SQL语句时,不必考虑"FROM" 子句后面的表或视图的顺序和"WHERE" 子句后面的条件顺序;ORACLE7版以来采用的许多新技术都是基于CBO的,如星型连接排列查询,哈希连接查询,函数索引,和并行查询等。

2、如果一个语句使用 RBO的执行计划确实比CBO 好,则可以通过加 " rule" 提示,强制使用RBO

3、使用CBO 时,SQL语句 "FROM" 子句后面的表,必须全部使用ANALYZE 命令分析过,如果"FROM" 子句后面的是视图,则此视图的基础表,也必须全部使用ANALYZE 命令分析过;否则,ORACLE 会在执行此SQL语句之前,自动进行ANALYZE 命令分析,这会极大导致SQL语句执行极其缓慢。

4、使用CBO 时,SQL语句 "FROM" 子句后面的表的个数不宜太多,因为CBO在选择表连接顺序时,会对"FROM" 子句后面的表进行阶乘运算,选择最好的一个连接顺序。假如"FROM" 子句后有6个表,则其可选择的连接顺序就是6*5*4*3*2*1 = 720 种,CBO 选择其中一种,而如果"FROM" 子句后有12个表,则其可选择的连接顺序就是12*11*10*9*8*7*6*5*4*3*2*1= 479001600 种,可以想象从中选择一种,会消耗多少CPU 时间?如果实在是要访问很多表,则最好使用 ORDER 提示,强制使用"FROM" 子句表固定的访问顺序。

5、使用CBO 时,SQL语句中不能引用系统数据字典表或视图,因为系统数据字典表都未被分析过,可能导致极差的“执行计划”。但是不要擅自对数据字典表做分析,否则可能导致死锁,或系统性能严重下降。

6、使用CBO 时,要注意看采用了哪种类型的表连接方式。ORACLE的共有Sort Merge JoinSMJ)、Hash JoinHJ)和Nested Loop JoinNL)。CBO有时会偏重于SMJ HJ,但在OLTP 系统中,NL 一般会更好,因为它高效的使用了索引。

    在两张表连接,且内表的目标列上建有索引时,只有Nested Loop才能有效地利用到该索引。SMJ即使相关列上建有索引,最多只能因索引的存在,避免数据排序过程。HJ由于须做HASH运算,索引的存在对数据查询速度几乎没有影响。

7、使用CBO 时,必须保证为表和相关的索引搜集足够的统计数据。对数据经常有增、删、改的表最好定期对表和索引进行分析,可用SQL语句“analyze table xxx compute statistics for all indexes;"ORACLE掌握了充分反映实际的统计数据,才有可能做出正确的选择。

8、使用CBO 时,要注意被索引的字段的值的数据分布,会影响SQL语句的执行计划。例如:表emp,共有一百万行数据,但其中的emp.deptno列,数据只有4种不同的值,如10203040。虽然emp数据行有很多,ORACLE缺省认定表中列的值是在所有数据行均匀分布的,也就是说每种deptno值各有25万数据行与之对应。假设SQL搜索条件deptno=10,利用eptno列上的索引进行数据搜索效率,往往不比全表扫描的高,ORACLE理所当然对索引“视而不见”,认为该索引的选择性不高。

  我们考虑另一种情况,如果一百万数据行实际不是在4deptno值间平均分配,其中有99万行对应着值105000行对应值203000行对应值302000行对应值40。在这种数据分布图案中对除值为10外的其它deptno 值搜索时,毫无疑问,如果索引能被应用,那么效率会高出很多。我们可以采用对该索引列进行单独分析,或用analyze语句对该列建立直方图,对该列搜集足够的统计数据,使ORACLE在搜索选择性较高的值能用上索引。

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10640532/viewspace-520878/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10640532/viewspace-520878/

Oracle 中的SQL概要和自动调整优化器(Automatic Tuning Optimizer Oracle 中的SQL概要和自动调整优化器(Automatic Tuning Optimizer) 从Oracle 10g起,可以将SQL调优的工作委派给一个被称为自动调整优化器(Automatic Tuning Optimizer)的查询优化器扩展来做。它和查询优化器同属于一个组件而且无法在第一时间得到高效的执行计划。查询优化器被强制必须以最快的速度产生执行计划,典型的在秒级以内。而自动调整... 阅读详情

相关推荐

Oracle优化器(Optimizer)

Oracle在执行一个SQL之前,首先要分析一下语句的执行计划,然后再按执行计划去执行。分析语句的执行计划的工作是由优化器(Optimizer)来完成的。不同的情况,一条SQL可能有多种执行计划,但在某一时点,一定只有一种执行计划是最优的,花费时间是最少的。

oracle优化器怎么调出来,Oracle 配置查询优化器

查询优化器对于SQL语句的性能非常重要,因为我们写的SQL语句最后被数据库执行,是通过查询优化器生成执行计划实现的。如果查询优一. 背景介绍查询优化器对于SQL语句的性能非常重要,因为我们写的SQL语句最后被数据库执行,是通过查询优化器生成执行计划实现的。如果查询优化器生成的执行计划低效,那么就会导致低劣的性能。有一些参数的配置能够影响到查询优化器生成高效的执行计划,但也是有风险的。总之,可以这么...

weixin_32676101的博客 376

Oracle optimizer性能优化手册 chm

数据库开发,Oracle教程  Oracle optimizer性能优化手册 chm,主要是一些Oracle数据库在性能优化方面的技术文章,编译成CHM格式,方便大家阅读。

Oracle 里的优化器

Oracle 里的优化器

u011868279的博客 3094

Oracle Optimizer

A. It determines the optimal table join order and method. 它确定了最优表的连接顺序和方法。 B. It generates execution plans for SQL statements based on relevant schema objects, system and session parameters, and information found in the Data Dictionary. 它根据相关的模式对象、系统和会话参数,

喝醉酒的小白 1950

Oracle优化器Optimizer详解

Oracle在执行一个SQL之前,首先要分析一下语句的执行计划,然后再按执行计划去执行。分析语句的执行计划的工作是由优化器(Optimizer)来完成的。不同的情况,一条SQL可能有多种执行计划,但在某一时点,一定只有一种执行计划是最优的,花费时间是最少的。 相信你一定会用Pl/sql Developer、Toad等工具去看一个语句的执行计划,不过你可能对Rule、Choose、First row

那夜的天空很美丽【信手涂鸦,资于记忆】 1212

Oracle优化器常用参数,Oracle控制优化器偏好--optimizer_mode参数

使用Optimizer_mode参数来控制优化器的偏好,9i常用的几个参数有:first_rows,all_rows,first_rows_N,rule,choose等。而10g少了rule和choose.在执行SQL语句时,有两种优化方法:即基于规则的RBO和基于代价的CBO。 在SQL执行的时候,到底采用何种优化方法,就由Oracle参数 optimizer_mode 来决定。Rule Ba...

weixin_30382147的博客 442

Oracle 浅谈optimizer_mode优化器模式

Oracle query optimizer查询优化器)是我们接触最多的一个数据库组件。查询优化器最主要的工作就是接受输入的SQL以及各种环境参数、配置参数,生成合适的SQL执行计划(Execution Plan)。   Query Optimizer一共经历了两个历史阶段:RBO和CBO。RBO时代,Oracle执行计划是通过一系列固化的规则进行执行计划生成。而CBO时代,则是利用系统

雨花石 2064

Oracle优化器optimizer_mode参数

optimizer_mode参数   optimizer_mode是oracle 11g的一个优化器参数,在某些时候可以影响优化器的行为,是个不可忽视的细节参数。 SQL> show parameter optimizer;optimizer_capture_sql_plan_baselines boolean FALSEoptimizer_dy...

weixin_34064653的博客 832

oracle optimizer_features_enable,Oracle Optimizer:迁移到使用基于成本的优化器—–系列2.1-数据库专栏,ORACLE...

oracle optimizer:迁移到使用基于成本的优化器—–系列2.1系列之二包含影响优化器选择执行计划的初始化参数和oracle内部隐藏参数,合理设置这些参数对于优化器是相当重要的。6.影响优化器的初始化参数除了生成统计资料之外,下面提及的参数设置在你的系统正常工作中扮演着极重要的角色.这些设置将大多依赖于你想创建何种类型的环境。联机,批处理,数据仓库或多于一个的组合。请注意优化器考虑这些参...

weixin_29577613的博客 264

Oracle Optimizer:迁移到使用基于成本的优化器-----系列2.1

Oracle Optimizer:迁移到使用基于成本的优化器-----系列2.1 系列之二包含影响优化器选择执行计划的初始化参数和Oracle内部隐藏参数,合理设置这些参数对于优化器是相当重要的。       6.影响优化器的初始化参数       除了生成统计资料之外,下面提及的参数设置在你的系统正常工作中扮演着极重要的角色.这些设置将大多依赖于你想创建何种类型的环境。联机,

897

Oracle Optimizer:迁移到使用基于成本的优化器-----系

<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

zgqtxwd的专栏 406

oracle 优化器模式 optimizer_mode

os: centos 7.4 db: oracle 11.2.0.4 版本 # cat /etc/centos-release CentOS Linux release 7.4.1708 (Core) # # su - oracle Last login: Tue Jan 21 03:40:05 CST 2020 on pts/0 $ sqlplus / as sysdba; SQL*Plu...

一名数据库爱好者的专栏 1408

Oracle优化器Optimizer详解

Oracle在执行一个SQL之前,首先要分析一下语句的执行计划,然后再按执行计划去执行。分析语句的执行计划的工作是由优化器(Optimizer)来完成的。不同的情况,一条SQL可能有多种执行计划,但在某一时点,一定只有一种执行计划是最优的,花费时间是最少的。 相信你一定会用Pl/sql Developer、Toad等工具去看一个语句的执行计划,不过你可能对Rule、Choose、Firs

Java我人生的技术博客 2796
上一篇: SQL Server统计信息(5)
下一篇: 不同RAID级别对比
cuicuntu1021
博客等级 码龄10年 1粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值