33
Oracle Database 12c 2 版中的优化器 O R A C L E 白皮书 | 2 0 1 6 11

Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

  • Upload
    others

  • View
    8

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

Oracle Database 12c 第 2 版中的优化器

O R A C L E 白皮书 | 2 0 1 6 年 11 月

Page 2: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

ORACLE DATABASE 12C 中的优化器

目录

引言 1

自适应查询优化 2

优化器统计 13

优化器统计顾问 16

新的和增强的优化技术 17

SQL 计划管理 24

初始化参数 24

总结 27

参考资料 28

免责声明

以下内容旨在概述产品的总体发展方向。该内容仅供参考,不可纳入任何合同。其内容不构成提供任何材

料、代码或功能的承诺,并且不应该作为制定购买决策的依据。此处所述有关 Oracle 产品的任何特性或

功能的开发、发布以及相应的日程安排均由 Oracle 自行决定。

Page 3: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

1 | ORACLE DATABASE 12C 中的优化器

引言

Oracle Optimizer 是 Oracle 数据库极其令人着迷的组件之一,因为它对每个 SQL 语句的处理都是

必要的。该优化器根据给定查询的结构、有关基础对象的可用统计信息,以及所有相关的优化器和

执行特性为每个 SQL 语句确定十分高效的执行计划。

本文将介绍 Oracle Database 12c 第 2 版1 中所有新的与优化器和统计相关的特性,并提供简单、可

重现的示例以轻松了解这些特性,在从先前版本迁移时这些信息尤为有用。本文还将介绍为了提高

性能和可管理性,对现有功能进行了怎样的增强。

一些 Oracle Optimizer 特性超出了本文的讨论范围,请参阅它们各自的文档。具体来说,这些特

性是:

» 优化器统计和优化器统计顾问

» SQL 计划管理

» 近似查询处理

要全面了解 Oracle Optimizer,建议在阅读本白皮书的同时参阅“参考资料”一节中列出的相关白皮

书。详情参见第 28 页。

1 Oracle Database 12c 第 2 版 (12.2) 是全球极受欢迎数据库的新一代产品,现在可以在 Oracle 云中使用

Page 4: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

2 | ORACLE DATABASE 12C 中的优化器

自适应查询优化

到目前为止,Oracle Database 12c 中优化器的一个很大的变化是自适应查询优化。自适应查询优化是一组功

能,这些功能使优化器能够对执行计划进行运行时调整并发现额外信息以帮助生成更好的统计信息。当现有统

计信息不足以生成优化计划时,这个新方法非常有用。自适应查询优化有两个不同的方面:自适应计划,专注

于改善查询的执行;自适应统计,使用额外信息改进查询执行计划。

图 1:新的自适应查询优化功能的各个组成部分

Oracle Database 12c 第 2 版中默认启用的自适应特性不同于 Oracle Database 12c 第1 版。请参见下面的“初始

化参数”一节了解详细信息。

自适应计划

如果符合特定的条件,优化器将选择自适应计划,例如,查询包括令基数难以精确估算的联接和复杂谓词的情

况。通过自适应计划,优化器能够将语句的计划决策推迟到执行时。优化器使用统计收集器 检测其所选计划

(默认计划),以便在运行时可以检测基数估算与计划中的操作所看到的实际行数是否存在较大差异。如果存

在显著差异,则将对计划或部分计划进行自动调整,以避免性能欠佳。

自适应联接方法

优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接 orders

和 products 表的优化器默认选择计划是一个经由 products 表的索引访问的嵌套循环联接。还确定了一个备选子

计划,以便优化器能够将联接类型切换为散列联接。在备选计划中,将通过全表扫描访问 products 表。

Page 5: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

3 | ORACLE DATABASE 12C 中的优化器

在初次执行过程中,统计收集器 收集执行信息并缓冲进入子计划的部分行。优化器确定要收集哪些统计信息,

以及针对不同的统计信息值应如何对计划作出判决。它计算一个“转折点”,即这两种计划都同样好的统计信息

值。例如,假设当 orders 表扫描生成的行数少于 10 时,嵌套循环联接为最佳,当 orders 表扫描生成的行数多

于 10 时,散列联接为最佳,那么这两种计划的转折点就是 10。优化器计算该值,并配置缓冲统计收集器以缓

冲并数到 10 行。如果扫描生成的行数至少为 10 行,那么将联接方法判决为散列联接,否则判决为嵌套循环联

接。在图 2 中,统计收集器正在监视并缓冲对 orders 进行全表扫描而返回的行。根据统计收集器提供的信息,

优化器将决定要使用的子计划。在该示例中,选择了散列联接,因为来自 orders 表的行数大于优化器初始估算

的行数。

图 2:联接 ORDERS 与 PRODUCTS 的自适应执行计划。左图是默认计划,右图是选用计划。

优化器可从嵌套循环联接切换为散列联接,反之亦然。但是,如果初始选择的联接方法是排序合并联接,则不

会进行调整。

默认情况下,explain plan 命令仅显示优化器选择的初始或默认计划。而 DBMS_XPLAN.DISPLAY_CURSOR 函

数显示查询实际使用的计划。

图 3:图 2 所示情形的 Explain plan 和 DBMS_XPLAN.DISPLAY_CURSOR 计划输出。

Page 6: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

4 | ORACLE DATABASE 12C 中的优化器

要查看自适应计划中的所有操作,包括统计收集器的位置,必须在 DBMS_XPLAN 函数中指定另一个格式参数

„adaptive‟。在该模式下,计划的 Id 列中会增加一个符号“-”,指明计划中未使用的操作(非活动状态)。

图 4:在 DBMS_XPLAN.DISPLAY_CURSOR 中使用 „ADAPTIVE‟ 格式参数显示的完整自适应计划

如果在“Plan”下拉框中选择“Full”,SQL Monitor 会呈现所有操作。计划的非活动部分显示为灰色(参见图 5)。

如果单击“Plan Note”图标,将显示一个弹出框,确认计划是自适应计划。

图 5:显示自适应计划的 SQL Monitor

Page 7: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

5 | ORACLE DATABASE 12C 中的优化器

自适应并行分布方法

当并行执行一条 SQL 语句时,某些操作(如排序、聚合和联接)需要在执行该语句的并行服务器进程间重新分

布数据。优化器所选的分布方法取决于操作自身、涉及的并行服务器进程数,以及预期的行数。如果优化器估

算的行数不准确,那么所选的分布方法可能达不到优化性能,而且可能会导致某些并行服务器进程未得到充分

利用。

使用新的自适应分布方法 HYBRID HASH,优化器可推迟至执行时再决定其分布方法,此时,它将拥有所涉及

的行数的更多信息。将在操作之前插入统计收集器,如果缓冲的实际行数小于阈值,分布方法将从 HASH 切换

