暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 19C 关于存储的大纲迁移

原创 Asher.HU 2021-02-04
784

存储大纲迁移是用户启动的将存储大纲转换为SQL计划基准的过程。SQL计划基准是一组经证明可提供最佳性能的计划。

注意:

Oracle Database 12c开始,不赞成使用存储的大纲。有关替代方法,请参见“将存储的大纲迁移到SQL计划基准

本章介绍与存储大纲迁移有关的概念和任务。本章包含以下主题:

 

29.1关于存储的大纲迁移

一个存储概要是一组用于提示SQL语句。

这些提示指导优化器为语句选择特定的计划。存储的大纲是用于提供计划稳定性的传统技术。

本节包含以下主题:

 

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存储大纲迁移的阶段



迁移过程分为以下几个阶段:

  1. 用户调用一个函数,该函数指定要迁移的轮廓。
  2. 数据库按如下方式处理大纲:
    1. 数据库在计划基线所需的大纲中复制信息。

      数据库直接复制它或根据大纲中的信息进行计算。例如,SQL语句的文本存在于两个模式中,因此数据库可以将文本从大纲复制到基线。

    2. 数据库重新解析提示以获得不在大纲中的信息。

      计划哈希值和计划成本无法从大纲中的现有信息中得出,因此有必要重新解析提示。

    3. 数据库创建基线。
  3. 当数据库第一次选择SQL计划基线执行SQL语句时,它将获得丢失的信息。

    编译环境和执行统计信息仅在执行期间在分析和编译计划基准时可用。

仅在完成前面的阶段后,迁移才完成。

 

29.1.2.2大纲类别和基准模块

大纲是一组提示,而SQL计划基线是一组计划。

因为它们是不同的技术,所以轮廓的某些功能无法准确地映射到基线的功能。例如,单个SQL语句可以具有多个大纲,每个大纲都在不同的大纲类别中,但是当前存在的唯一基线类别是DEFAULT

大纲的类别的等效项是SQL计划基线的模块。表29-1说明了大纲类别如何映射到模块。

表29-1概述类别

概念描述默认值

大纲类别

为一组存储的轮廓指定用户定义的分组。

您可以使用类别来维护SQL语句的不同存储大纲。例如,单个语句可以在OLTP类别和DW类别中具有大纲

每个SQL语句可以具有一个或多个存储的大纲。每个存储的轮廓都在一个且只有一个轮廓类别中。一条语句可以在不同类别中具有多个存储的大纲,但是每个语句的每个类别仅存在一个存储的大纲。

在迁移期间,数据库将每个大纲类别映射到SQL计划基准模块。

DEFAULT

基准模块

指定正在执行的高级功能。

SQL计划基准可以属于一个且只能属于一个模块。

将大纲迁移到SQL计划基线之后,模块名称默认为大纲类别名称。

基准类别

仅存在一个SQL计划基准类别。此类别名为DEFAULT在存储大纲迁移期间,SQL计划基线的模块名称设置为存储大纲的类别名称。

一条语句在DEFAULT类别中可以有多个SQL计划基线

DEFAULT

将存储的大纲迁移到SQL计划基线时,Oracle数据库将每个大纲类别映射到具有相同名称的SQL计划基线模块。如下图所示,大纲类别OLTP已映射到基线模块OLTP迁移后,DEFAULT是一个超级类别,其中包含所有SQL计划基准。

图29-2默认类别


29.1.3用于存储大纲迁移的用户界面

您可以使用该DBMS_SPM程序包执行存储的大纲迁移。

表29-2与存储的大纲迁移有关的DBMS_SPM函数

DBMS_SPM函数描述

MIGRATE_STORED_OUTLINE

迁移现有的存储轮廓以计划基线。

使用以下两种格式之一:

  • 指定大纲名称,SQL文本,大纲类别或所有存储的大纲。
  • 指定大纲名称列表。

ALTER_SQL_PLAN_BASELINE

更改单个计划或与SQL语句关联的所有计划的属性。

DROP_MIGRATED_STORED_OUTLINE

删除已迁移到SQL计划基线的存储大纲。

该函数查找MIGRATEDDBA_OUTLINES视图中标记为的存储轮廓,然后从数据库中删除这些轮廓。

您可以使用初始化和会话参数来控制存储的大纲和计划基线行为。表29-3说明了相关参数。有关这些参数设置如何交互的说明,参见表29-5表29-6

表29-3与存储的大纲迁移相关的参数

初始化或会话参数描述参数类型

CREATE_STORED_OUTLINES

确定Oracle数据库是否为会话期间提交的每个查询自动创建并存储大纲。

初始化参数

OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES

启用或禁用可重复SQL语句的自动识别以及这些语句的SQL计划基线的生成。

初始化参数

OPTIMIZER_USE_SQL_PLAN_BASELINES

启用或禁用对存储在“ SQL管理基础”中的SQL计划基准的使用。

初始化参数

USE_STORED_OUTLINES

确定优化器是否使用存储的轮廓来生成执行计划。

注意:这是一个会话参数,而不是初始化参数。

届会

您可以使用数据库视图来访问与存储的大纲迁移有关的信息。表29-4描述了以下主要视图。

表29-4与存储的大纲迁移有关的视图

视图描述

DBA_OUTLINES

描述数据库中所有存储的轮廓。

MIGRATED列对于大纲迁移很重要,并显示以下值之一:NOT-MIGRATEDMIGRATED如果为MIGRATED,则已存储的大纲已迁移到计划基线,因此无法使用。

DBA_SQL_PLAN_BASELINES

显示有关当前为特定SQL语句创建的SQL计划基准的信息。

ORIGIN列指示如何创建计划基准。该值STORED-OUTLINE指示基线是通过迁移轮廓创建的。

也可以看看:

 

29.1.4存储大纲迁移中的基本步骤

基本过程是准备,迁移然后清理。

基本步骤如下:

  1. 准备存储的大纲迁移。

    查看迁移先决条件,并确定您希望迁移后的计划基准如何运行。

    请参阅 为存储的大纲迁移做准备 

  2. 执行以下任务之一:
  3. 执行迁移后确认和清理。

    请参阅 在存储大纲迁移后执行后续任务 


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论