Oracle数据库厉行计划详解

数据库 Oracle
本文我们主要介绍了Oracle数据库厉行计划的相关知识,包括厉行计划的概念、厉行计划的应用实例、Oracle优化器形式以及厉行计划对我们的用途等,希望能够对您有所帮助。

Oracle数据库厉行计划的相关知识是本文我们主要要介绍的内容,我们首先介绍了厉行计划的概念,然后给出了两个厉行计划的实例进行说明,***介绍了Oracle优化器的形式以及厉行计划对我们的用途,接下来就让我们一起来了解一下这部分内容。

什么是厉行计划

所谓厉行计划,望文生义,即便对一个查询任务,做出一份怎样去告终任务的翔实计划。举个生存中的例子,我从珠海要去英国,我能够抉择先去香港然后起色,也能够先去北京起色,可能去广州也能够。然而究竟怎样去英国划算,也即便我的开支起码,这是一件划算考究的事情。同样对于查询而言,我们提交的SQL仅仅是描写出了我们的目标地是英国,但至于怎么去,等闲我们的SQL中是未曾给出提醒消息的,是由数据库来定夺的。

我们先容易的看一个厉行计划的比拟:SQL> set autotrace traceonly

厉行计划一:

 

  1. SQL> select count(*) from t;  
  2. COUNT(*)  
  3. ----------  
  4. 24815  
  5. Execution Plan  
  6. 0   SELECT STATEMENT Optimizer=CHOOSE 
  7. 1  0  SORT (AGGREGATE)  
  8. 2  1   TABLE Access (FULL) OF 'T' 

 

