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 的优化器认为不值得走索引