为 BROADCAST。但如果缓冲的行数达到阈值,则分布方法将为 HASH。将阈值定义为 2 X 并行度。

图 6 显示了一个并行执行的、联接 EMP 和 DEPT 的 SQL Monitor 执行计划的示例。一组并行服务器进程(生

产者或粉色图标)扫描这两个表,然后将行发送到实际执行联接的另一组并行服务器进程(使用者或蓝色图

标)。优化器已决定使用 HYBRID HASH 分布方法。该联接中访问的首个表是 DEPT 表。出自 DEPT 表中的行

将在统计收集器(位于计划的第 6 行)中缓冲,直到超过阈值或提取完最后一行。此时,优化器将针对分布方

法做出决定。

图 6:使用自适应分布方法对 EMP 和 DEPT 进行散列联接的 SQL Monitor 执行计划

要了解在运行时选择了哪个分布方法,查找该信息的简便方法是查看 SQL Monitor 中的 OTHER 列。该列在包

含 PX SEND HYBRID HASH 行源的行中显示望远镜图标。当您单击该图标时,可以看到在运行时使用的分布

方法。

图 7:Hybrid hash 分布方法

对于自适应分布方法,可能在该对话框中显示的值有三个:6 = BROADCAST、

5 = ROUND-ROBIN 和 16 = HASH 分布。

Page 8: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

6 | ORACLE DATABASE 12C 中的优化器

自适应位图索引修剪

当优化器生成星型转换计划时,它必须选择正确的位图索引组合,以便尽可能高效地减少相关 ROWID 集。如

果存在许多索引,一些索引可能不会大幅减少 ROWID 集,但仍会在查询执行过程中带来大量处理成本。因

此,使用自适应计划来修剪掉不会大幅滤除匹配行数的索引。

以类似于图 3 所示示例的方式,DBMS_XPLAN.DISPLAY_CURSOR 将使用 adaptive 关键字显示 SQL 执行计

划中的自适应位图修剪。例如,看看下面这个 SQL 执行计划,其中显示位图索引 CAR_MODEL_IDX 被修剪:

图 8:自适应位图索引修剪示例。

Page 9: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

7 | ORACLE DATABASE 12C 中的优化器

自适应统计

优化器所决定的执行计划的质量取决于可用统计信息的质量。但是,一些查询谓词变得太复杂,而无法仅依赖

基本表统计信息,现在,优化器可以使用自适应统计增加这些统计信息。

动态统计

在 SQL 语句编译过程中,优化器决定可用统计信息是否足以生成不错的执行计划,或者是否应考虑使用动态采

样。动态采样用于弥补缺少或不足的统计信息,以避免生成非常拙劣的计划。对于查询中的一个或多个表没有

统计信息的情况,优化器将首先使用动态采样收集有关这些表的基本统计信息,然后再优化语句。这种情况下

收集的统计信息与使用 DBMS_STATS 包收集的统计信息相比,前者不如后者的质量高(由于前者是采样),也

不如后者完整。

自 Oracle Database 12c 第 1 版起,动态采样得到了增强,变成了动态统计。使用动态统计,优化器能够增加

现有统计信息,从而不仅为单一表访问而且为联接和 group-by 谓词获得更准确的基数估算。此外,自 Oracle

Database 12c 第 1 版起,还为初始化参数 OPTIMIZER_DYNAMIC_SAMPLING 引入了一个新级别 11。级别 11

使优化器能够自动决定为任何 SQL 语句使用动态统计,即使所有基本表统计信息都存在。优化器根据所用谓词

的复杂性、现有的基本统计信息和 SQL 语句的预计总执行时间决定是否使用动态统计。例如,对于优化器以前

会使用猜测的情况(比如,使用 LIKE 谓词和通配符的查询),将启动动态统计。

默认动态采样级别是 2,因此当设置为级别 11 时,动态采样的启动频率比以前要高得多。这将延长语句的解析

时间。为尽可能降低性能影响,在 Oracle Database 12c 第 1 版中动态采样查询的结果存储在服务器结果缓存2

中,自 Oracle Database 12c 第 2 版起存储在 SQL 计划指令信息库中。这样,多个 SQL 语句能够共享动态采

样收集的一组通用统计信息。SQL 计划指令(下面将详细介绍)也将利用该级别的动态采样。

自动重新优化

在首次执行 SQL 语句过程中,像往常一样生成执行计划。优化过程中,会记录下认为质量低下的某些类型的估

算(例如,缺乏统计信息的表估算或具有复杂谓词的表估算),并对生成的游标启用监视。如果系统对某个游

标启用反馈监视,会将计划中的基数估算与执行过程中观察到的实际基数进行比较。如果发现估算与实际基数

有明显差异,则优化器在下次执行时会寻找替代计划。优化器将使用上一次执行过程中收集的信息帮助确定备

选计划。优化器可对查询进行多次重新优化,每次都了解更多信息并进一步改善计划。Oracle Database 12c 支

持多种形式的重新优化。

2 有关服务器结果缓存的更多信息,请参见 Oracle 文档:数据库性能调优指南,调优结果缓存

Page 10: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

8 | ORACLE DATABASE 12C 中的优化器

统计信息反馈 统计信息反馈(正式名称为基数反馈)是重新优化的一种形式,可自动改善具有基数错误估值的重复查询的计

划。在首次执行 SQL 语句过程中,优化器生成执行计划并决定是否应为游标启用统计信息反馈监视。在以下情

况下启用统计信息反馈:表没有统计信息、表上有多个连接或分隔的筛选谓词,以及谓词包含优化器无法为其

准确计算基数估算的复杂运算符。

执行结束时,优化器将其起初的基数估算与在执行过程中观察到的实际基数进行比较,如果估算明显不同于实

际基数,则存储正确估算以供后续使用。它还将创建 SQL 计划指令,以便其他 SQL 语句可受益于初次执行过

程中获得的信息。如果再次执行该查询,优化器将使用更正后的基数估算而非其起初的估算来确定执行计划。

如果发现初始估算很准确,则无需执行其他步骤。首次执行后,优化器禁用对统计信息反馈的监视。

图 9 显示了一个受益于统计信息反馈的 SQL 语句示例。首次执行这个两表联接时,由于 customers 表有多个相

关单列谓词,优化器将基数低估了 8 倍。

图 9:受益于自动重新优化统计信息反馈的 SQL 语句的初次执行

如果估算与返回的实际行数有很大差别,游标就会标上 IS_REOPTIMIZIBLE 标记,将不再使用。

IS_REOPTIMIZIBLE 属性指明该 SQL 语句在下次执行时应进行硬解析,这样优化器可使用初次执行时记录的

执行统计信息,以便确定更好的执行计划。

图 10:初次执行的统计信息与起初基数估算有很大差别后对游标标记 IS_REOPTIMIZIBLE

