目录
在看《基于Oracle的SQL优化一书》知道了很多专业名称,做了记录,CBO、优化器、查询转换、执行计划、Hint、并行、游标、绑定变量、统计信息、直方图、索引等等。这篇博客可以说是读书笔记
优化器(Optimizer):优化器是Oracle数据库内置的一个核心子系统,负责解析SQL,Oracle优化器是Oracle系统的一个核心组件,其目的是按照一定的原则来获取目标SQL在当前情形下执行的最高效执行路径,也可以说是执行计划。
Oracle SQL的执行过程:
Oracle优化器按照优化方式分为两种
基于规则的优化器(Rule-Based Optimizer):所谓基于规则的优化器是指Oracle按照硬编码在数据库的一系列规则来决定SQL的执行计划,简称是RBO
RBO在oracle10后官方就不建议用,因为RBO并不支持oracle一些性能比较好的功能特性,也不会根据表的数据量等等获取执行计划,而且RBO定的那些规则也不是很容易修改。不过代码在oracle10后版本还是保存的,所以要学习测试也可以用SQL开启RBO模式
alter session set optimizer_mode=‘RULE‘;
RBO的执行过程:对于一条sql,oracle会事先给sql各种情况的执行计划定一个等级,一共有15个等级,从等级1到等级15,规则是等级越低执行效率越高,也就是等级1的执行计划执行效率是最高的。然后oracle自然就选出等级1的执行路径作为执行计划。
上面说了可以通过SQL开启CBO模式,这是针对普通情况的,假如出现下面情况,那就是强制使用CBO
这些情况总结来自《基于Oracle的SQL优化一书》
虽然Oracle针对上述情况都开启了强制CBO,但是我们还是可以手动解决的,方法也是来自《基于Oracle的SQL优化一书》,作者提供了改写等价sql的方法,比如在sql的where条件中对number或者date类型的列加0,
select * from 表格 where a+0>参数
如果是varchar2类型的,加可以加个空字符串
select * from 表格 where a || ‘‘ = 参数
介绍一下基于成本的优化器(Cost-Based Optimization):基于成本的优化器简称是CBO,在SQL执行过程,会缓存执行的一些信息到Oracle的数据字典里,这里的信息就有sql执行路径的I/O、网络资源、CPU的使用情况,其实这个就是SQL的执行成本,也是按照这个成本来确定执行计划。所以CBO概念就是根据I/O、网络资源、CPU的使用情况来确定SQL执行路径也可以说是执行计划的优化器。
集的势(Cardinality)是CBO特有的概念,集的势指结果集的行数。引入这个概念是为了表示SQL执行成本值,Cardinality越大,也就是说sql执行返回的结果集所包含的行数就越多,也说明成本越大。
可选择率(Selectivity):指施加指定谓语条件后返回结果集的记录数占未施加任何谓语条件的原始结果集的记录数的比率。可选择率的范围是0~1,它的值越小,说明可选择性越好,值越大说明可选择性越差,也就是成本值越大。可选择率为1时性能是最差的。
可选择率 = 施加指定谓语条件后返回结果集的记录数/未施加任何谓语条件的原始结果集的记录数。
优化器优化模式分为Rule、Choose、First rows、All rows
要修改优化模式可以使用类似SQL
alter session set optimizer_mode=‘RULE‘;
原文:https://www.cnblogs.com/mzq123/p/10398701.html