存储大纲迁移是用户启动的将存储大纲转换为SQL计划基准的过程。SQL计划基准是一组经证明可提供最佳性能的计划。
注意:
从Oracle Database 12c开始,不赞成使用存储的大纲。有关替代方法,请参见“将存储的大纲迁移到SQL计划基准”。
本章介绍与存储大纲迁移有关的概念和任务。本章包含以下主题:
- 关于存储概要迁移 一个存储概要是一个SQL语句一组的提示。
- 准备存储大纲迁移 目标是准备确定哪些存储大纲适合迁移。
- 迁移大纲以利用SQL计划管理功能 您可以将存储的大纲迁移到SQL计划基线。
- 迁移大纲以保留存储的大纲行为 您可以将存储的大纲迁移到SQL计划基线,并通过创建固定的计划基线来保留存储的大纲的原始行为。
- 在存储大纲迁移 之后执行后续任务将大纲迁移到SQL计划基线之后,您必须执行一些后续工作。
29.1关于存储的大纲迁移
一个存储概要是一组用于提示SQL语句。
这些提示指导优化器为语句选择特定的计划。存储的大纲是用于提供计划稳定性的传统技术。
本节包含以下主题:
- 迁移存储大纲的目的 如果您依靠存储大纲来维护计划的稳定性并防止性能下降,则可以安全地从存储的大纲迁移到SQL计划基线。迁移后,您可以维护相同的计划稳定性,同时受益于SQL计划管理框架提供的功能。
- 存储大纲迁移的工作方式 存储大纲迁移是一个由用户启动的过程,该过程分为多个阶段。
- 用于存储大纲迁移的用户界面 可以使用该
DBMS_SPM程序包执行存储大纲迁移。 - 存储大纲迁移中 的基本步骤基本过程是准备,迁移然后清理。
29.1.1存储大纲迁移的目的
如果您依靠存储的大纲来维护计划的稳定性并防止性能下降,则可以安全地从存储的大纲迁移到SQL计划基准。迁移后,您可以维护相同的计划稳定性,同时受益于SQL计划管理框架提供的功能。
存储的轮廓具有以下缺点:
- 存储的轮廓不能随时间自动演变。因此,存储的轮廓在创建时可能是最佳的,但是在数据库更改后成为次优的计划,从而导致性能下降。
- 存储大纲中的提示可能会变得无效,就像在删除的索引上显示索引提示一样。在这种情况下,数据库仍然使用大纲,但排除无效提示,从而生成的计划通常比原始计划或优化器生成的当前最佳成本计划差。
- 对于SQL语句,优化器只能选择在存储的大纲中当前指定类别中定义的计划。即使优化器提高了性能,也无法从其他类别或当前基于成本的计划中存储的大纲中进行选择。
- 存储的轮廓是一种响应式调优技术,这意味着您仅在出现性能问题后才使用存储的轮廓来解决它。例如,您可以实现一个存储的大纲,以纠正成为高负载的SQL语句的计划。在这种情况下,您使用存储的大纲而不是在语句变为高负荷之前主动对其进行调整。
存储的大纲迁移PL / SQL API可通过以下方式帮助解决上述问题:
- SQL计划基准使优化程序可以使用相同的最佳计划,并允许该计划随时间而发展。
对于指定的SQL语句,可以在验证新计划不会导致性能下降之后将其添加为SQL计划基线。
- SQL计划基准可防止由于无效提示而导致计划无法重现。
如果存储在计划基准中的提示变得无效,则优化器可能无法复制该计划。在这种情况下,优化器选择替代的可重复计划基准或由优化器生成的当前最佳成本计划。
- 对于特定的SQL语句,数据库可以维护多个计划基准。
优化器可以从一组针对特定SQL语句的最佳计划中进行选择,而不必像存储大纲所要求的那样限于每个类别的单个计划。
29.1.2存储大纲迁移的工作方式
存储大纲迁移是一个由用户启动的过程,它涉及多个阶段。
本节说明数据库如何将存储的大纲迁移到SQL计划基线。此信息对于执行迁移已存储轮廓的任务很重要。
本节包含以下主题:
29.1.2.1存储大纲迁移的阶段
要迁移存储的轮廓,请指定存储轮廓。然后,数据库创建并更新SQL计划基准。
图29-1存储大纲迁移的阶段
迁移过程分为以下几个阶段:
- 用户调用一个函数,该函数指定要迁移的轮廓。
- 数据库按如下方式处理大纲:
- 数据库在计划基线所需的大纲中复制信息。
数据库直接复制它或根据大纲中的信息进行计算。例如,SQL语句的文本存在于两个模式中,因此数据库可以将文本从大纲复制到基线。
- 数据库重新解析提示以获得不在大纲中的信息。
计划哈希值和计划成本无法从大纲中的现有信息中得出,因此有必要重新解析提示。
- 数据库创建基线。
- 数据库在计划基线所需的大纲中复制信息。
- 当数据库第一次选择SQL计划基线执行SQL语句时,它将获得丢失的信息。
编译环境和执行统计信息仅在执行期间在分析和编译计划基准时可用。
仅在完成前面的阶段后,迁移才完成。
29.1.2.2大纲类别和基准模块
大纲是一组提示,而SQL计划基线是一组计划。
因为它们是不同的技术,所以轮廓的某些功能无法准确地映射到基线的功能。例如,单个SQL语句可以具有多个大纲,每个大纲都在不同的大纲类别中,但是当前存在的唯一基线类别是DEFAULT。
大纲的类别的等效项是SQL计划基线的模块。表29-1说明了大纲类别如何映射到模块。
表29-1概述类别
| 概念 | 描述 | 默认值 |
|---|---|---|
大纲类别 | 为一组存储的轮廓指定用户定义的分组。 您可以使用类别来维护SQL语句的不同存储大纲。例如,单个语句可以在 每个SQL语句可以具有一个或多个存储的大纲。每个存储的轮廓都在一个且只有一个轮廓类别中。一条语句可以在不同类别中具有多个存储的大纲,但是每个语句的每个类别仅存在一个存储的大纲。 在迁移期间,数据库将每个大纲类别映射到SQL计划基准模块。 |
|
基准模块 | 指定正在执行的高级功能。 SQL计划基准可以属于一个且只能属于一个模块。 | 将大纲迁移到SQL计划基线之后,模块名称默认为大纲类别名称。 |
基准类别 | 仅存在一个SQL计划基准类别。此类别名为 一条语句在 |
|
将存储的大纲迁移到SQL计划基线时,Oracle数据库将每个大纲类别映射到具有相同名称的SQL计划基线模块。如下图所示,大纲类别OLTP已映射到基线模块OLTP。迁移后,DEFAULT是一个超级类别,其中包含所有SQL计划基准。
图29-2默认类别
29.1.3用于存储大纲迁移的用户界面
您可以使用该DBMS_SPM程序包执行存储的大纲迁移。
表29-2与存储的大纲迁移有关的DBMS_SPM函数
| DBMS_SPM函数 | 描述 |
|---|---|
| 迁移现有的存储轮廓以计划基线。 使用以下两种格式之一:
|
| 更改单个计划或与SQL语句关联的所有计划的属性。 |
| 删除已迁移到SQL计划基线的存储大纲。 该函数查找 |
您可以使用初始化和会话参数来控制存储的大纲和计划基线行为。表29-3说明了相关参数。有关这些参数设置如何交互的说明,请参见表29-5和表29-6。
表29-3与存储的大纲迁移相关的参数
| 初始化或会话参数 | 描述 | 参数类型 |
|---|---|---|
| 确定Oracle数据库是否为会话期间提交的每个查询自动创建并存储大纲。 | 初始化参数 |
| 启用或禁用可重复SQL语句的自动识别以及这些语句的SQL计划基线的生成。 | 初始化参数 |
| 启用或禁用对存储在“ SQL管理基础”中的SQL计划基准的使用。 | 初始化参数 |
| 确定优化器是否使用存储的轮廓来生成执行计划。 注意:这是一个会话参数,而不是初始化参数。 | 届会 |
您可以使用数据库视图来访问与存储的大纲迁移有关的信息。表29-4描述了以下主要视图。
表29-4与存储的大纲迁移有关的视图
| 视图 | 描述 |
|---|---|
| 描述数据库中所有存储的轮廓。 该 |
| 显示有关当前为特定SQL语句创建的SQL计划基准的信息。 该 |
也可以看看:
- Oracle Database PL / SQL软件包和类型参考以了解该
DBMS_SPM软件包 - Oracle数据库参考,了解
CREATE_STORED_OUTLINES初始化参数
29.1.4存储大纲迁移中的基本步骤
基本过程是准备,迁移然后清理。
基本步骤如下:
- 准备存储的大纲迁移。
查看迁移先决条件,并确定您希望迁移后的计划基准如何运行。
请参阅“ 为存储的大纲迁移做准备 ”。
- 执行以下任务之一:
- 迁移到基线以使用SQL计划管理功能。
请参见“ 迁移大纲以利用SQL计划管理功能 ”。
- 迁移到基线,同时精确保留所存储轮廓的行为。
请参见“ 迁移轮廓以保留存储的轮廓行为 ”。
- 迁移到基线以使用SQL计划管理功能。
- 执行迁移后确认和清理。
请参阅“ 在存储大纲迁移后执行后续任务 ”。