Page 11: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

9 | ORACLE DATABASE 12C 中的优化器

也会创建 SQL 计划指令,以确保下次执行使用了类似 customers 表中的谓词的任何 SQL 语句时,优化器将识

别这些列之间的关联。

第二次执行时,优化器使用初次执行时获得的统计信息确定具有不同联接顺序的新计划。生成执行计划时统计

信息反馈的使用情况在执行计划下的注释部分中有注明。

图 11:使用初次执行获得的执行统计信息生成的新计划

新计划未标有 IS_REOPTIMIZIBLE,因此该计划将用于该 SQL 语句的所有后续执行。

图 12:使用初次执行获得的执行统计信息生成的新计划

Page 12: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

10 | ORACLE DATABASE 12C 中的优化器

性能反馈 重新优化的另一个形式是性能反馈,在自适应模式下启用自动并行度 (AutoDOP)3 时,性能反馈可帮助改进为重

复 SQL 语句选择的并行度(请参见第 25 页的 OPTIMIZER_ADAPTIVE_STATISTICS)。

在自适应模式下启用 AutoDOP 时,首次执行 SQL 语句的过程中,优化器确定是否应并行执行该语句,如果

是,还会确定应使用的并行度。根据估计的语句性能选择并行度。对于优化器决定要并行执行的任何 SQL 语句

的初次执行,还启用了其他性能监视。

初次执行结束时,将优化器选择的并行度与根据语句初次执行过程中收集的实际性能统计信息(如 CPU-时间)

计算得出的并行度进行比较。如果两个值差异很大,则将该语句标记为重新优化,且将初次执行的性能统计信

息作为反馈进行存储,以帮助为后续执行计算更适当的并行度。

如果对 SQL 语句使用性能反馈,将在计划下的注释部分中进行报告,如图 13 所示。

图 13:通过性能反馈发现串行运行时性能会更佳的 SQL 语句的执行计划

3 有关 AutoDOP 的更多信息,请参阅白皮书“Oracle Database 12c 并行执行基础”。请参见参考资料 5。

Page 13: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

11 | ORACLE DATABASE 12C 中的优化器

SQL 计划指令

SQL 计划指令是根据从自动重新优化获得的信息自动创建的。SQL 计划指令是优化器用于生成更优执行计划的

附加信息。例如,当联接在其联接列中具有数据偏差的两个表时,SQL 计划指令可指导优化器使用动态统计获

得更准确的联接基数估算。

SQL 计划指令在查询表达式上创建,而不是在语句或对象级别创建,以确保 SQL 计划指令可应用于多个 SQL

语句。还可以对一个 SQL 语句使用多个 SQL 计划指令。用于一个 SQL 语句的 SQL 计划指令数显示在执行计

划下的注释部分中(参见图 14)。

图 14:计划下的注释部分中显示了用于一个语句的 SQL 计划指令数

数据库自动维护 SQL 计划指令,并将它们存储在 SYSAUX 表空间中。将自动清除持续 53 周不再使用的任何

SQL 计划指令。也可以使用 DBMS_SPD 程序包手动管理(更改或删除)SQL 计划指令,但不可以手动创建

SQL 计划指令。可以使用视图 DBA_SQL_PLAN_DIRECTIVES 和视图 DBA_SQL_PLAN_DIR_OBJECTS 监视

SQL 计划指令(参见图 15)。

图 15:监视基于从重新优化获得的信息自动创建的 SQL 计划指令

有两种类型的 SQL 计划指令行:DYNAMIC_SAMPLING 和 DYNAMIC_SAMPLING_RESULT。动态采样 类型告知

优化器,当它看到这个特定查询表达式(例如,同时使用 country_id、cust_city 和 cust_state_province 的筛选

谓词)时,应使用动态采样解决基数错估问题。

Page 14: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

12 | ORACLE DATABASE 12C 中的优化器

动态采样结果 类型自 Oracle Database 12c 第 2 版起提供,它表明动态采样查询结果存储在 SQL 计划指令信息

库(而不是 Oracle Database 12c 第 1 版使用的服务器结果缓存)中的位置。

图 16:自 Oracle Database 12c 第 2 版起动态采样结果存储在 SQL 计划指令信息库中

Oracle 可以使用 SQL 计划指令确定扩展统计4(特别是列组)是否缺少以及是否可解决基数错估问题。使用

SQL 指令后,优化器决定是否有可能通过列组更正基数错估。如果可以,则在下次对相应的表收集统计信息

时,数据库可以自动创建该列组。在 Oracle Database 12c 第 1 版中,该步骤“始终启用”,但自 Oracle

Database 12c 第 2 版起,由 DBMS_STATS 首选项 AUTO_STAT_EXTENSIONS 对其进行控制。注意,默认设

置为 OFF,因此,要启用自动列组创建,需要执行以下步骤:

EXEC DBMS_STATS.SET_GLOBAL_PREFS('AUTO_STAT_EXTENSIONS', 'ON')

如果可能,将使用扩展统计替代 SQL 计划指令(等式谓词、group by 等)。如果 SQL 计划指令不再需要,将

在 53 周之后自动清除。

4 有关扩展统计的更多信息,请参阅白皮书“了解 Oracle Database 12c 中的优化器统计”。请参见参考资料 1。

Page 15: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

13 | ORACLE DATABASE 12C 中的优化器

优化器统计

优化器统计信息是对数据库及其对象进行描述的数据的集合。优化器使用这些统计信息为每个 SQL 语句选择极

佳的执行计划。能够及时收集适当的统计信息对于在任何 Oracle 系统上维持可接受的性能至关重要。对于每个

新版本,Oracle 都致力于自动提供必要的统计信息。

这里只是概要介绍,要了解完整的详细信息,请参阅参考资料 1“了解 Oracle Database 12c 第 2 版中的优化器统计”。

新类型的直方图

直方图会告知优化器某列中数据的分布情况。默认情况下,优化器假设在列的非重复值间均匀分布行,并将计

算使用等式谓词的查询的基数,计算方法为用表中的总行数除以等式谓词使用的列中非重复值的数目。直方图

的存在改变了优化器确定基数估算使用的公式,支持优化器生成更准确的估算。自 Oracle 12c 第 1 版起,增加

了两种直方图,即高频率直方图 (top-frequency) 和混合直方图 (hybrid)。这两种直方图有助于优化器针对更难

对付的数据偏差改进基数估算。在 Oracle Database 12c 第 1 版之前,有两种类型的直方图 — 频率均衡直方图

(frequency balanced) 和高度平衡直方图 (height balanced)。

联机统计收集

创建索引时,Oracle 可在创建索引的过程中自动收集优化器统计信息,它在执行创建索引所需的全数据扫描和

