CBO 是基于对各种不同执行路径成本的计算,比较并选取成本值最小的执行路径来作为目标 SQL 的执行计划的;而成本值的计算则是根据目标 SQL 所涉及的表、索引、列等相关对象的统计信息,运用 CBO 固有的成本值计算公式计算出来的。所以,对统计信息的了解成了理解 CBO、理解执行计划的关键。
Oracle 数据库里的统计信息分为六种类型,包含对应的对象的信息,维度不同:
- 表的统计信息:典型的维度有 记录数、表块(表里的数据块)的数量、平均行长度等。
- 索引的统计信息:典型的维度有 索引的层级、叶子块的数量、聚族因子等。
- 列的统计信息:典型的维度有 列的 distinct 值的数量、列的 null 值的数量、列的最小值、列的最大值以及直方图等。
- 系统统计信息:所在数据库服务器的系统处理能力,包含来 CPU 和 I/O 这两个维度,借助于系统统计信息,Oracle 可以知道目标数据库服务器的实际处理能力。
- 数据字典统计信息:描述 Oracle 数据库里的数据字典基表(如
TAB$
、IND$
等)数据字典基表上的索引,以及这些数据字典基表的列的详细信息,与普通表、索引、列的统计信息没有本质区别。 - 内部对象统计信息:描述 Oracle 数据库里的内部表(如
X$
系列表,其实只是 Oracle 自定义的内存结构)的信息信息,并不占用实际的物理存储空间。
可以用 ANALYZE
命令(只能收集前四种,且不能并行收集)或 DBMS_STATS
包来收集统计信息,