设为首页 收藏本站
查看: 869|回复: 0

[经验分享] Oracle 解释执行计划

[复制链接]

尚未签到

发表于 2016-7-20 09:16:57 | 显示全部楼层 |阅读模式
      一. 执行计划树形结构
      执行计划展示的时候类似于一个表格形式,其实它是一个树形结构。该树形结构不仅阐述了SQL引擎执行操作的顺序,也阐明了它们之间的关系。树上的每一个节点都代表一个操作,比如表访问,连接,排序等。各操作之间存在父子关系,具体规则如下:
        1. 父有一个或多个子
        2. 子只有一个父
        3. 唯一没有父的是根节点
        4. 执行计划显示的时候,子缩进到父的右侧
        5. 父在他孩子前面(父ID小于孩子的ID)
        如下图所示:
     DSC0000.png

       对应树形结构
DSC0001.png
 

 
        下面我们将分类解释各种执行计划
        
       二. 单独型操作
        我们将最多有一个孩子的操作叫做单独型操作,这种执行计划执行的时候符合以下规则:
        1. 孩子在父亲前面执行
        2. 每一个孩子只执行一次
        3. 每一个孩子向它父亲提供输出
        下图是一个例子: 

        DSC0002.png
        对应树形结构
   DSC0003.png

        根据规则1,孩子节点先执行,那么最先执行的是步骤3.
        1. 操作3通过访问型谓词job = 'clerk'扫描emp_job_i索引,在此过程它从索引中抽取了4个rowid(A-Rows指示为4),并传给操作2
        2. 操作2通过操作3传来的3个rowid访问emp表,对于每一个rowid有一行记录被选出,然后通过过滤型谓词sal<1200过滤。这个过滤导致一条记录被排除,最后将剩下的三条记录传给操作1.
        3. 操作1将操作2传过来的3条记录进行分组,变成两条记录,然后将数据返回给调用者。
 
        三. 非相关联合型操作
        我们把多个相互独立孩子的操作定义为非相关联合型操作,有如下操作属于这类型:and_equal,bitmap and,bitmap or,bitmap minus,concatenation,connect by without filtering,hash join,intersection,merge join,minus,mutil_table,insert,sql model,temp table transformation与union all。如果是这类型的操作,符合下述规则:
        1. 孩子在父亲前面执行。
        2. 孩子按顺序执行,从id最小到id最大。在开始下一个孩子操作之前,当前孩子操作必须全部执行完。
        3. 每一个孩子最多被执行一次,并且与其他孩子独立。
        4. 每一个孩子向他的父亲提供输出。
        下图是一个示例:         
       DSC0004.jpg

         对应树形结构
   DSC0005.jpg
 

        我们可以看出操作2,3,4是相互独立的,先执行操作2,返回14行给操作1。接着执行操作3,返回4行给操作1。最后执行操作4,返回1行给操作1.
 
        四. 相关联合操作
        我们把一个节点有多个孩子,其中一孩子控制其他孩子操作执行的操作定义为相关联合操作。这样的操作有如下几种:nested loops,update,filter,connect by with filtering和bitmap key iteration。
        相关联合操作符合下述规则:
        1. 孩子在父亲前面执行
        2. 最小id的孩子控制其他孩子的执行。
        3. 孩子从最小id执行,到最大id,但并不严格按照从小到大的顺序,比如操作1 开始了,还没结束,操作2也可能开始了。
        4. 只有第一个孩子是最多执行一次,所有的其他孩子或者执行多次,或者根本不执行。
        5. 不是每一个孩子都向父亲提供数据,有些孩子只是用来应用约束而已。
 
        下面就各种操作分别举一个例子:
        1. 嵌套循环(nested loops)操作
         嵌套循环操作用来连接两个记录集,它总是2个孩子。ID较小的孩子叫外循环或驱动行源,ID较大的孩子叫做内循环。这个操作的特征是外循环每返回一条记录内循环就得执行一次。如下图例子所示:
    DSC0006.jpg
     DSC0007.jpg  

       对应树图
     DSC0008.jpg

        a. 从树形结构图可以看出,操作1(嵌套循环操作)有2个孩子。其中,操作2的序号较小,所以先执行(开始外循环)
        b. 操作2扫描表emp,根据emp.comm is null 过滤,返回10条数据给父操作(操作1)
        c. 对于操作2返回的10条记录,对每一条记录执行一遍操作3,(内循环)
        d. 内循环由操作3和操作4组成,对于操作2返回的每一条记录先执行操作4,通过访问型谓词emp.deptno = dept.deptno扫描所有dept_pk,返回一个rowid给操作3
        e. 操作3通过操作4返回的一个rowid,访问dept表,一条记录被读取,然后根据过滤型谓词dept.dname <>'sales'过滤。判断这一条记录是否符合要求。
        f. 最终对操作2返回的10条记录,每一条执行一次内循环,过滤了2条,剩余8条返回给了操作1.
 
        2.  过滤(filter)操作
        过滤操作跟嵌套操作的不同点是,支持不定数目的孩子。可以是1个,2个,3个或者多个。如果非1个,它的功能就类似嵌套操作。第1个孩子驱动其他孩子的执行。
        举例说明如下:
     DSC0009.png

        对应树形结构如下图所示:
   DSC00010.png

 
        可以看出filter操作(操作1)有3个孩子
  
        a. 三孩子中操作2先执行(ID号最小)操作2扫描emp表,返回14条记录给操作1.
        b. 对于操作2返回的每一条记录都需要执行操作3和操作5,由于缓存的原因我们可以看到,操作3只执行了3次,操作5执行了8次,都小于14次。
        c. 对于操作5这个过滤限制条件,影响不到到操作2返回的14条记录,因为它的rows列为0.
        d. 对于操作3这个限制条件,有一条记录匹配到了操作2中的6条记录。因为操作3的rows列为1,总共有一条记录不符合条件,但是,操作1最终只接收到了8条数据,所以操作3匹配上的那一条数据过滤掉了操作2的6条数据。
        e. 所以通过操作3,和操作5的把关,过滤掉了操作2的6条数据,最终返回给了操作1 8条数据。
 
        3. 更新(update)操作
        例子如下:
       DSC00011.png

      对应树形图 
   DSC00012.png

          我们可以看到更新操作有3个孩子,孩子2驱动孩子3和孩子5执行
        a. 操作2执行全表扫描,得到14条记录返回给操作1,
        b. 操作2每返回一条记录都要驱动操作3和操作5执行一次
        c. 操作3要执行的话,先执行操作4.最后操作3总共只返回3个值给操作1,说明操作2中返回的14条记录中的deptno只有3个唯一的值,其他都是重复值。
        d. 操作5执行的时候,先执行操作6,但是操作5和6只执行一次,因为跟操作2返回的记录没有关系,尽管操作2要求操作5执行14次,但是每一次执行的结果都一样,所以只执行了一次。
        e. 操作1接收到操作3,操作5的返回值,更新操作2返回的14条记录。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-246649-1-1.html 上篇帖子: Oracle知识--跟踪SQL语句 下篇帖子: Oracle死锁解锁
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表