天天看点

Oracle数据库性能优化之优化器组件

作者:执着的花猫Jp

优化器包含三个组件:转换器,估计器和计划生成器。

下图说明了这些组件。

Oracle数据库性能优化之优化器组件

一组查询块表示已解析的查询,这是优化器的输入。下表描述了优化程序的操作。

步骤 执行方式 描述
1 查询转换器 优化器确定更改查询的形式是否有帮助,以便优化器可以生成更好的执行计划。
2 估算器 优化器根据数据字典中的统计信息估算每个计划的成本。
3 计划生成器 优化器比较计划的成本,然后选择成本最低的计划(称为执行计划)传递给行源生成器。

查询转换器

对于某些语句,查询转换器确定以较低的成本将原始SQL语句重写为语义上等效的SQL语句是否有利。当存在可行的替代方案时,数据库将分别计算替代方案的成本,并选择成本最低的替代方案。下图显示了查询转换器将使用的输入查询重写为使用OR的输出查询UNION ALL。

Oracle数据库性能优化之优化器组件

估算器

所述估计器是确定一个给定的执行计划的总成本的优化器组件。估算器使用三种不同的方法来确定成本:

选择性

  • 查询选择的行集中的行百分比,0表示无行,1表示所有行。选择性与查询谓词(例如WHERE last_name LIKE 'A%'或谓词的组合)相关。谓词在选择性值接近时变得更具选择性,而在价值接近时则变得0不那么选择性(或更具非选择性)1。
  • 注意:选择性是在执行计划中不可见的内部计算。

基数

  • 基数是执行计划中每个操作返回的行数。此输入对于获得最佳计划至关重要,对于所有成本功能都是相同的。估计器可以从收集的表统计信息中得出基数DBMS_STATS,也可以在考虑到谓词(过滤器,联接等)DISTINCT或GROUP BY操作等的影响后得出基数。所述Rows在执行计划列显示了估计的基数。

成本

  • 该度量表示使用的工作单位或资源。查询优化器将磁盘I / O,CPU使用率和内存使用率作为工作单位。

如下图所示,如果统计信息可用,则估算器将使用它们来计算度量。统计信息提高了度量的准确性。

Oracle数据库性能优化之优化器组件

对于示以上所示的查询,估算器使用选择性,估算的基数(总返回10行)和成本测度得出其总成本估算为3:

Oracle数据库性能优化之优化器组件

选择性

选择性表示,从行组的一小部分行集可以是基表,视图或联接的结果。选择性与查询谓词(例如last_name= 'Smith')或谓词的组合(例如)相关last_name = 'Smith' AND job_id = 'SH_CLERK'。注意:选择性是在执行计划中不可见的内部计算。

谓词从行集中过滤出特定数量的行。因此,谓词的选择性指示通过谓词测试的行数。选择性范围是0.0到1.0。选择性为0.0表示未从行集中选择任何行,而选择性为1.0表示已选择所有行。谓词在值接近0.0时变得更具选择性,而在值接近1.0时则变得不那么选择性(或更不选择性)。优化程序根据统计信息是否可用来估计选择性:

  • 统计资料不可用

根据OPTIMIZER_DYNAMIC_SAMPLING初始化参数的值,优化器将使用动态统计信息或内部默认值。数据库根据谓词类型使用不同的内部默认值。例如,相等谓词(last_name = 'Smith')的内部默认值低于范围谓词(last_name > 'Smith')的内部默认值,因为期望相等谓词返回较小的行部分。

  • 可用统计

当统计数据可用时,估计器将使用它们来估计选择性。假设有150个不同的员工姓氏。对于相等谓词last_name = 'Smith',选择性是的n不同值的数量的倒数last_name,在此示例中为0.006,因为查询从150个不同值中选择包含1的行。

如果last_name列上存在直方图,则估计器将使用直方图而不是不同值的数量。直方图捕获了列中不同值的分布,因此它产生了更好的选择性估计,尤其是对于那些具有数据偏斜的列。

基数

基数是由每个操作在执行计划中返回的行的数目。例如,如果优化程序对全表扫描返回的行数的估计为100,则此操作的基数估计为100。基数估计出现在Rows执行计划的列中。优化器基于一组复杂的公式来确定每个操作的基数,这些公式使用表和列级别的统计信息或动态统计信息作为输入。当单个等式谓词出现在单表查询中且没有直方图时,优化器将使用最简单的公式之一。在这种情况下,优化器采用均匀分布,并通过将表中的行总数除以WHERE子句谓词中使用的列中不同值的数量,来计算查询的基数。例如,用户hr查询employees表如下:

