在看《基于Oracle的SQL优化一书》知道了很多专业名称,做了记录,CBO、优化器、查询转换、执行计划、Hint、并行、游标、绑定变量、统计信息、直方图、索引等等。这篇博客可以说是读书笔记

一、Oracle的优化器

1.1 优化器简介

优化器(Optimizer):优化器是Oracle数据库内置的一个核心子系统,负责解析SQL,Oracle优化器是Oracle系统的一个核心组件,其目的是按照一定的原则来获取目标SQL在当前情形下执行的最高效执行路径,也可以说是执行计划。

1.2 SQL执行过程

Oracle SQL的执行过程:

二、优化器优化方式

2.1 优化器的优化方式

Oracle优化器按照优化方式分为两种

  • 基于规则的优化器(Rule-Based Optimizer),简称RBO
  • 基于成本的优化器(Cost-Based Optimizer),简称CBO

2.2 基于规则的优化器

2.2.1 RBO简介

基于规则的优化器(Rule-Based Optimizer):所谓基于规则的优化器是指Oracle按照硬编码在数据库的一系列规则来决定SQL的执行计划,简称是RBO

2.2.2 RBO缺陷

RBO在oracle10后官方就不建议用,因为RBO并不支持oracle一些性能比较好的功能特性,也不会根据表的数据量等等获取执行计划,而且RBO定的那些规则也不是很容易修改。不过代码在oracle10后版本还是保存的,所以要学习测试也可以用SQL开启RBO模式

alter session set optimizer_mode='RULE';

2.2.3 RBO执行过程

RBO的执行过程:对于一条sql,oracle会事先给sql各种情况的执行计划定一个等级,一共有15个等级,从等级1到等级15,规则是等级越低执行效率越高,也就是等级1的执行计划执行效率是最高的。然后oracle自然就选出等级1的执行路径作为执行计划。

2.2.4 RBO特殊情况

  • 对于执行路径一样的情况:假如出现执行路径一样的情况,这时候就要根据数据字典缓存来确定最低的等级了,意思就是获取缓存中的先后顺序确定哪条作为执行计划

2.2.5 强制CBO的情况

上面说了可以通过SQL开启CBO模式,这是针对普通情况的,假如出现下面情况,那就是强制使用CBO

  • SQL涉及对象有IOT(Index Organized Table)
  • SQL涉及的对象分区表
  • 使用了并行查询或者并行DML
  • 使用了星型连接
  • 使用了哈希连接
  • 使用了索引快速全扫描
  • 使用了函数索引
  • ....

这些情况总结来自《基于Oracle的SQL优化一书》

虽然Oracle针对上述情况都开启了强制CBO,但是我们还是可以手动解决的,方法也是来自《基于Oracle的SQL优化一书》,作者提供了改写等价sql的方法,比如在sql的where条件中对number或者date类型的列加0,

select * from 表格 where a+0>参数

如果是varchar2类型的,加可以加个空字符串

select * from 表格 where a || '' = 参数

2.3 基于成本的优化器

2.3.1 CBO简介

介绍一下基于成本的优化器(Cost-Based Optimization):基于成本的优化器简称是CBO,在SQL执行过程,会缓存执行的一些信息到Oracle的数据字典里,这里的信息就有sql执行路径的I/O、网络资源、CPU的使用情况,其实这个就是SQL的执行成本,也是按照这个成本来确定执行计划。所以CBO概念就是根据I/O、网络资源、CPU的使用情况来确定SQL执行路径也可以说是执行计划的优化器。

2.3.2 集的势

集的势(Cardinality)是CBO特有的概念,集的势指结果集的行数。引入这个概念是为了表示SQL执行成本值,Cardinality越大,也就是说sql执行返回的结果集所包含的行数就越多,也说明成本越大。

2.3.3 可选择率

可选择率(Selectivity):指施加指定谓语条件后返回结果集的记录数占未施加任何谓语条件的原始结果集的记录数的比率。可选择率的范围是0~1,它的值越小,说明可选择性越好,值越大说明可选择性越差,也就是成本值越大。可选择率为1时性能是最差的。

可选择率 = 施加指定谓语条件后返回结果集的记录数/未施加任何谓语条件的原始结果集的记录数。

三、优化器优化模式

3.1 优化器优化模式分类

优化器优化模式分为Rule、Choose、First rows、All rows

  • Rule:就是基于规则Rule的方式
  • Choose:当一个表或索引有统计信息,则走CBO的方式,如果表或索引没统计信息,表又不是特别的小,而且相应的列有索引时,那么就走索引,走RBO的方式。这是Oracle的默认方式
  • First rows:与Choose方式是类似的,所不同的是当一个表有统计信息时,它将是以最快的方式返回查询的最先的几行,从总体上减少了响应时间。
  • All rows:其实就是基于Cost方式

3.2 优化模式使用方法

要修改优化模式可以使用类似SQL

