ORACLE中的执行专题计划.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Oracle 实施计划 1,什么是实施计划 所谓实施计划,顾名思义,就是对一个查询任务,做出一份怎样去完成任务具体方案。举个生活中例子,我从珠海要去英国,我能够 选择先去香港然后转机,也能够先去北京转机,或去广州也能够。不过到底怎样去英国划算,也就是我费用最少,这是一件值得考究 事情。一样对于查询而言,我们提交SQL仅仅是描述出了我们目标地是英国,但至于怎么去,通常我们SQL中是没有给出提醒信息 ,是由数据库来决定。   我们先简单看一个实施计划对比:   SQL set autotrace traceonly   实施计划一:   SQL select count(*) from t;   COUNT(*)   ----------   24815   Execution Plan   0   SELECT STATEMENT Optimizer=CHOOSE   1  0  SORT (AGGREGATE)   2  1   TABLE Access (FULL) OF T   实施计划二:   SQL select count(*) from t;   COUNT(*)   24815   Execution Plan   0   SELECT STATEMENT Optimizer=CHOOSE (Cost=26 Card=1)   1  0  SORT (AGGREGATE)   2  1   INDEX (FULL SCAN) OF T_INDEX (NON-UNIQUE) (Cost=26 Card=28180)   这两个实施计划中,第一个表示求和是经过进行全表扫描来做,把整个表中数据读入内存来逐条累加;第二个表示依据表中索引,把 整个索引读进内存来逐条累加,而不用去读表中数据。不过这两种方法到底哪种快呢?通常来说可能二比一快,但也不是绝正确。这是一 个很简单例子演示实施计划差异。对于复杂SQL(表连接、嵌套子查询等),实施计划可能几十种甚至上百种,不过到底那种最好呢? 我们事前并不知道,数据库本身也不知道,不过数据库会依据一定规则或统计信息(statistics)去选择一个实施计划,通常来说选择是 比较优,但也有选择失误时候,这就是这次讨论价值所在。 ? Oracle优化器模式   Oracle优化器有两大类,基于规则和基于代价,在SQLPLUS中我们能够查看init文件中定义缺省优化器模式。   SQL show parameters optimizer_mode   NAME                 TYPE  VALUE   optimizer_mode           string  CHOOSE   SQL   这是Oracle8.1.7 企业版,我们能够看出,默认安装后数据库优化器模式为CHOOSE,我们还能够设置为 RULE、 FIRST_ROWS,ALL_ROWS。能够在init文件中对整个instance全部会话设置,也能够单独对某个会话设置:   SQL ALTER SESSION SET optimizer_mode = RULE;   会话已更改。   SQL ALTER SESSION SET optimizer_mode = FIRST_ROWS;   会话已更改。   SQL ALTER SESSION SET optimizer_mode = ALL_ROWS;   会话已更改。   基于规则查询,数据库依据表和索引等定义信息,根据一定规则来产生实施计划;基于代价查询,数据库依据搜集表和索引 数据统计信息(经过analyze 命令或使用dbms_stats包来搜集)综合来决定选择一个数据库认为最优实施计划(实际上不一定最优)。 RULE是基于规则,CHOOSE表示假如查询表存在搜集统计信息则基于代价来实施(在CHOOSE模式下Oracle采取是 FIRST_ROWS) ,不然基于规则来实施。在基于代价两种方法中,FIRST_ROWS指实施计划采取最少资源立即返回部分结果给用户端,对于排序分页 页显示这种查询尤其适用,ALL_ROWS指以总体消耗资源最少方法返回结果给用户端。   基于规则模式下,数据库实施计划通常比较稳定。但在基于代价模式下,我们才有更大机会选择最优实施计划。也因为 Oracle很多查询方面特征必需在基于代价模式下才能表现出来,所以我们通常不选择RULE(而且Oracle宣称从 Oracle 10i版本数据库 开始将不再支持 RULE)。既然是基于代价模式,也就是说实施计划选择是依据表、索引等定义和数据统计信息来决定,这个统计 信息是依据 analyze 命令或dbms_stats包来定时搜集。首先存在着一个

文档评论(0)

173****6081 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档