厉行计划二:

 

  1. SQL> select count(*) from t;  
  2. COUNT(*)  
  3. 24815  
  4. Execution Plan  
  5. 0   SELECT STATEMENT Optimizer=CHOOSE (Cost=26 Card=1)  
  6. 1  0  SORT (AGGREGATE)  
  7. 2  1   INDEX (FULL SCAN) OF 'T_INDEX' (NON-UNIQUE)(Cost=26 Card=28180

 

这两个厉行计划中,***个表示求和是穿越举行全表扫描来做的,把全副表中数据读入内存来逐条累加;第二个表示依据表中索引,把全副索引读进内存来逐条累加,而无须去读表中的数据。然而这两种措施究竟哪种快呢?等闲来说可能二比一快,但也不是绝对的。这是一个很容易的例子演示厉行计划的差异。对于混杂的SQL(表连接、嵌套子查询等),厉行计划可能几十种甚至上百种,然而究竟那种良好呢?我们事前并不懂得,数据库本身也不懂得,然而数据库会依据定然的法定可能普查消息(statistics)去抉择一个厉行计划,等闲来说抉择的是比拟优的,但也有抉择失手的时候,这即便这次谈论的价值所在。

Oracle优化器形式

Oracle优化器有两大类,基于法定的和基于代价的,在SQLPLUS中我们能够察看init文件中定义的缺省的优化器形式。

 

  1. SQL> show parameters optimizer_mode  
  2. NAME                 TYPE  VALUE  
  3. optimizer_mode           string  CHOOSE  
  4. SQL> 

 

这是Oracle8.1.7 企业版,我们能够看出,默认安装后数据库优化器形式为CHOOSE,我们还能够设置为 RULE、FIRST_ROWS,ALL_ROWS。能够在init文件中对全副instance的所有会话设置,也能够独自对某个会话设置:

 

  1. SQL> ALTER SESSION SET optimizer_mode = RULE;  
  2. 会话已改动。  
  3. SQL> ALTER SESSION SET optimizer_mode = FIRST_ROWS;  
  4. 会话已改动。  
  5. SQL> ALTER SESSION SET optimizer_mode = ALL_ROWS;  
  6. 会话已改动。 

 

基于法定的查询,数据库依据表和索引等定义消息,按照定然的法定来发生厉行计划;基于代价的查询,数据库依据搜集的表和索引的数据的普查消息(穿越analyze 号召可能利用dbms_stats包来搜集)归纳来定夺拨取一个数据库感受***的厉行计划(切实上无须定***)。RULE是基于法定的,CHOOSE表示万一查询的表存在搜集的普查消息则基于代价来厉行(在CHOOSE形式下Oracle批准的是 FIRST_ROWS),否则基于法定来厉行。在基于代价的两种措施中,FIRST_ROWS指厉行计划批准起码资源尽快的归来局部收获给客户端,对于排序分页页揭示这种查询尤其实用,ALL_ROWS指以大局花费资源起码的措施归来收获给客户端。

基于法定的形式下,数据库的厉行计划等闲比拟安宁。但在基于代价的形式下,我们才有更大的时机抉择***的厉行计划。也由于Oracle的许多查询方面的个性定然在基于代价的形式下能力揭示出来,因而我们等闲不抉择RULE(并且Oracle号称从 Oracle 10i版本数据库开始将不再扶持 RULE)。既然是基于代价的形式,也即便说厉行计划的抉择是依据表、索引等定义和数据的普查消息来定夺的,这个普查消息是依据 analyze 号召可能dbms_stats包来定期搜集的。率先存在着一种可能,即便由于搜集消息是一个很花费资源和工夫的动作,尤其当表数据量很大的时候,因为搜集消息是对全副表数据举行重新的全面普查,因而这是我们定然端庄琢磨的问题。我们只能在服务器安逸的时候定期的举行消息搜集。这解释我们在一段日期内,普查消息可能和数据库本身的数据并不合乎;另外即便Oracle的普查数据本身也存在着不准确局部(翔实参看Oracle DOCUMENT),更重要的一个问题即便及时普查数据相对曾经比拟准确,然而Oracle的优化器的抉择也并不是始终是***的计划。这也攀附于Oracle对不同厉行计划的代价的计算法定(我们等闲是无法懂得翔实的计算法定的)。这好像我们定夺从香港还是从北京去英国,车票、机票等切实价格究竟是怎么核算出来的我们并不懂得,可能说我们目前打听的价格消息,在我们乘车前往的时候,恳挚价格跟我们的核算曾经发生了改变。所有的因素,都将波及我们的全副开支。

厉行计划安宁功能带给我们什么

Oracle存在着厉行计划抉择失手的可能。这也是我们经常碰见的一些假象,例如总有人说我的过程在测验数据库中跑的很好,但在产品数据库上即便跑的很差,甚至后者硬件条件比前者还好,这究竟是为什么?硬件资源、普查消息、参数设置都可能对厉行计划发生波及。由于因素太多,我们总是对未来怀着一种莫名的生怕,我的产品数据库上线后究竟跑的好不好?于是Oracle供给了一种安宁厉行计划的力气,也即便把在测验环境中的运行良好的厉行计划所发生的OUTLINES移植到产品数据库,使得厉行计划不会随着其他因素的改变而改变。

那么OUTLINES是什么呢?先要推荐一个内容,Oracle供给了在SQL中利用HINTS来领导优化器发生我们想要的厉行计划的力气。这在多表连接、混杂查询中尤其管用。HINTS的种类许多,能够设置优化器目标(RULE、CHOOSE、FIRST_ROWS、ALL_ROWS),能够指定表连接的次序,能够指定利用哪个表的哪个索引等等,能够对SQL举行许多精细的扼制。穿越这种措施发生我们想要的厉行计划的这些HINTS,Oracle能够存储这些HINTS,我们称之为OUTLINES。穿越STORE OUTLINES能够使得我们具有尔后发生雷同厉行计划的力气,也即便使我们具有了安宁厉行计划的力气。

这里想给出一个附带的解释即便,切实上,我们穿越工具修改SQL,例如利用SQL EXPERT修改后的SQL,这些不但仅是加了HINTS而且文本都曾经发生了改变的SQL,也能够存储OUTLINES,并可被利用到利用中。但这不是定然见效,我们定然测验察看是否见效。但由于就算给了讹谬的OUTLINES,数据库在厉行的时候,揖?智疏忽过去重新生成厉行计划而不会归来讹谬,因而我们才敢塌心的这么利用。当然在Oracle文档中并未曾指明能够这么做,文档中只是解释,万一存在OUTLINES的同时又在SQL中加了HINTS,则会利用OUTLINES而疏忽HINTS。这秉功能在LECCO将公布的产品中会利用这一功能,这么能够将SQL EXPERT的修改SQL的力气和安宁厉行计划的力气联合起来,那么我们就对不能改动源代码的利用具有了相当壮大的SQL优化力气。

可能我们会有疑问,假定安宁了厉行计划,那还搜集普查消息干吗?这是因为几个起因构成的,率先,目前的厉行计划对于未来发生了改变的数据未必即便轻便的,存在着目前的厉行计划不中意未来数据的改变后的效率,而新的普查消息的情形下所发生的厉行计划也并不是全副都科学的。那这个时候,我们能够批准新搜集的普查消息,然而却对新普查消息下不良的厉行计划批准Oracle供给的厉行计划安宁性这个力气安宁厉行计划,这么联合起来我们能够发生顺心的高效的数据库运行环境。

我们还必需关怀的一个东西,Oracle供给的dbms_stats包除非具有搜集普查消息的力气,还具有把数据库中普查消息(statistics)export/import的力气,还具有只搜集普查消息而使得普查消息不利用于数据库的力气(把普查消息搜集到一个特定的表中而不是即刻见效),在这个基础上我们就能够把普查消息export出来再import到一个测验环境中,再运行我们的利用,在测验环境中我们考察***的普查消息会导致哪些厉行计划发生改变(DB EXPERT的Plan Version Tracer是模仿不同环境并积极察看不同环境中厉行计划改变的工具),是变好了还是变差了。我们能够把变差的这一局部在测验环境中利用hints可能利用工具(SQL EXPERT是在重写SQL这一领土现在***有力的工具)发生良好的厉行计划的SQL,利用这些SQL能够发生OUTLINES,然后在产品数据库利用***的普查消息的同时移植进这些OUTLINES。

关于Oracle数据库厉行计划的相关知识就介绍到这里了,希望本次的介绍能够对您有所收获!

【编辑推荐】

  1. Oracle 10g正则表达式REGEXP_LIKE简介
  2. Oracle 10g监听listener不能启动的解决方案总结
  3. Oracle 10g Shrink Table和Shrink Space使用详解
  4. Oracle 10g利用utlsampl.sql创建scott用户及样本数据
  5. Oracle 10g透明网关访问SQL Server 2000之配置监听
责任编辑:赵鹏 来源: 新浪博客
相关推荐

2011-05-19 13:25:14

Oracle数据库

2010-04-14 15:14:11

Oracle数据库

2010-04-02 13:59:08

Oracle数据库

2011-03-29 10:47:49

ORACLE数据库

2011-04-11 13:19:41

Oracle数据库

2011-05-17 15:02:15

ORACLE数据库备份

2011-08-12 13:33:31

Oracle数据库自治事务

2011-08-15 23:14:34

Oraclerman环境配置

2010-10-20 09:41:37

卸载Oracle

2010-04-09 16:51:24

Oracle数据库

2009-09-02 18:52:38

Oracle数据库并行

2009-02-09 12:52:32

文件加密Oracle数据库

2011-08-16 13:17:29

2011-08-11 16:55:34

Oracle数据库AWR

2011-08-18 17:05:16

Oracle数据库的服

2010-02-01 10:10:41

Oracle数据库优化

2010-04-07 14:22:46

2019-08-29 07:13:50

oracle数据库主键

2011-07-20 16:28:54

Oracle数据库shared pool

2010-04-02 17:11:45

Oracle数据库
点赞
收藏

51CTO技术栈公众号