oracle 优化1

Oracle 的优化器有两种优化方式:
即基于规则的优化方式(Rule-Based Optimization, 简称为 RBO)
和基于代价的优化方式(Cost-Based Optimization, 简称为 CBO), 在 Oracle8 及以后的版本, Oracle 强列推荐用 CBO 的方式
RBO 方式: 优化器在分析 SQL 语句时, 所遵循的是 Oracle 内部预定的一些规则. 比如常见的, 当一个 where 子句中的一列有索引时走索引.
CBO 方式: 它是看语句的代价(Cost), 这里的代价主要指 CPU 和内存. 优化器在判断是否用这种方式时, 主要参照的是表及索引的统计信息. 统计信息给出表的大小、有多少行、每行的长度等信息. 这些统计信息起初在库内是没有的, 是做 analyze 后才出现的, 很多时侯过期统计信息会令优化器做出一个错误的执行计划, 因些应及时更新这些信息.
注意: 走索引不一定就是优的, 比如一个表只有两行数据, 一次 IO 就可以完成全表的检索, 而此时走索引则需要两次 IO, 这时全表扫描(full table scan)是最好.

优化模式包括 Rule、Choose、First Rows、All Rows 四种方式:
Rule: 基于规则的方式.
Choolse: 默认的情况下 Oracle 用的便是这种方式. 指的是当一个表或索引有统计信息, 则走 CBO 的方式, 如果表或索引没统计信息, 表又不是特别的小, 而且相应的列有索引时, 那么就走索引, 走 RBO 的方式.
First Rows: 它与 Choose 方式是类似的, 所不同的是当一个表有统计信息时, 它将是以最快的方式返回查询的最先的几行, 从总体上减少了响应时间.
All Rows: 也就是我们所说的 Cost 的方式, 当一个表有统计信息时, 它将以最快的方式返回表的所有的行, 从总体上提高查询的吞吐量. 没有统计信息则走 RBO 的方式.

设定选用哪种优化模式:
A、Instance 级别我们可以通过在 initSID.ora 文件中设定 OPTIMIZER_MODE=RULE/CHOOSE/FIRST_ROWS/ALL_ROWS
如果没设定 OPTIMIZER_MODE 参数则默认用的是 Choose 方式.
B、Sessions 级别通过 ALTER SESSION SET OPTIMIZER_MODE=RULE/CHOOSE/FIRST_ROWS/ALL_ROWS 来设定.
C、语句级别用 Hint(/*+ ... */) 来设定

为什么表的某个字段明明有索引, 但执行计划却不走索引?
1、优化模式是 all_rows 的方式
2、表作过 analyze, 有统计信息
3、表很小, 上文提到过的, Oracle 的优化器认为不值得走索引
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值