Oracle中CBO优化器简介
Oracle数据库中的优化器是SQL分析和执行的优化工具。它负责制定SQL的执行计划,也就是它负责保证SQL的执行计划的效率最高,比如优化器决定Oracle以什么样的方式访问数据,优化器是SQL执行的核心,它作出的执行计划的好坏,直接影响着SQL的执行效率。
1、执行计划中数据的访问方式:
直接表(无索引)的访问:并行
多数据块
通过索引访问:
index unique scan(=唯一值)
Index range scan(<,>范围)
Index full scan(order by, <>)
Index fast full scan(count(index))
Index skip scan(前导重复率高的联合索引)
当要返回的数据量占整个表的大部分时,建议使用全表扫描(并行、多块读)
FFS(index fast full scan)常用于count(索引列),可以对索引进行多数据块读(只要求和,不需要依次扫描)
index range scan:返回整个表的部分(不宜太大)
2、执行计划中数据的关联处理:
Nested loop join:嵌套循环
Merge join:先将表排序
Hash join:hash定位
HJ:关联中有一个表比较小(将被做成hash表存放在内存中)、表上没有索引、返回结果集比较大
NL:关联中有一个表比较小、被关联表(大表)的关联字段上有索引、索引的键值的重复率不应过高
ML:中间过程的结果集已经排过序(比较少见,通常是对最终结果进行排序)
CBO优化器有两者可以选择的运行模式:
First_rows(n)
All_rows
3、First_rows(n)模式
当设置为first_rows(n)模式时,Oracle在执行SQL时,会优选考虑将结果集的前N条记录以最快的速度反馈回来,而其他的结果并不需要同时返回。这种设置常用于一些电子商务网站或者BBS论坛的分页处理。
需要注意的是order 不要的字段必须创建索引。否则Oracle会忽略first_rows而选择使用all_rows。
4、All_rows模式
当设置为all_rows()模式时,Oracle会以最快的速度将全部的SQL执行完毕,并将所有的结果集反馈回来。All_rows模式在OLAP系统中用的比较多,all_rows强调SQL整体的执行效率,而first_rows(n)强调以最快的速度返回前n行,而不管所有结果返回的时长,可能最后一条记录要很长时间之后才能获得。