Oracle SQL优化器简介

[TOC]html

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

1、Oracle的优化器

1.1 优化器简介

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

1.2 SQL执行过程

Oracle SQL的执行过程:缓存

在这里插入图片描述

2、优化器优化方式

2.1 优化器的优化方式

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

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

2.2 基于规则的优化器

2.2.1 RBO简介

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

2.2.2 RBO缺陷

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

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、优化器优化模式

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';

原文出处:https://www.cnblogs.com/mzq123/p/10398701.html

相关文章
相关标签/搜索