排序时顺便收集统计信息(该技术自 Oracle Database 9i 起便已提供)。自 Oracle Database 12c 第 1 版起,

同样的技术现在也用于直接路径操作,如 create table as select (CTAS) 和插入空表的 insert as select (IAS) 操

作。数据加载操作过程中顺便完成统计收集工作,这意味着,无需执行额外的全数据扫描即可在加载数据后立

即提供统计信息。 收集统计信息花费的额外时间相比于单独的统计收集过程是很少的,而且这保证了从一开始

就有准确的统计信息随时可用。

增量统计

针对分区表的统计收集包含表级统计信息(全局统计信息)和(子)分区级统计信息的收集。如果以任何方式

对(子)分区中的数据进行了更改,或者如果添加或删除了分区,那么必须更新全局级统计信息以反映这些更

改,以便分区级统计信息与全局级统计信息之间是对应的。对于大型分区表,扫描整个表以重建准确全局级统

计信息的开销可能很高。由于这一原因,在 Oracle Database 11g 中引入了增量统计以解决该问题,即为表中

的每个分区创建摘要。使用这些数据结构,无需扫描整个表即可生成全局级统计信息,包括列基数等不可聚合

的统计信息。

增量统计和陈旧性 在 Oracle Database 11g 中,如果某表启用了增量统计,并且修改了其中一个分区的一行,则该分区的统计信息

被视为已陈旧,需要重新收集才能用来生成全局级统计信息。

在 Oracle Database 12c 中,可以使用一个新的称为 INCREMENTAL_STALENESS 的首选项来控制何时将

分 区 统 计 信 息 视 为 已 陈 旧 且 不 够 好 , 不 能 用 于 生 成 全 局 级 统 计 信 息 。 默 认 情 况 下 ,

INCREMENTAL_STALENESS 设置为 NULL,这意味着只要有一行更改就将分区级统计信息视为已陈旧(与

Oracle Database 11g 中的行为相同)。

Page 16: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

14 | ORACLE DATABASE 12C 中的优化器

或者,也可以将该首选项设置为 USE_STALE_PERCENT 或 USE_LOCKED_STATS。USE_STALE_PERCENT 表

示只要所更改行数(相应的分区或子分区中)的百分比低于首选项 STALE_PERCENTAGE 的值(默认值为

10%)就使用分区级统计信息。USE_LOCKED_STATS 表示,如果锁定某分区的统计信息,则将其用于生成全局

级统计信息,而不管统计信息自上次收集以来该分区中有多少行被更改。

增量统计和分区交换加载

分区的一个优势是能够通过使用交换分区命令快速轻松地加载数据,且对业务用户的影响极小。通过交换分区

命令,可将未分区表中的数据交换到分区表中的指定分区。该命令并不真正移动数据,而是更新数据字典,将

指针从分区交换到表,反之亦然。

在以前的版本中,无法在分区交换操作过程中生成非分区表的必要统计信息以支持增量统计,而是需要在执行

交换后对分区收集统计信息,以确保能够以增量方式维护全局统计信息。

在 Oracle Database 12c 中,可以在交换之前在非分区表上创建必要的统计信息(摘要),以便分区交换加载过

程中交换的统计信息可自动用于以增量方式维护全局统计信息。

更为紧凑的摘要

利用增量统计收集统计信息性能虽好,但是可能以摘要(存储在 SYSAUX 表空间中)占用大量磁盘存储为代

价。包含大量分区和许多列的表的摘要需要更多的存储空间,特别是非重复值数 (NDV) 较高的情况下尤为如

此。除了占用存储空间之外,维护超大型摘要还可能产生大量的性能开销。Oracle Database 12c 第 2 版引入了

一种新算法来收集和存储 NDV 信息,这种算法生成的摘要比以前要小的多,同时保持了与以前算法同等程度的

准确性。

并发统计

在 Oracle Database 11g 中,引入了并发统计收集。当设置了全局统计收集首选项 CONCURRENT 时,Oracle 会

利用 Oracle Job Scheduler 和 Advanced Queuing 组件同时为每个对象(表和/或分区)创建一个统计收集作业

并进行管理。

在 Oracle Database 12c 中,并发统计收集得到了增强,可更好地使用每个调度程序作业。如果表、分区或子分

区非常小或为空,数据库可能会自动将该对象以及其他小对象作为一个作业进行批处理,以降低作业维护的开

销。

自动列组检测

Oracle Database 11g 中引入了扩展统计。如果 SQL 语句中的谓词涉及到包含函数的列 (如

UPPER(LastName))或在筛选谓词、联接条件或 group-by 键中用到的来自同一个表的多个列,则可使用扩展

统计来帮助优化器提高这些 SQL 语句的基数估算的准确性。虽然扩展统计极其有用,但如果您对应用程序或数

据集不熟悉,可能很难了解应创建哪些扩展统计。

Page 17: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

15 | ORACLE DATABASE 12C 中的优化器

自动列组检测功能会自动根据给定负载确定表所需的列组。列组的检测和创建是一个简单的三步过程5。

DBMS_STATS 程序包中新的报告子程序 要在任何系统上维持可接受的性能,及时了解何时及如何收集统计信息是至关重要的。确定环境中当前正在执

行的统计收集操作以及统计方法的更改会如何影响系统可能困难且耗时。

在 Oracle Database 12c 中,DBMS_STATS 程序包中添加了新的报告子程序,可用于轻松监视当前正在执行的

统计收集活动以及对这些操作的参数设置的更改将产生的影响。这些 DBMS_STATS 子程序是

REPORT_STATS_OPERATIONS、REPORT_SINGLE_STATS_OPERATION 和

REPORT_GATHER_*_STATS。

图 17 显示了执行 REPORT_STATS_OPERATIONS 函数生成的输出示例。该报告显示了有关在指定时段内发

生的统计收集操作的详细信息。它详细列出了每个操作的发生时间、操作状态以及所涉及的对象数目,该报告

可以文本或 HTML 格式显示。

图 17:报告统计操作

5 有关创建列组的信息,请参见白皮书“了解 Oracle Database 12c 中的优化器统计”。

Page 18: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

16 | ORACLE DATABASE 12C 中的优化器

优化器统计顾问

众所周知,劣质的统计信息会带来查询性能问题。识别陈旧、过时的统计信息以及缺少的统计信息相当容易,

但识别劣质统计信息则难得多:例如,表与索引之间的不一致性、主键/外键的关系等等。

统计信息不一致通常是未遵循推荐方法造成的,但由于许多原因,严格遵守这些推荐方法并不永远都是一件

容易的事情。例如, Oracle 不断增强统计收集特性,但升级后可能会忽视增强功能(建议使用

AUTO_SAMPLE_SIZE 而非固定百分比就是一个很好的示例)。DBA 可能会使用原有脚本手动收集统计信

