优化器
2 种优化方式
CBO 优于 RBO
,是因为 RBO 是一种呆板、过时的优化器,它只认规则,对数据不敏感。毕竟规则是死的,数据是变化的。
优化方式 | 全称 | 描述 |
---|---|---|
RBO | Rule-Based Optimization 基于规则的优化器 |
自 Oracle 6 以来被采用,一直沿用至 Oracle 9i,Oracle 10g 开始被弃用。 它有一套严格的使用规则:只要你按照它去写SQL语句,无论数据表中的内容怎么样,也不会影响到你的 “执行计划” |
CBO | Cost-Based Optimization 基于代价的优化器 |
自 Oracle 8 中开始引入,但到 Oracle 9i 中才逐渐成熟,在 Oracle 10g 中完全取代 RBO CBO 是计算各种可能的 “执行计划” 的 “代价(cost)”,从中选用 cost 最低的方案,作为实际运行方案 |
4 种优化模式
- 优化器模式包括:选择、规则、第一行、所有行
优化模式 | 解释 |
---|---|
Choolse | 默认(重点关注) 当一个表或索引有统计信息时,走 CBO 模式,反之走 RBO 模式 |
Rule | 基于规则的方法,可忽略 |
First Rows | 与 Choose 方式类似,当一个表有统计信息时,它将以最快的方式返回查询的最先的几行,从总体上减少了相应的时间,反之走 RBO 模式 |
All Rows | 同 First Rows,当一个表有统计信息时,以最快的方式返回表的所有行,从总体上提高查询的吞吐量,反之走 RBO 模式 |
表连接 / 访问方式
表的访问方式 | 解释 |
---|---|
table access full(全表扫描) | |
table access by rowid(通过 rowid 扫描) | |
table access by index scan(索引扫描) | index unique scan(索引唯一扫描) index range scan(索引范围扫描) index full scan(索引全扫描). index fast full scan(索引快速扫描) index skip scan(索引跳跃扫描) |
表连接方式 | 工作原理 | 适用原则 |
---|---|---|
nested loops 嵌套循环 | 2层嵌套循环 | 1.驱动表数据量 < 1W 2.被查找表有索引 |
hash join 散列连接 | 较小的表在 RAM 创建 hash table,较大的表读取记录,效率最高 | 1.等值连接 2. 驱动表大时,效果较好;驱动表小时,效果更好 3. 需要设置参数 HASH_AREA_SIZE |
sort merge join 排序合并连接 | 记录排序然后合并 | 1. 非等值连接或排序 |
star join 星型连接 | 多个维度表 和一个大的 数据表,然后嵌套循环连接 | 1.一般用于 数据仓库 2. 需要启用参数 STAR_TRANSFORMATION_ENABLED |
F5 查看执行计划
- 工具:PL/SQL
- 设置:
工具 -> 首选项 -> 窗口类型 -> 计划窗口
列字段 | 解释 |
---|---|
对象所有者(Object owner) | 属主 |
对象名称(Object name) | 对象名(表名、索引名等) |
耗费(Cost) | Oracle 估计的该步骤的执行成本,理论上越小越好 |
基数(Cardinality) | Oracle 估计的当前操作的返回结果集行数 |
字节(Bytes) | 执行该步骤后返回的字节数 |
访问谓词(Access predicates) | 知道要什么数据,也知道在哪里,直接去取 一般有索引 |
过滤谓词(Filter predicates) | 先把数据取出来,再判断是否满足条件,不满足就丢弃 一般没有索引 |