天道酬勤,学无止境

CBO与RULE 的区别

ORACLE的优化器有两种优化方式:

基于规则的优化方式(Rule-Based Optimization,简称为RBO)

RBO遵循简单的分级方法学,使用 15 种级别要点,当接收到查询,优化器将评估使用到的要点数目,然后选择最佳级别(最少的数量)的执行路径来运行查询。

 

基于代价的优化方式(Cost-Based Optimization,简称为CBO)

CBO尝试找到最低成本的访问数据的方法,为了最大的吞吐量或最快的初始响应时间,计算使用不同的执行计划的成本,并选择成本最低的一个,关于表的数据内容的统计被用于确定执行计划。 


    IF 初始化参数  OPTIMIZER_MODE  =  CHOOSE  THEN    --(8I  DEFAULT) 
       IF 做过表分析 
          THEN 优化器  Optimizer=CBO(COST);            /*高效*/ 
       ELSE 
         优化器  Optimizer=RBO(RULE);                 /*高效*/ 
       END  IF; 
    END  IF;


区别;

RBO根据规则选择最佳执行路径来运行查询。 


CBO根据表统计找到最低成本的访问数据的方法确定执行计划。

 

使用CBO需要注意: 

  I) 需要经常对表进行ANALYZE 命令进行分析统计; 

  II) 需要稳定执行计划; 

  III)需要使用提示(Hint); 


使用RULE 需要注意: 

I) 选择最有效率的表名顺序 

II)优化SQL 的写法; 


在optimizer_mode=choose时,如果表有统计信息(分区表外),优化器将选择CBO,否则选RBO。 