息,因而不愿意改变这些“成熟”的过程。有时,可能会忽视统计收集,可能在批处理过程中未维护统计信息,

可能会有批处理时窗内时间不够的感觉。还有许多“继承的”系统,在这些系统中,没有人了解维护统计信息所

用的脚本。

为解决这些问题,Oracle Database 12.2 新增了一个特性,称为优化器统计顾问。该顾问程序的目标是分析统

计信息的收集方式,验证已收集的统计信息的质量,以及检查自动统计收集的状态(例如,检查成功完成状

态)。为此,它根据一组规则 查看数据字典。如果发现不符合规则的例外情况,可能生成发现结果,这些结果

进而可能产生具体的建议。顾问程序将生成一个报告,其中列出发现结果(包含相关的“违背的”规则),然后列

出具体的建议 以纠正这种状况。最后,可以使用一组操作 实施这些建议。操作能以 SQL 脚本的形式输出,也

可以自动实施。

有关完整的详细信息,请参见参考资料 2“在 Oracle Database 12c 中收集优化器统计信息的实践”。

Page 19: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

17 | ORACLE DATABASE 12C 中的优化器

新的和增强的优化技术

Oracle 在查询优化期间使用各种高级技术转换 SQL 语句。查询优化阶段的目的是将原始的 SQL 语句转换为能

够得到更高效处理的语义等效的 SQL 语句。在 Oracle Database 12c 中,引入了多个新的查询优化技术。

Oracle Database12c 第 1 版及更高版本

部分联接评估 部分联接评估是在联接顺序生成过程中执行的一项优化技术。该技术的目标是避免生成重复的行,否则需要在

计划的后期阶段使用 distinct 运算符删除这些重复行。通过在计划的早期阶段将 distinct 运算符替换为内部联接

或半联接,将减少该步骤产生的行数。这将提高计划的整体性能,因为后续步骤只需对一组减少的行进行操

作。该优化可应用于以下类型的查询块: MAX()、MIN()、SUM (DISTINCT)、AVG (DISTINCT)、COUNT

(DISTINCT)、DISTINCT;UNION、MINUS、INTERSECT 运算符的分支;[NOT] EXISTS 子查询等。

我们来看看以下 DISTINCT 查询:

在 Oracle Database 11g 中,ORDERS 与 CUSTOMERS 之间的联接是散列联接,必须对该散列联接进行完全评

估后,才可完成消除任何重复行的唯一性排序。

图 18:Oracle Database 11g 计划要求通过唯一排序消除重复项来完成 ORDERS 与 CUSTOMERS 之间的联接

使用部分联接评估,ORDERS 与 CUSTOMERS 之间的联接将转换为半联接,这意味着,只要在

CUSTOMERS 表中找到 CUSTOMER_ID 的一个匹配项,查询就移至下一个 CUSTOMER_ID。通过将散列联

接转换为半联接,将极大减少传递到 HASH UNIQUE 的行数,因为相同联接键的重复项已被消除。转换后的

SQL 的计划如图 19 所示。

图 19:Oracle Database 12c 计划显示 ORDERS 与 CUSTOMERS 之间使用半联接,从而无重复项生成。

Page 20: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

18 | ORACLE DATABASE 12C 中的优化器

Null 接受半联接

应用程序开发人员向包含 EXISTS 子查询的 SQL 语句中添加 IS NULL 谓词的情况并不少见。由于 EXISTS 子

查询形成的半联接会删除具有 null 值的行(如同内部联接一样),因此又添加了 IS NULL 谓词。我们来看看

以下查询:

这里假设 s.cust_id 列可能有 null 值,我们希望返回这些行。在 Oracle Database12c 之前,无法将 EXISTS 子

查询展开,因为它出现在使用 IS NULL 谓词的 OR 谓词(分离)中。无法对子查询展开会导致生成性能欠佳

的计划,其中,子查询作为 SALES 与 PRODUCTS 表之间的联接后的筛选器进行应用。

图 20:Oracle Database 11g 计划显示 EXISTS 子查询作为联接后的筛选器进行应用。

在 Oracle Database 12c 中,引入了一种新类型的半联接,我们称之为 null 接受半联接。这种新联接扩展了半

联接算法,可检查联接左侧的表的联接列中是否有 null 值。在该示例中,将对 s.cust_id 进行该检查。如果该列

确实包含 null 值,则返回 SALES 表中的相应行,否则执行半联接以确定行是否满足联接条件。null 接受半联接

计划如下面的图 21 所示。

图 21:Oracle Database 12c 计划显示已对 EXISTS 子查询展开,customers 与 sales 之间使用 null 接受半联接。

标量子查询展开

标量子查询是出现在 SQL 语句的 SELECT 子句中的一种子查询。无法对标量子查询展开,因此需要针对外部查

询产生的每一行计算相关的标量子查询(引用子查询之外的列的标量子查询)。我们来看看以下查询:

Page 21: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

19 | ORACLE DATABASE 12C 中的优化器

在 Oracle Database 11g 中,对于 CUST_CREDIT_LIMIT 大于 50,000 的 CUSTOMERS 表中的每一行,必须对

SALES 表执行标量子查询。SALES 表是大型表,对其进行多次扫描将非常占用资源。

图 22:Oracle Database 11g 计划显示必须针对从 customers 表返回的每一行计算标量子查询。

对标量子查询展开并将其转换为联接后,无需再针对外部查询中的每一行计算标量子查询。在 Oracle Database

12c 中,可以对标量子查询展开,在该示例中,将 SALES 表的标量子查询转换为 group-by 视图。group-by 视

图保证返回单行,这一点与子查询一样。还将外联接添加到该查询中,以确保即使视图结果为 NULL 也将返回

CUSTOMERS 表中的行。转换的查询将如下所示:

图 23:Oracle Database 12c 计划显示已使用外联接和 group-by 视图对标量子查询展开。 多表左外联接

在 Oracle Database12c 之前,若外联接的左侧有多个表则是非法的,会生成 ORA-01417 错误。

图 24:Oracle Database 11g 不支持多表左外联接。

执行此类查询的唯一方法是将其转换为 ANSI 语法。但是,这种 ANSI 语法的实现需要使用侧视图 6。Oracle 无

法合并侧视图,因此优化器的计划选择从联接顺序和联接方法来讲很有限,这可能会生成性能欠佳的计划。

6 侧视图是引用位于视图之外的表中的列的一种视图。

Page 22: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

20 | ORACLE DATABASE 12C 中的优化器

图 25:ANSI 语法生成包含侧视图的计划,这些视图无法合并,因此限制了联接顺序

在 Oracle Database 12c 中,现在支持在 Oracle 语法 (+) 中指定多表左外联接。还可以合并外联接左侧的多表

