首页 理论教育基于成本的优化器:数据库性能管理与调优

基于成本的优化器:数据库性能管理与调优

【摘要】:统计信息中保存有列选择度、数据量等大量信息,因此基于规则的优化器可以更灵活地创建执行计划。extent是由相关联的数据块构成的逻辑单位。否则,会因表的random access造成表扫描的平均成本增高。排序操作成本并非用于访问对象数据的成本,而是用于排序已提取数据的成本。若使用以特定列为标准排序的索引提取数据时,可以减少额外的排序操作成本。要了解SQL语句实际应访问的对象范围程度才能计算实际成本,这是非常重要的概念。

优化器收集相应数据库的统计信息,并以该资料为基础创建SQL的执行计划。统计信息中保存有列选择度、数据量等大量信息,因此基于规则的优化器可以更灵活地创建执行计划。不过,统计信息只将无数信息中的一部分作为统计信息保存,因此有时会创建错误的执行计划。首先介绍CBO中使用的重要术语。

1)成本(cost)

Cost是为比较处理SQL语句的各个方法的成本而在CBO中使用的成本评价的单位。对于 index access和 table access, CBO将以各 自access method所需的 I/O次数为基础计算cost,在其中反映一部分CPU、network成本并校正。但DBA会将由CBO计算的cost与实际发生的I/O成本相关联,很难应用到SQL语句调优中。因此理解cost值的含义即可。

(1) table scan cost。

常用的表扫描成本的计算方法如下:

成本(cost)=ceil(HWM下的所有对象数据块数 /DB_ FILE_ MULTIBLOCK_ READ_COUNT)

作为参考,如果表分为多个extent且各个extent未指定为DB_FILE_MULTIBLOCK_READ_COUNT DB_BLOCK_SIZE的倍数,则会出现低效I/O。例如,一个extent由20个数据块组成,且DB_FILE_MULTIBLOCK_READ_COUNT=8,则每个extent的I/O次数为 2(8 * 2=16)+1(4),即为 3次,最后为了只读取 4个数据块出现执行一次 I/O的低效操作。

Ceil函数返还大于或等于自变量的最小整数值,返还值的类型与自变量的类型相同。

在Oracle中逻辑上最小的I/O单位为数据块(block)。 extent是由相关联的数据块构成的逻辑单位。segment以extent为单位分配(allocate)或取消分配(de-allocate)存储空间。使用 extent时,相关 block将保存到连续空间,有利于 I/O。即如果有内容要写入 data file, Oracle会以extent单位进行分配,使相关的Block保存至连续的空间。

(2) index scan cost。

索引扫描的成本将根据以下要素进行计算:

① B*树 level数。

②对象leaf block的数。

③ 结果上访问的table block数(clustering factor)。

INDEX FAST FULL SCAN时会受到DB_FILE_MULTIBLOCK_READ_COUNT的影响。仅使用索引的构成列就能得出满意结果时,可使用INDEX FAST FULL SCAN。否则,会因表的random access造成表扫描的平均成本增高。一般情况下,对象范围超过所有行的5%~10%,则判断表扫描优于索引扫描。

(3) SORT cost。

排序操作成本并非用于访问对象数据的成本,而是用于排序已提取数据的成本。若使用以特定列为标准排序的索引提取数据时,可以减少额外的排序操作成本。而且根据所有排序操作的对象与SORT_AREA_SIZE比较大小的差异,以确定排序操作的成本。

① SORT操作是非常CPU INTENSIVE(集中)的操作。

②如果无法在内存内执行SORT操作,则进行I/O INTENSIVE(集中)的操作。

③ SORT操作的cost将根据以下要素进行计算:

A.SORT对象行数和大小;

B.SORT_AREA_SIZE。

④发生SORT操作时,可用以下操作:

A.ORDER BY;

B.AGGREGATION;

C.JOIN OPERATIONS。

2)选择度(selectivity)

选择度指满足WHERE子句中所示条件的行数在整个表中所占的比率。要了解SQL语句实际应访问的对象范围程度才能计算实际成本,这是非常重要的概念。对于值未均等分布的列的选择度,可以使用直方图计算出更准确的结果。

选择度=(符合条件的行数/表的所有行数)×100=(1/列值种类)×100

3)选择度计算

(1)指定literal值时,根据High_value和Low_value值计算条件值的比率。literal值指编译时按进程内定义的方式准确解析的值。与此相比,变量在程序运行时可根据需要表示不同的值,常数在程序运行时则始终表示相同的值。但literal不是名称,而是值本身。例如,在公式 x=7中,“ x”为变量,“7”为 literal值。literal值可以是数字,也可以是文字或字符串。