alter session set optimizer_mode='RULE';

Oracle SQL优化器简介的更多相关文章

  1. 分享:SQL优化器简介

    SQL优化是我们经常会遇到的问题,无论你是专职的数据分析人员还是全栈开发大神或者是CURD搬运工. 我们在工作中经常会听到这样的声音:“查询慢?加个索引吧”.虽然加索引并不一定能解决问题,但是这体现了 ...

  2. SQL优化器简介

    文章导读: 什么是RBO? 什么是CBO? 我们在工作中经常会听到这样的声音:"SQL查询慢?你给数据库加个索引啊".虽然加索引并不一定能解决问题,但是这初步的体现了SQL优化的思 ...

  3. 从两表连接看Oracle sql优化器的效果

    select emp.*,dept.* from tb_emp03 emp,tb_dept03 dept where emp.deptno=dept.id -- 不加hint SQL> sele ...

  4. SQL优化器-RBO与CBO分别是什么

    数据库系统发展历史 数据库系统产生于20世纪60年代中期,至今有近50多年的历史,其发展经历了三代演变,造就了四位图灵奖得主,发展成为一门计算机基础学科,带动了一个巨大的软件产业. 数据库系统是操作系 ...

  5. oracle sql 优化大全

    转自: http://panshaobinsb.iteye.com/blog/1718233 http://yulimeander.blog.sohu.com/115850824.html 最近遇到了 ...

  6. Oracle中CBO优化器简介

    Oracle中CBO优化器简介 Oracle数据库中的优化器是SQL分析和执行的优化工具.它负责制定SQL的执行计划,也就是它负责保证SQL的执行计划的效率最高,比如优化器决定Oracle以什么样的方 ...

  7. Oracle SQL优化一(常见方法)

    1.表访问方式优化: a)普通表优先“Index Lookup 索引扫描”,避免全表扫描 大多数场景下,通过“Index Lookup 索引扫描”要比“Full Table Scan (FTS) 全表 ...

  8. Oracle SQL优化[转]

    Oracle SQL优化 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化 ...

  9. Oracle的优化器的RBO和CBO方式

      1.基于规则的优化方式(Rule-Based Optimization,简称为RBO)       优化器在分析SQL语句时,所遵循的是Oracle内部预定的一些规则,对数据是不敏感的.它只借助少 ...

随机推荐

  1. sql server版本、组件和管理工具

    以下信息由何问起收集,希望有帮助. SQL Server 版本 定义 Enterprise 作为高级版本, SQL Server Enterprise 版提供了全面的高端数据中心功能,性能极为快捷.虚 ...

  2. 解决Kettle与Kerberos集成问题

    本文目的:记录Kerberos环境下,通过Kettle将MySQL数据清洗到HDFS过程解决的2个问题,希望对大家有所帮助. Kettle版本:pdi-ce-7.1.0.0-12 1.在Kerbero ...

  3. GUI学习之七——单选框QRadioButton和QButtonGroup的学习总结

    一.单选框QRadioButton的使用 1.类的描述 a.单选框按钮用于给用户提供若干选项中的单选操作,当一个被选中时,会自动取消选中的那个.(如果只有一个时可以通过单击该按钮改变其状态:而存在多个 ...

  4. 关于python的感想和turtle作图

    第一次知道有python这个东西是在去年七月份,就是一堆编程语言,当时我想它应该离我很远,也没对它有什么兴趣.直到在三月份的某一天我真正接触了它,其实也不是我主动,环境下学期必须学这东西.我有它的必修 ...

  5. eclipse中修改maven本地仓库方式

    1.安装maven,教程可参考:https://jingyan.baidu.com/article/4f7d5712a1306c1a21192746.html 2.安装成功后,可以打开eclipse新 ...

  6. Codeforces 1065 简要题解

    文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 GGG题略难,膜了一波zhouyuyang{\color{red} zhouyuyang}zhouyuyang巨佬的代码. 其余都挺清真的. ...

  7. (26)A delightful way to teach kids about computers

    https://www.ted.com/talks/linda_liukas_a_delightful_way_to_teach_kids_about_computers/transcript00:1 ...

  8. s6 传输层

    标题 s6-1 传输层概述(2019-04-06 21:19) s6-2 UDP(2019-04-07 08:39) s6-3 通信模型(2019-04-07 08:47) s6-4 TCP 数据段( ...

  9. git权限

    itHub--创建新的分支(转) 如何在 GitHub 的项目中创建一个分支呢? 其实很简单啦,直接点击 Branch,然后在弹出的文本框中添加自己的 Branch Name 然后点击蓝色的Creat ...

  10. sudo -iu [用户] 命令无法正常切换到用户目录的原因

    今天干活时遇到一个问题,在sudo -iu [用户]命令执行后无法切换到用户对应的[ 用户@机器 ~$ ]命令行 .bashrc已正常配置为 if [ -f /etc/bashrc ]; then . ...