视图。合并视图的能力使得可以考虑多个联接顺序和联接方法,从而能够选择更优的计划。

图 26:新的多表外联接支持允许视图合并以及选择更优的计划

Group-by 和聚合消除

许多应用程序都包含这样一种形式的查询,即一个 group-by 查询块中有一个属于 group- by 视图的表。在某些

条件下,可以消除两个查询块的 group-by 子句和聚合函数。这样得到的查询更简单,包含更少的 group-by 子

句和聚合函数。

分组和聚合操作开销较大,因此消除它们可能产生更优的执行计划。此外,这些类型的消除会触发视图合并,

这进而可能引发应用其他优化。

我们来看看以下示例,转换外部查询以便包含一个 group-by 操作而不是两个:

Page 23: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

21 | ORACLE DATABASE 12C 中的优化器

图 27:group-by 和聚合消除示例

相应的 SQL 执行计划将如下所示:

图 28:进行转换和不进行转换的 SQL 执行计划

Oracle Database12c 第 2 版及更高版本

基于成本的 OR 扩展转换 基于成本 的 OR 扩展转换是 Oracle Database 12.2 中的一项新特性。该转换显著增强了 12.2 之前的“OR 扩

展”,OR 扩展从 Oracle Database 9i 开始就已提供。

OR 扩展转换可用于优化包含 OR 子句(在技术上称为析取)的查询。OR 扩展的基本理念是将包含析取的查询

转换为具有两个或多个分支的 UNION ALL 查询的形式。为此,将析取拆分为其各个组成元素,并将每个组成元

素与 UNION ALL 查询的一个分支相关联。例如:

图 29:基于成本的 OR 扩展转换示例

OR 扩展可实现更高效的访问路径(索引访问、分区修剪),并且有时会开启备选联接方法。Oracle Database

12.2 之前,在 SQL 执行计划中使用 CONCATENATION 操作指明转换,该操作在语义上等同于 UNION-ALL 操

Page 24: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

22 | ORACLE DATABASE 12C 中的优化器

作符。但自 Oracle Database 12.2 起,将显示 UNION-ALL 操作,以反映为改进转换而做的基本更改。特别

是,有更多的机会在 UNION ALL 分支上应用其他转换(因为用于核算备选访问方法开销的算法已得到了改

进)。每个 UNION-ALL 分支均可并行执行(而使用 CONCATENATION 操作符则不然),因此有望利用并行

执行提升决策支持应用程序的性能。

我们来看看下面的 SQL 执行计划,对 Oracle Database 12.1 和 12.2 进行比较:

图 30:Oracle Database 12.1 与 12.2 对比情况

请注意 CONCATENATION 是如何替换为 UNION-ALL 的,在该示例中,使用另一个转换消除了

T_10K_HUNDRED 表的另一次扫描。

子查询消除

许多应用程序中都有这样的查询,在其 WHERE 子句中包含单表子查询。在以下条件下,可以通过消除子查询

来优化这种查询:

» 子查询包含单个表。

» 该表也存在于外部查询中。

» 连接/关联谓词中涉及的列是相同的。

转换将从 SQL 执行计划中消除表访问路径。例如:

图 31:子查询消除示例

Page 25: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

23 | ORACLE DATABASE 12C 中的优化器

增强的联接消除

如果使用和不使用联接的查询结果是相同的,那么可以消除该联接。这是这种依赖主键/唯一键和外键约束的转

换背后的原则。Oracle Database 12.2 之前,只可以对单列键约束应用该转换。自 Oracle Database 12.2 起,

在更多情况下都支持该转换,特别是现在在一定的条件下可以对多列键约束和可延迟约束使用该转换。

该转换迭代式应用,以便联接消除可以进一步触发联接消除。 图 32 展示了该转换将产生的影响。在该示例中,消除了对 DEPATMENTS 表的访问:

图 32:联接消除示例 近似查询处理

Oracle Database 12c 新增了一个经过优化的 SQL 函数 — APPROX_COUNT_DISTINCT(),该函数可提供近似

的 count distinct 聚合。其对大量数据的处理速度比精确聚合快得多,尤其在数据集具有大量非重复值的情况下

更为如此,而且与精确结果的偏差可以忽略不计。

需要统计非重复值数量是当今数据分析的一个常见操作。通过将处理时间和资源消耗优化数个数量级同时提供

近乎精确的结果,不仅可以加快任何现有处理的速度,而且可以实现更高水平的分析洞察。

Oracle Database 12.2 对该功能进行了扩展,其中包括:

» 百分位数和中位数的近似版本(APPROXIMATE_PERCENTILE 和 APPROXIMATE_MEDIAN)。

» 物化视图支持和查询重写。

» 通过设置会话级或系统级数据库参数,无需进行任何代码更改即可使用近似 SQL 函数。 有关完整的详细信息,请参见参考资料 3“Database 12c 第 2 版中的分析 SQL”。

Page 26: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

24 | ORACLE DATABASE 12C 中的优化器

SQL 计划管理

对于需要保证 SQL 执行计划稳定性的关键应用程序来说,SQL 计划管理 (SPM) 是要考虑的一个特别重要的特

性。此外,对于要以可控的方式将执行计划从一个优化器版本发展到另一个版本的任何数据库升级,SPM 也是

十分重要的,用于管理执行计划和确保仅使用已知或经过验证的计划。

在 Oracle Database 12c 中,对 SQL 计划管理进行了许多增强:

自动计划发展

增强的自动捕获

从 AWR 信息库捕获

如需详细了解这些特性,请参见参考资料 4“Oracle Database 12c 第 2 版中的 SQL 计划管理”。

初始化参数

Oracle Database 12c 中有一些新的初始化参数可用于管理优化器及其新特性。

以下是有关这些新参数的详细信息。

OPTIMIZER_ADAPTIVE_FEATURES(在 Oracle Database 12c 第 1 版中引入,在 Oracle Database 12c 第 2

版中废弃)

该 参 数 在 Oracle Database 12c 第 2 版 中 废 弃 , 被 OPTIMIZER_ADAPTIVE_PLANS 和

OPTIMIZER_ADAPTIVE_STATISTICS(下面将作介绍)所取代,从而为客户提供对优化器自适应特性的更细

粒度的控制机制。

在 Oracle Database 12c 第 1 版中,自适应查询优化功能的使用(包括自适应联接以及 SQL 计划指令的创建和

使用),都可通过 OPTIMIZER_ADAPTIVE_FEATURES 参数进行控制。

如果 OPTIMIZER_ADAPTIVE_FEATURES 设置为 TRUE,那么当 OPTIMIZER_FEATURES_ENABLE 设为

12.1.0.1 或更高时,将使用所有自适应查询优化特性。

如果 OPTIMIZER_ADAPTIVE_FEATURES 设置为 FALSE,将不使用任何自适应查询优化特性。

