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

Oracle 19C 从SQL调整集中加载计划

原创 Asher.HU 2021-02-04
877


SQL调整集(STS)是一个数据库对象,其包括一个或多个SQL语句,执行统计数据,和执行上下文。本主题说明如何从STS加载计划。

使用DBMS_SPM.LOAD_PLANS_FROM_SQLSET功能或使用Cloud Control 加载计划下表描述了一些功能参数。

表28-7 LOAD_PLANS_FROM_SQLSET参数

功能参数描述

sqlset_name

从中将计划加载到SQL计划基准中的STS的名称。

basic_filter

应用于STS的筛选器,仅选择要加载的合格计划。过滤器可以采用WHERE可以针对视图指定的任何子句谓词的形式DBA_SQLSET_STATEMENTS一个例子是basic_filter => 'sql_text like ''SELECT /*LOAD_STS*/%'''

fixed

默认NO表示将加载的计划用作非固定计划。YES表示加载的计划是固定计划。 计划选择 说明了优化器会在计划基线中选择一个固定计划,而不是一个非固定计划。

本节说明如何从命令行加载计划。在Cloud Control中,转到“ SQL计划基准”子页面(如图28-1所示),然后单击“ 加载”以从SQL调整集中加载计划基准。

假设条件

本教程假定以下内容:

  • 您希望加载的计划是不固定的。
  • 您已执行以下查询:
    SELECT /*LOAD_STS*/ *
    FROM   sh.sales
    WHERE  quantity_sold > 40
    ORDER BY prod_id;
    
    复制
  • 您已将计划从共享SQL区域加载到名为SQL的SQL调整集中SPM_STS,该调整集归用户所有SPM
  • 操作之后,您要使用DBMS_SQLTUNE.DROP_SQLSET而不是等效的D 删除STS BMS_SQLSET.DROP_SQLSET

要从SQL调整集中加载计划,请执行以下操作:

  1. 使用适当的特权将SQL * Plus连接到数据库,然后验证SQL调优集中包含哪些计划。

    例如,查询DBA_SQLSET_STATEMENTSSTS名称(包括示例输出):

    SELECT SQL_TEXT
    FROM   DBA_SQLSET_STATEMENTS
    WHERE  SQLSET_NAME = 'SPM_STS';
     
    SQL_TEXT
    --------------------
    SELECT /*LOAD_STS*/
    *
    FROM sh.sales
    WHERE quantity_sold
    > 40
    ORDER BY prod_id
    
    复制

    输出显示该select /*LOAD_STS*/语句的计划在STS中。

  2. 将计划从STS加载到SQL计划基准中。

    例如,在SQL * Plus中,执行以下功能:

    VARIABLE v_plan_cnt NUMBER
    EXECUTE :v_plan_cnt := DBMS_SPM.LOAD_PLANS_FROM_SQLSET( -
               sqlset_name  => 'SPM_STS', -
               basic_filter => 'sql_text like ''SELECT /*LOAD_STS*/%''' );
    
    复制

    basic_filter参数指定一个WHERE子句,子句仅加载感兴趣的查询的计划。该变量v_plan_cnt存储从STS加载的计划数量。

  3. 查询数据字典以确保计划已加载到语句的基线中。

    以下语句查询DBA_SQL_PLAN_BASELINES视图(包括示例输出)。

    SQL> SELECT SQL_HANDLE, SQL_TEXT, PLAN_NAME,
      2         ORIGIN, ENABLED, ACCEPTED
      3  FROM   DBA_SQL_PLAN_BASELINES;
    
    SQL_HANDLE            SQL_TEXT        PLAN_NAME        ORIGIN               ENA ACC
    --------------------- --------------- ---------------- -------------------- --- ---
    SQL_a8632bd857a4a25e  SELECT          SQL_PLAN_ahstb   MANUAL-LOAD-FROM-STS YES YES
                          /*LOAD_STS*/*   v1bu98ky1694fc6b
                          FROM sh.sales
                          WHERE 
                          quantity_sold 
                          > 40 ORDER BY                    
                          prod_id
    复制

    输出显示该计划已被接受,这意味着它在计划基线中。另外,原点是MANUAL-LOAD-FROM-STS,这表示该计划是从SQL调整集中手动加载的,而不是自动捕获的。

  4. (可选)删除STS。

    例如,执行以下DBMS_SQLTUNE.DROP_SQLSET操作删除SPM_STS调整集:

    EXEC SYS.DBMS_SQLTUNE.DROP_SQLSET( sqlset_name  => 'SPM_STS', -
                                       sqlset_owner => 'SPM' );
    复制

也可以看看:

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

评论