SELECT first_name, last_name
FROM   employees
WHERE  salary='10200';           

该employees表包含107行。当前的数据库统计信息表明,该salary列中不同值的数量为58。因此,优化器2使用公式将结果集的基数估计为107/58=1.84。基数估计必须尽可能准确,因为它们会影响执行计划的所有方面。当优化器确定连接成本时,基数很重要。例如,在employees和departments表的嵌套循环连接中,in 的行数employees决定了数据库必须多久探测一次departments表。基数对于确定分类成本也很重要。

成本

成本是表示用于一个计划的估计资源使用的内部数值量度。该费用特定于优化器环境中的查询。为了估算成本,优化器会考虑以下因素:

  • 系统资源,包括估计的I / O,CPU和内存
  • 估计返回的行数(基数)
  • 初始数据集的大小
  • 数据分配
  • 访问结构

成本是优化程序用来比较同一查询的不同计划的内部度量。您无法调整或更改成本。执行时间是成本的函数,但是成本并不直接等于时间。例如,如果查询A的计划的成本比查询B的计划低,那么可能会有以下结果:

  • A的执行速度比B快。
  • A的执行速度比B慢。
  • A与B的执行时间相同。

因此,无法相互比较不同查询的成本。此外,您无法比较使用不同优化器模式的语义等效查询的成本。

执行计划生成器

执行计划生成器探讨了通过尝试不同的访问路径查询块各种各样的计划,连接方法和连接顺序。由于数据库可以使用多种组合来产生相同的结果,因此可能有许多计划。优化器选择成本最低的计划。下图显示了优化程序测试输入查询的不同计划。

Oracle数据库性能优化之优化器组件

优化器跟踪文件中的以下代码片段显示了优化器执行的一些计算:

GENERAL PLANS
***************************************
Considering cardinality-based initial join order.
Permutations for Starting Table :0
Join order[1]:  DEPARTMENTS[D]#0  EMPLOYEES[E]#1
 
***************
Now joining: EMPLOYEES[E]#1
***************
NL Join
  Outer table: Card: 27.00  Cost: 2.01  Resp: 2.01  Degree: 1  Bytes: 16
Access path analysis for EMPLOYEES
. . .
  Best NL cost: 13.17
. . .
SM Join
  SM cost: 6.08
     resc: 6.08 resc_io: 4.00 resc_cpu: 2501688
     resp: 6.08 resp_io: 4.00 resp_cpu: 2501688
. . .
SM Join (with index on outer)
  Access Path: index (FullScan)
. . .
HA Join
  HA cost: 4.57
     resc: 4.57 resc_io: 4.00 resc_cpu: 678154
     resp: 4.57 resp_io: 4.00 resp_cpu: 678154
Best:: JoinMethod: Hash
       Cost: 4.57  Degree: 1  Resp: 4.57  Card: 106.00 Bytes: 27
. . .

***********************
Join order[2]:  EMPLOYEES[E]#1  DEPARTMENTS[D]#0
. . .
***************
Now joining: DEPARTMENTS[D]#0
***************
. . .
HA Join
  HA cost: 4.58
     resc: 4.58 resc_io: 4.00 resc_cpu: 690054
     resp: 4.58 resp_io: 4.00 resp_cpu: 690054
Join order aborted: cost > best plan cost
***********************           

跟踪文件显示优化器首先尝试将该departments表作为联接中的外部表。优化器为三种不同的联接方法计算成本:嵌套循环联接(NL),排序合并(SM)和哈希联接(HA)。优化器选择哈希联接作为最有效的方法:

Best:: JoinMethod: Hash
       Cost: 4.57  Degree: 1  Resp: 4.57  Card: 106.00 Bytes: 27           

然后,优化器使用employees外部表尝试不同的连接顺序。此连接订单的成本比先前的连接订单高,因此被放弃。当找到成本最低的计划时,优化器使用内部截止来减少尝试的计划数量。截止时间基于当前最佳计划的成本。如果当前的最佳成本很高,则优化器将探索替代计划以找到较低成本的计划。如果当前的最佳成本很小,则优化器会迅速结束搜索,因为进一步的成本改善并不明显。