(2)指定绑定变量时,分为以下两种情况:

①若指定的条件为绑定变量,则在绑定实际变量值之前制定执行计划,因此CBO无法计算该列的准确选择度。此时,对于各个运算符,CBO会将选择度(selectivity)作为default值进行计算。

② 多个条件组合时(多个条件子句通过AND、OR的组合时),(www.chuimin.cn)

作为参考,使用bind变量和使用literal value时所用的选择度(selectivity)不同,因此若要查看实际执行计划,执行时不能用特定literal替换bind变量,才能查看准确的执行计划。

4)基数(cardinality)

cardinality指通过特定表或子集指定操作返还后计算的行数。例如,CBO对某些index access以100来计算 cardinality时,会查找该索引,表示预期会返回100条索引。cardinality直接影响access method[1]和join method的选择,是非常重要的项目。cardinality非常大时,优化器作为access method可能会选择FULL-TABLE SCAN,作为join method则可能会选择HASH JOIN。 driving(外部)表的cardinality是NESTED LOOP JOIN成本评价中非常重要的要素。会根据该值确定执行Loop(重复)操作的次数。此外,排序操作的成本也依据cardinality值,因此对排序操作成本的计算同样有着重要意义。

5)传递性(transitivity )

transitivity是通过推算出各个“=”条件语句的相关性,逻辑上等价地替换条件语句时应用的代数特点。这在离散数学中应用广泛。例如,A=B、B=C,则可以替换为A=C(当然,如果上述条件为连接条件,则不会如此简单地进行替换)。CBO利用这些transitivity以更加多样化的方式应用索引,则得出更为有效的执行计划的可能性增大。

6)优化器模式

(1) RULE:不考虑分析(analyze)信息,根据SQL语句信息创建最佳执行计划。

(2) CHOOSE:根据data dictionary信息中分析(analyze)信息的有无,基于成本或基于规则(rule-based)制定最优路径(统计资料不存在时与rule-based相同)。

(3) FIRST ROWS:为使用最少的资源导入第一个行而创建执行计划,无法优化需要排序(SORT)的SQL。使用基于成本(cost-based)的优化方式。

(4) ALL ROWS:为使用最少的资源导入所需的全部结果而创建执行计划。使用基于成本(cost-based)的优化方式。

(5) FIRST ROWS n:为使用最少的资源导入第n个行而创建执行计划。

7)选择优化器模式时的注意事项

选择优化器模式时注意事项如图2-6所示。

图2-6 选择优化器模式时的注意事项

8)影响基于成本的优化器(CBO)的参数

① OPTIMIZER_FEATURES_ENABLED:要直接使用特定版本的优化器时。

② OPTIMIZER_MODE:用于实例的优化器的模式设置。

③ OPTIMIZER_PERCENT_PARALLEL:指定对象的并行处理数(degree)反映到成本的程度(%)。

④ HASH_AREA_SIZE:影响 HASH JOIN的成本。

⑤ SORT_AREA_SIZE:影响SORT MERGE JOIN的成本。

⑥ DB_FILE_MULTIBLOCK_READ_COUNT:影响FULL SCAN的成本。

⑦ ALWAYS_ ANTI _JOIN: NOT IN SUBQUERY时将执行计划设置为ANTI HASH JOIN。

⑧ HASH_JOIN_ENABLED:决定是否使用 HASH JOIN。

⑨ HASH_MULTIBLOCK_IO_COUNT:影响 HASH JOIN的成本。

⑩ OPTIMIZER_INDEX_COST_ADJ:使用索引的影响度(0~100, default: 100)。

⑪ OPTIMIZER_INDEX_CACHING: NESTED LOOP JOIN时使用的索引leaf block的缓存 度(0~100, default: 0)。

9)优化器的限制

前文已对优化器存在限制的原因做过介绍。简单来说,在实际运行 SQL之前,优化器就需要利用统计资料制定执行计划。即优化器最大的限制就是在指定时间内仅用指定的统计信息预测成本。此外,通过预先指定的数学公式计算受多种要素影响的实际数据的统计选择度,无法避免受限情况。

①信息量是限制:无法预先拥有可用于指定条件的所有统计信息。

② 可用时间的限制:制定执行计划所花费的时间也是SQL的执行成本。

③数据选择度计算的限制:所用运算符各自组合引起的各种事件个数;多种列的组合引起的各种事件个数;实际情况下大多使用bind变量,使用bind变量时histogram也无法使用,最后还是取决于平均值。