当前位置: 首页 > news >正文

基于Oracle的SQL优化--学习(一)

Oracle里的优化器

    Oracle里的优化器分为RBO和CBO两种类型,RBO是基于规则的优化器,CBO是基于成本的优化器。

    Oracle数据库的SQL语句执行过程:


    基于规则的优化器

   Oracle会在代码里事先给各个类型的执行路径定一个等级,从等级1到等级15,等级越低执行效率越快。等级1对应的执行路径是“single row by rowid(通过rowid来访问单行数据)”,等级15对应的执行路径是“full table scan(全表扫描)”。

   当目标SQL有两条或者两条以上的执行路径等值相同时,我们可以通过调整相关对象在数据字典缓存中的缓存顺序来影响RBO对其执行计划的选择;当目标的SQL中出现多表连接的情况RBO会按照从右到左的顺序来决定谁是驱动表谁是被驱动表,进而选择执行计划。所以还可以通过改变目标SQL中涉及的各个对象在SQL文本中的先后顺序,来改变表连接的驱动表和被驱动表,进而调整SQL的执行计划。

   当目标SQL有两条或者两条以上的执行路径等值不相同时,那么无论怎么调整相关对象在SQL文本中的顺序都不会对执行计划起作用。

基于成本的优化器

   Oracle里的成本是对执行目标SQL所耗费的I/O、CPU和网络资源的一个估算值。

        集的势:
            Cardinality,指指定集合所包含的记录数。即指定结果集的行数。表示对目标SQL的某个具体执行步骤的执行结果所包含的记录数的估算。当然,如果是针对整个目标SQL,那么此时的Cardinality就表示对该SQL最终执行结果所包含的记录数的估算。某个执行步骤的对应Cardinality值越大,那么所对应的成本值往往也就越大,这个执行步骤所在执行路径的总成本值也就会越大。
        可选择率:
            Selectivity,指施加指定谓词条件后返回结果集的记录数占未施加任何谓词条件的原始结果集的记录数的比率。
可选择率的值越大,就意味着返回结果集的Cardinality的值就越大,所以估算出来的成本值也就会越大。

   CBO优化器的可传递性: CBO会对原目标SQL做简单的等价改写,这样可以提供更多的执行路径给CBO做选择。

            1、简单谓词传递 ,t1.c1=t2.c1 and t1.c1=10,Oracle会自动将t2.c1=10的条件添加。
            2、连接谓词传递,t1.c1=t2.c1 and t2.c1=t3.c1, Oracle会自动将t1.c1=t3.c1的条件添加。
            3、外连接谓词传递,t1.c1=t2.c1(+) and t1.c1=10, Oracle会自动将t2.c1(+)=10的条件添加。
        CBO的局限性:
            
            1、CBO会默认目标SQL语句where条件中出现的各个列之间是独立的,没有关联关系。
            2、CBO会假设所有的目标SQL都是单独执行的,并且互不干扰。不考虑SQL执行已经缓存到Buffer Cache,下次执行不需要访问物理IO到磁盘读索引叶子块、数据块等,高估用索引的成本。
            3、CBO对直方图统计信息有诸多限制。
            4、CBO在解析多表关联的目标SQL时,可能会漏选正确的执行计划。





     

相关文章:

  • 基于Oracle的SQL优化--学习(二)
  • MySQL案例-show fileds from 提示无权限
  • B+树的数据结构理解
  • 基于Oracle的SQL优化--学习(三)
  • 打 spice 的 deb 格式安装包的时遇到的问题和解决方法
  • 基于Oracle的SQL优化--学习(四)
  • 基于Oracle的SQL优化--学习(五)
  • 基于Oracle的SQL优化--学习(六)
  • (转载)hibernate缓存
  • 基于Oracle的SQL优化--学习(七)
  • 基于Oracle的SQL优化--学习(八)
  • MySQL数字类型中的三种常用种类【转】
  • linux mmap 内存映射【转】
  • 基于Oracle的SQL优化--学习(九)
  • 基于Oracle的SQL优化--学习(十)
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【剑指offer】让抽象问题具体化
  • Angular2开发踩坑系列-生产环境编译
  • Elasticsearch 参考指南(升级前重新索引)
  • JWT究竟是什么呢?
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • webpack入门学习手记(二)
  • 从零开始学习部署
  • 浮现式设计
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 简单数学运算程序(不定期更新)
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 来,膜拜下android roadmap,强大的执行力
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 实习面试笔记
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 树莓派 - 使用须知
  • 我这样减少了26.5M Java内存!
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 你对linux中grep命令知道多少?
  • (1)(1.13) SiK无线电高级配置(五)
  • (33)STM32——485实验笔记
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (ZT)薛涌:谈贫说富
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NetCore 如何动态路由
  • .net反混淆脱壳工具de4dot的使用
  • .NET开发不可不知、不可不用的辅助类(一)