Page 27: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

25 | ORACLE DATABASE 12C 中的优化器

OPTIMIZER_ADAPTIVE_PLANS(Oracle Database 12c 第 2 版中的新参数,取代

OPTIMIZER_ADAPTIVE_FEATURES)

自适应计划功能的使用通过 OPTIMIZER_ADAPTIVE_PLANS 参数进行控制。该参数的默认值为 TRUE。

通过该参数控制的特性有:

» 自适应联接

» 位图修剪

» 并行分布方法 如果 OPTIMIZER_ADAPTIVE_PLANS 设置为 TRUE,那么当 OPTIMIZER_FEATURES_ENABLE 设为

12.1.0.1 或更高时,将使用自适应计划特性。

如果 OPTIMIZER_ADAPTIVE_PLANS 设置为 FALSE,将不使用自适应计划特性。

OPTIMIZER_ADAPTIVE_STATISTICS(Oracle Database 12c 第 2 版中的新参数,

取代 OPTIMIZER_ADAPTIVE_FEATURES)

自适应统计功能的使用通过 OPTIMIZER_ADAPTIVE_STATISTICS 参数进行控制。

该参数的默认值为 FALSE。通过该参数控制的特性有:

» 使用 SQL 计划指令 (SPD) 以优化查询

» 联接的统计信息反馈

» 并行查询的自适应动态采样

» 性能反馈 如果 OPTIMIZER_ADAPTIVE_STATISTICS 设置为 TRUE,那么当 OPTIMIZER_FEATURES_ENABLE 设为

12.1.0.1 或更高时,将使用自适应统计特性。

如果 OPTIMIZER_ADAPTIVE_STATISTICS 设置为 FALSE,将不使用自适应统计特性。SQL 计划指令将继

续由优化器进行创建,但它们不能用于通过动态采样完善 SQL 执行计划。

将 OPTIMIZER_ADAPTIVE_STATISTICS 设置为 false 会保留在 Oracle Database 11g 中引入的统计信息

反馈功能(在 Oracle Database 11g 中,该特性称为基数反馈)。

Page 28: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

26 | ORACLE DATABASE 12C 中的优化器

OPTIMIZER_ADAPTIVE_REPORTING_ONLY

该参数自 Oracle Database 12c 第 1 版起开始提供。为更好地了解有多少个 SQL 语句将受新的自适应计划的影响,

可以在报告模式下启用自适应计划,为此只需将 OPTIMIZER_ADAPTIVE_REPORTING_ONLY 设为 TRUE 即可

(默认值为 FALSE)。在该模式下,将收集启用自适应联接方法所需的信息,但不执行更改计划的任何操作。这意

味着,将始终使用默认计划,但会收集在非报告模式下计划调整情况的相关信息。当该参数设置为 TRUE 时,优化

器采用的决策通过使用 DBMS_XPLAN.DISPLAY_CURSOR 中的 REPORT 格式化参数呈现出来。图 33 显示了报

告的呈现示例,为简洁起见,编辑删除了默认的 NESTED LOOPS 计划:

图 33:显示自适应计划报告

通常这更大的用处在于,检查如果自适应计划启用将会影响多少个 SQL 执行计划。例如,将此参数设置为

TRUE 后,可以检查游标缓存中的游标,如下所示:

图 34:查看游标缓存中 SQL 语句的自适应计划报告

Page 29: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

27 | ORACLE DATABASE 12C 中的优化器

OPTIMIZER_DYNAMIC_SAMPLING

虽然参数 OPTIMIZER_DYNAMIC_SAMPLING 不是新参数,但它确实有一个新的级别 — 11,用于控制动态统

计的创建。当设置为级别 11 时,优化器将自动确定哪些语句将受益于动态统计,即使所有对象都具有统计信息

也是如此。

总结

优化器被认为是 Oracle 数据库中极其令人着迷的组件之一,因为它极为复杂。优化器的作用是确定每个 SQL

语句的高效执行计划。它根据查询结构、有关数据的可用统计信息以及所有相关的优化器和执行特性做出这些

决定。

在 Oracle Database 12c 中,由于引入了新的查询优化自适应方法以及对优化器可用统计信息的增强,优化器实

现了巨大的飞跃。

新的查询优化自适应方法使优化器能够对执行计划进行运行时调整并发现额外信息以帮助生成更详细的统计信

息。将这些信息与现有统计信息结合利用,能够使优化器对环境有更多的了解,从而使其每次都选择极佳的执

行计划。

同以往一样,我们希望通过详细介绍这一版本中对优化器和统计信息所做的更改,揭开它们的神秘面纱,而这

一知识将会使您的升级过程更加顺利,先知先戒备,凡事预则立!

Page 30: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

28 | ORACLE DATABASE 12C 中的优化器

参考资料

撰写本文时,以下针对 Oracle Database 12c 第 2 版的白皮书尚未发布。这些白皮书不久将发布,但届时也将

涵盖 Oracle Database 12c 第 1 版的内容。

1. 了解 Oracle Database 12c 第 2 版中的优化器统计

http://www.oracle.com/technetwork/database/bi-datawarehousing/twp-statistics-concepts-12c-

1963871.pdf

2. 在 Oracle Database 12c 第 2 版中收集优化器统计信息的实践

http://www.oracle.com/technetwork/database/bi-datawarehousing/twp-bp-for-stats-gather-12c-1967354.pdf

3. Database 12c 第 2 版中的分析 SQL

http://www.oracle.com/technetwork/database/bi-datawarehousing/wp-sqlnaturallanguageanalysis-

2431343.pdf

4. Oracle Database 12c 第 2 版中的 SQL 计划管理

http://www.oracle.com/technetwork/database/bi-datawarehousing/twp-sql-plan-mgmt-12c-1963237.pdf

5. Oracle Database 12c 并行执行基础

http://www.oracle.com/technetwork/database/bi-datawarehousing/twp-parallel-execution-

fundamentals-133639.pdf

Page 31: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

甲骨文(中国)软件系统有限公司

北京远洋光华中心办公室

地址:北京市朝阳区景华南街5号远洋光华中心C座21层

邮编:100020

电话:(86.10) 6535-6688

传真:(86.10) 6515-1015

北京汉威办公室

地址:北京市朝阳区光华路7号汉威大厦10层1003-1005单元

邮编:100004

电话:(86.10) 6535-6688

传真:(86.10) 6561-3235

北京甲骨文大厦

地址:北京市海淀区中关村软件园24号楼甲骨文大厦

邮编:100193

电话:(86.10) 6106-6000

传真:(86.10) 6106-5000

北京国际软件大厦办公室

地址:北京市海淀区中关村软件园9号楼国际软件大厦二区308单元

邮编:100193

电话:(86.10) 8279-8400