标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • RBO和CBO的基本概念
    Oracle数据库中的优化器又叫查询优化器(Query Optimizer)。它是SQL分析和执行的优化工具,它负责生成、制定SQL的执行计划。Oracle的优化器有两种,基于规则的优化器(RBO)与基于代价的优化器(CBO) RBO: Rule-Based Optimization 基于规则的优化器 CBO: Cost-Based Optimization 基于代价的优化器RBO自ORACLE 6以来被采用,一直沿用至ORACLE 9i. ORACLE 10g开始,ORACLE已经彻底丢弃了RBO,它有着一套严格的使用规则,只要你按照它去写SQL语句,无论数据表中的内容怎样,也不会影响到你的“执行计划”,也就是说RBO对数据不“敏感”;它根据ORACLE指定的优先顺序规则,对指定的表进行执行计划的选择。比如在规则中,索引的优先级大于全表扫描;RBO是根据可用的访问路径以及访问路径等级来选择执行计划,在RBO中,SQL的写法往往会影响执行计划,它要求开发人员非常了解RBO的各项细则,菜鸟写出来的SQL脚本性能可能非常差。随着RBO的被遗弃,渐渐不为人所知。也许只有老一辈的DBA对其了解得比较深入。关于RBO的访问路径,官方文档做了详细介绍:RBO Path 1: Single Row by RowidRBO Path 2: Single Row by Cluster JoinRBO
  • Oracle中的优化器--CBO和RBO
    Oracle中的优化器--CBO和RBOOracle数据库中的优化器又叫查询优化器(Query Optimizer)。它是SQL分析和执行的优化工具,它负责生成、制定SQL的执行计划。Oracle的优化器有两种,基于规则的优化器(RBO)与基于代价的优化器(CBO) RBO: Rule-Based Optimization 基于规则的优化器 CBO: Cost-Based Optimization 基于代价的优化器RBO自ORACLE 6以来被采用,一直沿用至ORACLE 9i. ORACLE 10g开始,ORACLE已经彻底丢弃了RBO,它有着一套严格的使用规则,只要你按照它去写SQL语句,无论数据表中的内容怎样,也不会影响到你的“执行计划”,也就是说RBO对数据不“敏感”;它根据ORACLE指定的优先顺序规则,对指定的表进行执行计划的选择。比如在规则中,索引的优先级大于全表扫描;RBO是根据可用的访问路径以及访问路径等级来选择执行计划,在RBO中,SQL的写法往往会影响执行计划,它要求开发人员非常了解RBO的各项细则,菜鸟写出来的SQL脚本性能可能非常差。随着RBO的被遗弃,渐渐不为人所知。也许只有老一辈的DBA对其了解得比较深入。关于RBO的访问路径,官方文档做了详细介绍:RBO Path 1: Single Row by RowidRBO Path 2: Single
  • Oracle中的优化器--CBO和RBO
    Oracle中的优化器--CBO和RBOOracle数据库中的优化器又叫查询优化器(Query Optimizer)。它是SQL分析和执行的优化工具,它负责生成、制定SQL的执行计划。Oracle的优化器有两种,基于规则的优化器(RBO)与基于代价的优化器(CBO) RBO: Rule-Based Optimization 基于规则的优化器 CBO: Cost-Based Optimization 基于代价的优化器RBO自ORACLE 6以来被采用,一直沿用至ORACLE 9i. ORACLE 10g开始,ORACLE已经彻底丢弃了RBO,它有着一套严格的使用规则,只要你按照它去写SQL语句,无论数据表中的内容怎样,也不会影响到你的“执行计划”,也就是说RBO对数据不“敏感”;它根据ORACLE指定的优先顺序规则,对指定的表进行执行计划的选择。比如在规则中,索引的优先级大于全表扫描;RBO是根据可用的访问路径以及访问路径等级来选择执行计划,在RBO中,SQL的写法往往会影响执行计划,它要求开发人员非常了解RBO的各项细则,菜鸟写出来的SQL脚本性能可能非常差。随着RBO的被遗弃,渐渐不为人所知。也许只有老一辈的DBA对其了解得比较深入。关于RBO的访问路径,官方文档做了详细介绍:RBO Path 1: Single Row by RowidRBO Path 2: Single
  • 踩坑CBO,解决那些坑爹的SQL优化问题
    踩坑CBO,解决那些坑爹的SQL优化问题本文根据DBAplus社群第93期线上分享整理而成讲师介绍 丁俊新炬网络首席性能优化专家SQL审核产品经理DBAplus社群联合发起人,《剑破冰山-Oracle开发艺术》副主编。Oracle ACEA,ITPUB开发版资深版主,十年电信行业从业经验。本次分享大纲:CBO优化器存在哪些坑CBO优化器坑的解决之道加强SQL审核,将性能问题扼杀于襁褓之中分享现场FAQCBO( Cost Based Optimizer)优化器是目前Oracle广泛使用的优化器,其使用统计信息、查询转换等计算各种可能的访问路径成本,并生成多种备选执行计划,最终Oracle会选择成本最低的作为最优执行计划。与“远古”时代的RBO(Rule Based Optimizer)相比,显然更加符合数据库实际情况,能够适应更多的应用场景。但是,由于其自身非常复杂,CBO并未解决的实际问题以及存在的BUG非常多,在日常优化过程中,你可能会遇到一些,不管怎么收集统计信息,都无法走正确执行计划的情形,这时候,你可能踩坑CBO了。本次分享,主要以日常常见优化器问题作为引子,一起探讨CBO的那些坑的解决之道。一、CBO优化器存在哪些坑先来看一下,CBO优化器的组件:从上图可以看出,一条SQL进入ORACLE中,实际上经过解析会将各部分进行分离,每个分离的部分独立成为一个查询块(query
  • 踩坑CBO,解决那些坑爹的SQL优化问题
    踩坑CBO,解决那些坑爹的SQL优化问题本文根据DBAplus社群第93期线上分享整理而成讲师介绍 丁俊新炬网络首席性能优化专家SQL审核产品经理DBAplus社群联合发起人,《剑破冰山-Oracle开发艺术》副主编。Oracle ACEA,ITPUB开发版资深版主,十年电信行业从业经验。本次分享大纲:CBO优化器存在哪些坑CBO优化器坑的解决之道加强SQL审核,将性能问题扼杀于襁褓之中分享现场FAQCBO( Cost Based Optimizer)优化器是目前Oracle广泛使用的优化器,其使用统计信息、查询转换等计算各种可能的访问路径成本,并生成多种备选执行计划,最终Oracle会选择成本最低的作为最优执行计划。与“远古”时代的RBO(Rule Based Optimizer)相比,显然更加符合数据库实际情况,能够适应更多的应用场景。但是,由于其自身非常复杂,CBO并未解决的实际问题以及存在的BUG非常多,在日常优化过程中,你可能会遇到一些,不管怎么收集统计信息,都无法走正确执行计划的情形,这时候,你可能踩坑CBO了。本次分享,主要以日常常见优化器问题作为引子,一起探讨CBO的那些坑的解决之道。一、CBO优化器存在哪些坑先来看一下,CBO优化器的组件:从上图可以看出,一条SQL进入ORACLE中,实际上经过解析会将各部分进行分离,每个分离的部分独立成为一个查询块(query
  • 【DB笔试面试574】在Oracle中,什么是RBO和CBO?
    ♣ 题目 部分 在Oracle中,什么是RBO和CBO? ♣ 答案部分 Oracle数据库中优化器(Optimizer)是SQL分析和执行的优化工具,是Oracle数据库中内置的一个核心模块。优化器的目的就是为了得到目标SQL的执行计划。Oracle数据库里的优化器又分为RBO(rule-Based Optimizer,基于规则的优化器)和CBO(Cost-Based Optimizer,基于成本的优化器)这两种类型。从Oracle 10g开始,Oracle数据库默认都是基于CBO的优化方式。(一)RBORBO的执行机制非常简单,就是在优化器里面嵌入若干种规则,如果执行的SQL语句符合某个规则(Rank,共有1~15共15个等级),那么Oracle会按照规则(Rank)制定出相应的执行计划。由于RBO只是简单的去匹配Rank,所以它的执行计划在很多时候并不是最佳的。例如,某个表的其中一列数据分布非常不均匀,其中90%的数据内容是一样的,并且在这个字段上有索引。如果在目标SQL语句的谓词里有这个字段,那么RBO就会选择走索引。而这是一种非常慢的执行路径,因为Oracle要先访问索引块,在索引上找到相应的键值,然后按照键值上的ROWID再去访问表中的相应数据。其实,在这种情况下,选择全表扫描是最优的,但是RBO不会这么选择。RBO的缺点主要有:①执行计划出了问题,很难对其做调整
  • Oracle optimizer_mode 参数设置
    Oracle 在执行SQL语句时,有两种优化方法:即基于规则的RBO和基于代价的CBO。 在SQL执教的时候,到底采用何种优化方法,就由Oracle参数 optimizer_mode 来决定。SQL> show parameter optimizer_modeNAME TYPE VALUE------------------------------------ ----------- ------------------------------optimizer_mode string CHOOSEoptimizer_mode 参数值共有以下四个:第一:CHOOSE 这个是Oracle的默认值。采用这个值时,Oracle即可以采用基于规则RBO,也可以采用基于代价的CBO,到底使用那个值,取决于当前SQL的被访问的表中是不是有可以使用的统计信息。 如果有多个被访问的表,其中有一个或多个有统计信息,那么Oralce会对没有统计信息的表进行采样统计(即不全部采样),统计完成后,使用基于代价的优化方法CBO。 如果所有被访问的表都没有统计信息,Oracle就会采用基于规则的优化方法RBO。第二:ALL_ROWS不管是不是有统计信息,全部采用基于成本的优化方法CBO。第三:FIRST_ROWS_n FIRST_ROWS_n后面的n值可以为1,100,1000 不管是不是有统计信息
  • 【DB笔试面试573】在Oracle中,常用Hint有哪些?
    ♣ 题目 部分 在Oracle中,常用Hint有哪些? ♣ 答案部分 Oracle的Hint是用来提示Oracle的优化器,用来选择用户期望的执行计划。在许多情况下,Oracle默认的执行方式并不总是最优的,只不过由于平时操作的数据量比较小,所以,好的执行计划与差的执行计划所消耗的时间差异不大,用户感觉不到而已。但对于书写操作大数据量的SQL而言,其SQL的书写则需要先了解一下执行计划是否最优或满足生产需要。通常当从开发环境迁移到生产环境下时,往往会出现此类情况。例如:假设有一张客户表,在客户类别上有索引。如果想查找某一类别用户,而该类别用户占总数的比例高达90%,那么此时采用全表扫描方式将会比索引扫描方式快。如果不使用Hint,那么Oracle很可能会选择使用索引方式来执行。使用Hint可以实现以下功能:(1)改变SQL中的表的关联顺序。(2)改变SQL中的表的关联方式。(3)实现并行方式执行DML、DDL以及SELECT语句。(4)改变表的访问路径(数据读取方式)。(5)调整查询转换类型,重写SQL。(6)调整优化器优化目标。(7)调整优化器类型。Oracle推出了一个隐含参数“_OPTIMIZER_IGNORE_HINTS”,取值为TRUE或FALSE,缺省值是FALSE。Oracle可以通过将该隐含参数设置为TRUE,使得Oracle优化器忽略语句中所有的Hint。显然
  • 看了此文,Oracle SQL优化文章不必再看!
    目录SQL优化的本质SQL优化Road Map2.1 制定SQL优化目标2.2 检查执行计划2.3 检查统计信息2.4 检查高效访问结构2.5 检查影响优化器的参数2.6 SQL语句编写问题2.7 SQL优??\x2F限制导致的执行计划差SQL优化案例SQL执行计划获取4.1 如何获取准确的执行计划4.2 看懂执行计划执行顺序一SQL优化的本质一般来说,SQL优化是让SQL运行得更快,使SQL更快的方式有很多,比如提高索引的使用效率,或者并行查询。可以看到里面的公式:执行效率或者一般说的执行时间,是和完成一次SQL所需要访问的资源总量(S)成正比以及单位时间内能够访问的资源量(V)成反比,S越大,效率越低,V越大效率越高。 比如通过并行查询,则可以提升单位时间内访问的资源量。当然,这仅仅是从执行时间上考虑,SQL优化肯定不仅仅是执行时间降低,应该是资源使用与执行时间降低之间寻求一种平衡,否则,盲目并行,可能提升不了效率,反而让系统资源消耗殆尽。http\x3A?说,SQL优化的本质就是:1、缩短响应时间;2、提升系统吞吐量;3、提升系统负载能力。要使用多种手段,在提升系统吞吐量和增加系统负载能力,提高单个SQL效率之间寻求一种平衡。就是要尽量减少一条SQL需要访问的资源总量,比如走索引更好,那么不要使用全表扫描。二SQL优化Road Map一条SQL的优化路线图如下所示
  • 看了此文,Oracle SQL优化文章不必再看!
    第一章 看了此文,Oracle SQL优化文章不必再看!目录SQL优化的本质SQL优化Road Map2.1 制定SQL优化目标2.2 检查执行计划2.3 检查统计信息2.4 检查高效访问结构2.5 检查影响优化器的参数2.6 SQL语句编写问题2.7 SQL优??\x2F限制导致的执行计划差SQL优化案例SQL执行计划获取4.1 如何获取准确的执行计划4.2 看懂执行计划执行顺序一SQL优化的本质一般来说,SQL优化是让SQL运行得更快,使SQL更快的方式有很多,比如提高索引的使用效率,或者并行查询。可以看到里面的公式:执行效率或者一般说的执行时间,是和完成一次SQL所需要访问的资源总量(S)成正比以及单位时间内能够访问的资源量(V)成反比,S越大,效率越低,V越大效率越高。 比如通过并行查询,则可以提升单位时间内访问的资源量。当然,这仅仅是从执行时间上考虑,SQL优化肯定不仅仅是执行时间降低,应该是资源使用与执行时间降低之间寻求一种平衡,否则,盲目并行,可能提升不了效率,反而让系统资源消耗殆尽。http\x3A?说,SQL优化的本质就是:1、缩短响应时间;2、提升系统吞吐量;3、提升系统负载能力。要使用多种手段,在提升系统吞吐量和增加系统负载能力,提高单个SQL效率之间寻求一种平衡。就是要尽量减少一条SQL需要访问的资源总量,比如走索引更好,那么不要使用全表扫描
  • Oracle里收集与查看统计信息的方法
    Oracle数据库里的统计信息是这样的一组数据:它存储在数据字典里,且从多个维度描述了Oracle数据库里对象的详细信息。CBO会利用这些统计信息来计算目标SQL各种可能的、不同的执行路径的成本,并从中选择一条成本值最小的执行路径来作为目标SQL的执行计划。Oracle数据库里的统计信息可以分为如下6种类型:表的统计信息索引的统计信息列的统计信息系统统计信息数据字典统计信息内部对象统计信息表的统计信息用于描述Oracle数据库里表的详细信息,它包含了一些典型的维度,如记录数、表块(表里的数据块)数量、平均行长度等。索引的统计信息于描述Oracle数据库里索引的详细信息,它包含了一些典型的维度,如索引的层级、叶子块的数量、聚簇因子等。列的统计信息于描述Oracle数据库里列的详细信息,它包含了一些典型的维度,如列的distinct值的数量、列的NULL值的数量、列的最小值、列的最大值以及直方图等。系统统计信息于描述Oracle数据库所在的数据库服务器的系统处理能力,它包含了CPU和I/O这两个维度,借助于系统统计信息,Oracle可以更清楚地知道目标数据库服务器的实际处理能力。数据字典统计信息用于热核Oracle数据库里数据字典基表(如TAB$、IND$等)、数据字典基表上的索引,以及这些数据字典的列的详细信息,描述上述数据字典基表的统计信息与描述普通表、索引
  • 【DBAplus】SQL优化:一篇文章说清楚Oracle Hint的正确使用姿势
    一、提示(Hint)概述1为什么引入Hint?Hint是Oracle数据库中很有特色的一个功能,是很多DBA优化中经常采用的一个手段。那为什么Oracle会考虑引入优化器呢?基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻DBA的负担。 但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比。此时就需要DBA进行人为的干预,告诉优化器使用指定的存取路径或连接类型生成执行计划,从而使语句高效地运行。Hint就是Oracle提供的一种机制,用来告诉优化器按照告诉它的方式生成执行计划。 2不要过分依赖Hint当遇到SQL执行计划不好的情况,应优先考虑统计信息等问题,而不是直接加Hint了事。如果统计信息无误,应该考虑物理结构是否合理,即没有合适的索引。只有在最后仍然不能SQL按优化的执行计划执行时,才考虑Hint。 毕竟使用Hint,需要应用系统修改代码,Hint只能解决一条SQL的问题,并且由于数据分布的变化或其他原因(如索引更名)等,会导致SQL再次出现性能问题。3Hint的弊端Hint是比较"暴力"的一种解决方式,不是很优雅。需要开发人员手工修改代码。Hint不会去适应新的变化。比如数据结构、数据规模发生了重大变化,但使用Hint的语句是感知变化并产生更优的执行计划。Hint随着数据库版本的变化,可能会有一些差异、甚至废弃的情况。此时
  • 【DBAplus】SQL优化:一篇文章说清楚Oracle Hint的正确使用姿势
    【DBAplus】SQL优化:一篇文章说清楚Oracle Hint的正确使用姿势 原创 2016-09-12 韩锋 作者介绍韩锋,宜信技术研发中心数据库架构师。精通多种关系型数据库,曾任职于当当网、TOM在线等公司,曾任多家公司首席DBA、数据库架构师等职,多年一线数据库架构、设计、开发经验。著有《SQL优化最佳实践》一书。一、提示(Hint)概述1为什么引入Hint?Hint是Oracle数据库中很有特色的一个功能,是很多DBA优化中经常采用的一个手段。那为什么Oracle会考虑引入优化器呢?基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻DBA的负担。 但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比。此时就需要DBA进行人为的干预,告诉优化器使用指定的存取路径或连接类型生成执行计划,从而使语句高效地运行。Hint就是Oracle提供的一种机制,用来告诉优化器按照告诉它的方式生成执行计划。 2不要过分依赖Hint当遇到SQL执行计划不好的情况,应优先考虑统计信息等问题,而不是直接加Hint了事。如果统计信息无误,应该考虑物理结构是否合理,即没有合适的索引。只有在最后仍然不能SQL按优化的执行计划执行时,才考虑Hint。 毕竟使用Hint,需要应用系统修改代码,Hint只能解决一条SQL的问题,并且由于数据分布的变化或其他原因
  • 【DBAplus】SQL优化:一篇文章说清楚Oracle Hint的正确使用姿势
    【DBAplus】SQL优化:一篇文章说清楚Oracle Hint的正确使用姿势 原创 2016-09-12 韩锋 作者介绍韩锋,宜信技术研发中心数据库架构师。精通多种关系型数据库,曾任职于当当网、TOM在线等公司,曾任多家公司首席DBA、数据库架构师等职,多年一线数据库架构、设计、开发经验。著有《SQL优化最佳实践》一书。一、提示(Hint)概述1为什么引入Hint?Hint是Oracle数据库中很有特色的一个功能,是很多DBA优化中经常采用的一个手段。那为什么Oracle会考虑引入优化器呢?基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻DBA的负担。 但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比。此时就需要DBA进行人为的干预,告诉优化器使用指定的存取路径或连接类型生成执行计划,从而使语句高效地运行。Hint就是Oracle提供的一种机制,用来告诉优化器按照告诉它的方式生成执行计划。 2不要过分依赖Hint当遇到SQL执行计划不好的情况,应优先考虑统计信息等问题,而不是直接加Hint了事。如果统计信息无误,应该考虑物理结构是否合理,即没有合适的索引。只有在最后仍然不能SQL按优化的执行计划执行时,才考虑Hint。 毕竟使用Hint,需要应用系统修改代码,Hint只能解决一条SQL的问题,并且由于数据分布的变化或其他原因
  • 写合并缓冲区在哪里? x86(Where is the Write-Combining Buffer located? x86)
    问题 物理上如何组合Write-Combine缓冲区? 我已经看到了说明多种变体的框图: 在L1和内存控制器之间在CPU的存储缓冲区和内存控制器之间在CPU的AGU和/或存储单元之间 它是否依赖于微体系结构? 回答1 写缓冲区在不同处理器中可以具有不同的用途或不同的用途。 此答案可能不适用于未特别提及的处理器。 我想强调一下,“写缓冲区”一词在不同的上下文中可能意味着不同的东西。 该答案仅与Intel和AMD处理器有关。 英特尔处理器上的写合并缓冲区 每个高速缓存可能伴随着零个或多个行填充缓冲区(也称为填充缓冲区)。 L2处的填充缓冲区的集合称为超级队列或超队列(超级队列中的每个条目都是一个填充缓冲区)。 如果高速缓存是在逻辑核心或物理核心之间共享的,则相关的填充缓冲区也将在核心之间共享。 每个填充缓冲区可容纳单个高速缓存行以及描述高速缓存行(如果已被占用)的其他信息,包括高速缓存行的地址,内存类型和一组有效位,其中位数取决于跟踪缓存行的各个字节。 在早期的处理器(例如Pentium II)中,填充缓冲区中只有一个能够进行写合并(和写折叠)。 随着新型处理器的出现,行缓冲区和能够进行写合并的缓冲区的总数稳步增长。 直到Broadwell的Nehalem在每个L1数据高速缓存中都包含10个填充缓冲区。 核心和核心2每个物理核心具有8个LFB。 据此,Skylake上有12个LFB。
  • jQuery自动完成与JSON响应(jquery autocomplete with json response)
    问题 我在json中获得响应,但这不会解析json响应。 我在做什么错? 我在doc http://docs.jquery.com/Plugins/Autocomplete上找不到任何内容 $("#users-allowed").autocomplete("/people/following.json", { width: 320, //max: 4, highlight: false, scroll: true, scrollHeight: 300, formatItem: function(response, i, max) { console.log(response); console.log(response['items']); console.log(response.items); return i + "/" + max + ": \"" + response.status_code + "\" [" + response.status_description + "]"; //return "<img src='images/" + value + "'/> " + value.split(".")[0]; }, formatResult: function(response) { //return value.split(".")[0]; return
  • 【DB笔试面试600】在Oracle中,如何获取SQL历史执行计划?
    ♣题目 部分在Oracle中,如何获取SQL历史执行计划? ♣答案部分历史执行计划只能从AWR中获取,如果AWR没有记录的话,那么就无法获取历史执行计划了,获取历史执行计划的命令如下所示:1SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_AWR('&sqlid'));SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_AWR('&sqlid'));对于历史计划,可以生成SQL报告,命令如下所示:1SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_SQL_REPORT_HTML(L_DBID => , L_INST_NUM => , L_BID => , L_EID => , L_SQLID => )) ;SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_SQL_REPORT_HTML(L_DBID => , L_INST_NUM => , L_BID => , L_EID => , L_SQLID => )) ;其中,L_DBID代表数据库的DBID,L_INST_NUM代表数据库的实例号,单机环境为1,RAC环境填写具体的实例号,L_BID为开始的快照号,L_EID为结束的快照号,L_SQLID为要查看SQL的SQL_ID
  • 【DB笔试面试600】在Oracle中,如何获取SQL历史执行计划?
    ♣题目 部分 在Oracle中,如何获取SQL历史执行计划? ♣答案部分历史执行计划只能从AWR中获取,如果AWR没有记录的话,那么就无法获取历史执行计划了,获取历史执行计划的命令如下所示:1SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_AWR('&sqlid'));SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_AWR('&sqlid'));对于历史计划,可以生成SQL报告,命令如下所示:1SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_SQL_REPORT_HTML(L_DBID => , L_INST_NUM => , L_BID => , L_EID => , L_SQLID => )) ;SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_SQL_REPORT_HTML(L_DBID => , L_INST_NUM => , L_BID => , L_EID => , L_SQLID => )) ;其中,L_DBID代表数据库的DBID,L_INST_NUM代表数据库的实例号,单机环境为1,RAC环境填写具体的实例号,L_BID为开始的快照号,L_EID为结束的快照号,L_SQLID为要查看SQL的SQL_ID
  • Oracle之函数索引
    Oracle之函数索引 在Oracle中,有一类特殊的索引,称为函数索引(Function-Based Indexes,FBI),它基于对表中列进行计算后的结果创建索引。函数索引在不修改应用程序的逻辑基础上提高了查询性能。如果没有函数索引,那么任何在列上执行了函数的查询都不能使用这个列的索引。当在查询中包含该函数时,数据库才会使用该函数索引。函数索引可以是一个B-Tree索引或位图索引。用于生成索引的函数可以是算术表达式,也可以是一个包含SQL函数、用户定义PL/SQL函数、包函数,或C调用的表达式。当数据库处理INSERT和UPDATE语句时,它仍然必须计算函数才能完成对语句的处理。对于函数索引的索引列的函数查询可以通过视图DBA_IND_EXPRESSIONS来实现,通过如下的SQL语句可以查询所有的函数索引:SELECT * FROM DBA_INDEXES D WHERE D.INDEX_TYPE LIKE 'FUNCTION-BASED%';函数索引必须遵守下面的规则:① 必须使用基于成本的优化器,而且创建后必须对索引进行分析。② 如果被函数索引所引用的用户自定义PL/SQL函数失效了或该函数索引的属主没有了在函数索引里面使用的函数的执行权限,那么对这张表上的执行的所有的操作(例如SELECT查询、DML等)也将失败(会报错:ORA-06575: Package or
  • Oracle之函数索引
    Oracle之函数索引 在Oracle中,有一类特殊的索引,称为函数索引(Function-Based Indexes,FBI),它基于对表中列进行计算后的结果创建索引。函数索引在不修改应用程序的逻辑基础上提高了查询性能。如果没有函数索引,那么任何在列上执行了函数的查询都不能使用这个列的索引。当在查询中包含该函数时,数据库才会使用该函数索引。函数索引可以是一个B-Tree索引或位图索引。用于生成索引的函数可以是算术表达式,也可以是一个包含SQL函数、用户定义PL/SQL函数、包函数,或C调用的表达式。当数据库处理INSERT和UPDATE语句时,它仍然必须计算函数才能完成对语句的处理。对于函数索引的索引列的函数查询可以通过视图DBA_IND_EXPRESSIONS来实现,通过如下的SQL语句可以查询所有的函数索引:SELECT * FROM DBA_INDEXES D WHERE D.INDEX_TYPE LIKE 'FUNCTION-BASED%';函数索引必须遵守下面的规则:① 必须使用基于成本的优化器,而且创建后必须对索引进行分析。② 如果被函数索引所引用的用户自定义PL/SQL函数失效了或该函数索引的属主没有了在函数索引里面使用的函数的执行权限,那么对这张表上的执行的所有的操作(例如SELECT查询、DML等)也将失败(会报错:ORA-06575: Package or