传真:(86.10) 8279-8686

北京孵化器办公室

地址:北京市海淀区中关村软件园孵化器2号楼A座一层

邮编:100193

电话:(86.10) 8278-6000

传真:(86.10) 8282-6401

上海名人商业大厦办公室

地址:上海市黄浦区天津路155号名人商业大厦12层

邮编:200001

电话:(86.21) 2302-3000

传真:(86.21) 6340-6055

上海腾飞浦汇大厦办公室

地址:上海市黄浦区福州路318号腾飞浦汇大厦508-509室

邮编:200001

电话:(86.21) 2302-3000

传真:(86.21) 6391-2366

上海创智天地10号楼办公室

地址:上海市杨浦区凇沪路290号创智天地10号楼512-516单元

邮编:200433

电话:(86.21) 6095-2500

传真:(86.21) 6107-5108

上海创智天地11号楼办公室

地址:上海市杨浦区淞沪路303号创智天地科教广场3期11号楼7楼

邮编:200433

电话:(86.21) 6072-6200

传真:(86.21) 6082-1960

上海新思大厦办公室

地址:上海市漕河泾开发区宜山路926号新思大厦11层

邮编:200233

电话:(86.21) 6057-9100

传真:(86.21) 6083-5350

广州国际金融广场办公室

地址:广州市天河区珠江新城华夏路8号合景国际金融广场18楼

邮编:510623

电话:(86.20) 8513-2000

传真:(86.20) 8513-2380

成都中海国际中心办公室

地址:成都市高新区交子大道177号中海国际中心7楼B座02-06单元

邮编:610041

电话:(86.28) 8530-8600

传真:(86.28) 8530-8699

深圳飞亚达科技大厦办公室

地址:深圳市南山区高新南一道飞亚达科技大厦16层

邮编:518057

电话:(86.755) 8396-5000

传真:(86.591) 8601-3837

深圳德赛科技大厦办公室

地址:深圳市南山区高新南一道德赛科技大厦8层0801-0803单元

邮编:518057

电话:(86.755) 8660-7100

传真:(86.755) 2167-1299

大连办公室

地址:大连软件园东路23号大连软件园15号楼502

邮编:116023

电话:(86.411) 8465-6000

传真:(86.755) 8465-6499

苏州办公室

地址:苏州工业园区星湖街328号苏州国际科技园5期11幢1001室

邮编:215123

电话:(86.512) 8666-5000

传真:(86.512) 8187-7838

沈阳办公室

地址:沈阳市和平区青年大街390号皇朝万鑫国际大厦A座39层3901&3911室

邮编:110003

电话:(86.24) 8393-8700

传真:(86.24) 2353-0585

济南办公室

地址:济南市泺源大街150号中信广场11层1113单元

邮编:250011

电话:(86.531) 6861-1900

传真:(86.531) 8518-1133

南京办公室

地址:南京市玄武区洪武北路55号置地广场19层1911室

邮编:210018

电话:(86.25) 8579-7500

传真:(86.25) 8476-5226

西安办公室

地址:西安市高新区科技二路72号西安软件园零壹广场主楼1401室

邮编:710075

电话:(86.29) 8834-3400

传真:(86.25) 8833-9829

Page 32: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

重庆办公室

地址:重庆市渝中区邹容路68号大都会商厦1611室

邮编:400010

电话:(86.23) 6037-5600

传真:(86.23) 6370-8700

杭州办公室

地址:杭州市西湖区杭大路15号嘉华国际商务中心810&811室

邮编:310007

电话:(86.571) 8168-3600

传真:(86.571) 8717-5299

福州办公室

地址:福州市五四路158号环球广场1601室

邮编:350003

电话:(86.591) 8621-5050

传真:(86.591) 8801-0330

南昌办公室

地址:江西省南昌市西湖区沿江中大道258号

皇冠商务广场10楼1009室

邮编:330025

电话:(86.791) 8612-1000

传真:(86.791) 8657-7693

呼和浩特办公室

地址:内蒙古自治区呼和浩特市新城区迎宾北路7号

大唐金座19层北侧1902-1904室

邮编:010051

电话:(86.471) 3941-600

传真:(86.471) 5100-535

郑州办公室

地址:河南省郑州市中原区中原中路220号

裕达国际贸易中心A座2015室

邮编:450007

电话:(86.371) 6755-9500

传真:(86.371) 6797-2085

武汉办公室

地址:武汉市江岸区中山大道1628号

武汉天地企业中心5号大厦23层2301单元

邮编:430010

电话:(86.27) 8221-2168

传真:(86.27) 8221-2168

长沙办公室

地址:长沙市芙蓉区韶山北路159号通程国际大酒店1311-1313室

邮编:410011

电话:(86.731) 8977-4100

传真:(86.731) 8425-9601

石家庄办公室

地址:石家庄市中山东路303号石家庄世贸广场酒店14层1402室

邮编:050011

电话:(86.311) 6670-8080

传真:(86.311) 8667-0618

昆明办公室

地址:昆明市三市街六号柏联广场写字楼11层1103A室

邮编:650021

电话:(86.871) 6402-4600

传真:(86.871) 6361-4946

合肥办公室

地址:安徽省合肥市蜀山区政务新区怀宁路1639号平安大厦18层1801室

邮编:230022

电话:(86.551) 6595-8200

传真:(86.551) 6371-3182

广西办公室

地址:广西壮族自治区南宁市青秀区民族大道146号三祺广场18楼1837室

邮编:530022

电话:(86.771) 557-6068

传真:(86.771) 557-6038

Page 33: Oracle Database 12c 第 2 版中的优化器 · 优化器能够通过预先为计划的各部分确定多个子计划来动态调整联接方法。例如,在图 2 中,用于联接

公司网址:http://www.oracle.com(英文)

中文网址:http://www.oracle.com/cn(简体中文)

销售中心:800-810-0161

售后服务热线:800-810-0366

培训服务热线:800-810-9931

欢迎访问:

http://www.oracle.com(英文)

http://www.oracle.com/cn(简体中文)

版权 © 2017 归 Oracle 公司所有。未经允许,不得以任

何形式和手段复制和使用。

本文的宗旨只是提供相关信息,其内容如有变动,恕不另

行通知。Oracle 公司对本文内容的准确性不提供任何保证,

也不做任何口头或法律形式的其他保证或条件,包括关于

适销性或符合特定用途的所有默示保证和条件。本公司特

别声明对本文档不承担任何义务,而且本文档也不能构成

任何直接或间接的合同责任。未经 Oracle 公司事先书面许

可,严禁将此文档为了任何目的,以任何形式或手段(无论

是电子的还是机械的)进行复制或传播。

Oracle 是 Oracle 公司和/或其分公司的注册商标。其他名

字均可能是各相应公司的商标。