注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下:


Oracle数据库Real Application Testing之DBMS_SQLTUNE包技术详解


Oracle的学习心得和知识总结(二十)|Oracle数据库Real Application Testing之DBMS_SQLTUNE包技术详解-LMLPHP


文章快速说明索引

学习目标:

目的:接下来这段时间我想做一些兼容Oracle数据库Real Application Testing (即:RAT)上的一些功能开发,本专栏这里主要是学习以及介绍Oracle数据库功能的使用场景、原理说明和注意事项等,基于PostgreSQL数据库的功能开发等之后 由新博客进行介绍和分享!今天我们主要看一下 DBMS_SQLTUNE package 的相关内容!


学习内容:(详见目录)

1、Oracle数据库Real Application Testing之DBMS_SQLTUNE包技术详解


学习时间:

2023年04月18日 21:16:21


学习产出:

1、Oracle数据库Real Application Testing之DBMS_SQLTUNE包技术详解
2、CSDN 技术博客 1篇


注:下面我们所有的学习环境是Centos7+PostgreSQL15.0+Oracle19c+MySQL5.7

postgres=# select version();
                                   version                                   
-----------------------------------------------------------------------------
 PostgreSQL 15.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 7.1.0, 64-bit
(1 row)

postgres=#

#-----------------------------------------------------------------------------#

SQL> select * from v$version; 

BANNER									    BANNER_FULL 								BANNER_LEGACY									CON_ID
--------------------------------------------------------------------------- --------------------------------------------------------------------------- --------------------------------------------------------------------------- ----------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production	    Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production	Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production		     0
									    Version 19.3.0.0.0


SQL>
#-----------------------------------------------------------------------------#

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.19    |
+-----------+
1 row in set (0.06 sec)

mysql>

DBMS_SQLTUNE 概述

  1. 官方链接:https://docs.oracle.com/en/database/oracle/oracle-database/21/arpls/DBMS_SQLTUNE.html

DBMS_SQLTUNE 包是用于按需调优 SQL 的接口。相关包 DBMS_AUTO_SQLTUNE 包为 SQL Tuning Advisor 作为自动化任务运行提供了接口。


DBMS_SQLTUNE 包提供了许多相互关联的功能领域。

SQL Tuning Advisor(SQL 调优顾问)

SQL Tuning Advisor 是一组顾问中的一个,是一组识别并帮助解决数据库性能问题的专家系统。具体来说,SQL Tuning Advisor 自动调优有问题的 SQL 语句。它以一个或多个 SQL 语句作为输入,并就如何调优这些语句给出精确的建议。该顾问以 SQL 操作的形式提供建议,以调优 SQL 及其预期的性能优势。

DBMS_SQLTUNE SQL Tuning Advisor 子程序组提供了一个面向任务的界面,使您能够访问该顾问程序。您可以按给定的顺序调用以下子程序以使用 SQL Tuning Advisor 的某些功能:

  1. CREATE_TUNING_TASK 函数创建用于调优一个或多个 SQL 语句的调优任务
  2. EXECUTE_TUNING_TASK 函数和过程执行先前创建的调优任务
  3. REPORT_TUNING_TASK 函数显示调优任务的结果
  4. 您使用 SCRIPT_TUNING_TASK 函数创建一个 SQL*Plus 脚本,然后可以执行该脚本以实施一组顾问建议

SQL Profile Subprograms(SQL 配置文件子程序)

SQL Tuning Advisor 可能会建议创建 SQL 配置文件以提高语句的性能。SQL 配置文件由特定于语句的辅助统计信息组成。查询优化器对基数、选择性和成本进行估计,这些估计有时可能会有很大偏差,从而导致执行计划不佳。SQL 配置文件通过使用抽样和部分执行技术收集额外信息来调优这些估计来解决这个问题。

DBMS_SQLTUNE SQL Profile 子程序组提供了一种机制,用于将统计信息传递给以特定 SQL 语句为目标的优化器,并通过为该语句提供尽可能准确的统计信息来帮助优化器对该语句做出正确的决策。例如:

  1. 您可以使用 ACCEPT_SQL_PROFILE 过程和函数来接受 SQL Tuning Advisor 推荐的 SQL 配置文件
  2. 您可以使用 ALTER_SQL_PROFILE 过程更改现有 SQL 配置文件的 STATUS、NAME、DESCRIPTION 和 CATEGORY 属性
  3. 您可以使用 DROP_SQL_PROFILE 过程删除 SQL 配置文件

SQL Tuning Sets(SQL 调优集)

SQL 调优集存储 SQL 语句以及以下信息:

  1. 执行上下文,例如解析模式名称和绑定值
  2. 执行统计信息,例如平均运行时间和执行次数
  3. 执行计划,即数据库为运行 SQL 语句而执行的操作序列
  4. 行源统计信息,例如为计划中执行的每个操作处理的行数

您可以通过过滤或排名来自多个来源的 SQL 语句来创建 SQL 调优集:

  1. 使用 SELECT_CURSOR_CACHE 函数的共享 SQL 区
  2. 使用 SELECT_WORKLOAD_REPOSITORY 函数的自动工作负载存储库中的顶级 SQL 语句
  3. 使用 SELECT_SQLSET 函数的其他 SQL 调优集
  4. 使用 SELECT_SQLPA_TASK 函数的 SQL Performance Analyzer 任务比较结果
  5. 使用 SELECT_SQL_TRACE 函数的 SQL 跟踪文件
  6. 用户定义的工作负载

完整的 DBMS_SQLTUNE SQL 调优集子程序组有助于实现此功能。 例如:

  1. CREATE_SQLSET 过程和函数在数据库中创建一个 SQL 调优集对象
  2. LOAD_SQLSET 过程用一组选定的 SQL 填充 SQL 调优集
  3. CAPTURE_CURSOR_CACHE_SQLSET 过程在指定的时间间隔内从共享 SQL 区域收集 SQL 语句,试图构建数据库工作负载的真实情况

注:操作 SQL 调优集时,可以使用 DBMS_SQLSET 作为 DBMS_SQLTUNE 的替代方法。

Import and Export of SQL Tuning Sets and SQL Profiles(SQL 调优集和 SQL 配置文件的导入和导出)

使用 DBMS_SQLTUNE 子程序使用通用编程模型将 SQL 配置文件和 SQL 调优集从一个系统移动到另一个系统。在这两种情况下,您都在源数据库上创建一个暂存表,并使用相关数据填充该暂存表。然后,您可以按照您选择的方法(例如 Oracle 数据泵或数据库链接)将该暂存表移动到目标系统,在该系统中它用于以原始形式重构对象。以下步骤是通过该包中包含的子程序实现的:

  1. 要在源系统上创建暂存表,请调用 CREATE_STGTAB_SQLPROF 过程或 CREATE_STGTAB_SQLSET 过程
  2. 要使用来自源系统的信息填充暂存表,请调用 PACK_STGTAB_SQLPROF 过程或 PACK_STGTAB_SQLSET 过程
  3. 将暂存表移动到目标系统
  4. 要在新系统上重新创建对象,请调用 UNPACK_STGTAB_SQLPROF 过程或 UNPACK_STGTAB_SQLSET 过程

Automatic Tuning Task Functions(自动调优任务函数)

自动化系统任务 SYS_AUTO_SQL_TUNING_TASK 由数据库作为目录脚本的一部分创建。此任务自动从 AWR 中选择一组高负载 SQL 并在该 SQL 上运行 SQL Tuning Advisor。自动化任务执行与任何其他 SQL 优化任务相同的综合分析。

您可以通过 DBMS_AUTO_SQLTUNE.REPORT_AUTO_TUNING_TASK API 获取有关自动 SQL 调优任务活动的报告。

Real-Time SQL Monitoring(实时 SQL 监控)

实时 SQL 监控使 DBA 或性能分析师能够在长时间运行的 SQL 语句执行时监控它们的执行情况。游标统计信息(如 CPU 时间和 IO 时间)和执行计划统计信息(如输出行数、内存和使用的临时空间)在语句执行期间几乎实时更新。
V$SQL_MONITORV$SQL_PLAN_MONITOR 视图公开了这些统计信息。另外,DBMS_SQLTUNE提供了REPORT_SQL_MONITOR和REPORT_SQL_MONITOR_LIST函数来上报监控信息。

注意:DBMS_SQL_MONITOR 还包含 REPORT_SQL_MONITOR 和 REPORT_SQL_MONITOR_LIST 函数。

Tuning a Standby Database Workload(调优备用数据库工作负载)

在某些情况下,备用数据库除了其数据保护角色外还可以承担报告角色。备用数据库可以有自己的查询工作负载,其中一些可能需要调优。您可以在只读的备用数据库上发出 SQL Tuning Advisor 语句。备用数据库到主数据库的链接使 DBMS_SQLTUNE 能够将数据写入主数据库并从中读取数据。有资格调优备用工作负载的过程包括 database_link_to 参数。


DBMS_SQLTUNE 安全模型

这个包对 PUBLIC 可用,并执行它自己的安全检查。请注意以下事项:

  1. 因为 SQL Tuning Advisor 依赖于 Advisor 框架,所以所有调优任务接口 (*_TUNING_TASK) 都需要 ADVISOR 权限

  2. SQL 调优集子程序 (*_SQLSET) 需要以下权限之一:

    • 管理 SQL 调优集:您只能创建和修改您拥有的 SQL 调优集
    • 管理任何 SQL 调优集:您可以对所有 SQL 调优集进行操作,甚至是其他用户拥有的调优集
  3. 在早期版本中,调用涉及 SQL 配置文件的子程序需要三种不同的权限:

    • 创建任何 SQL 配置文件
    • 更改任何 SQL 配置文件
    • 删除任何 SQL 配置文件

    前面的权限已被弃用,取而代之的是 ADMINISTER SQL MANAGEMENT OBJECT。

DBMS_SQLTUNE 数据结构

DBMS_SQLTUNE 包中的 SELECT_* 子程序返回 SQLSET_ROW 类型的对象。SQLSET_ROW 对象类型,如下:

  1. SQLSET_ROW 对象为用户建模 SQL 调优集的内容。
  2. 从逻辑上讲,SQL 调优集是 SQLSET_ROW 对象的集合。每个 SQLSET_ROW 都包含一个 SQL 语句及其执行上下文、统计信息、绑定和计划。SELECT_* 子程序将每个数据源建模为 SQLSET_ROW 对象的集合,每个对象由 (sql_id, plan_hash_value) 唯一标识。类似地,LOAD_SQLSET 过程将行类型为 SQLSET_ROW 的游标作为输入,根据用户请求的策略单独处理每个 SQLSET_ROW
  3. 几个子程序包接受对 SQL 调优集或数据源内容的基本过滤器。这些过滤器是根据定义的 SQLSET_ROW 中的属性来表示的

类型定义如下:

CREATE TYPE sqlset_row AS object (
  sql_id                   VARCHAR(13),
  force_matching_signature NUMBER,
  sql_text                 CLOB,
  object_list              sql_objects,
  bind_data                RAW(2000),
  parsing_schema_name      VARCHAR2(30),
  module                   VARCHAR2(48),
  action                   VARCHAR2(32),
  elapsed_time             NUMBER,
  cpu_time                 NUMBER,
  buffer_gets              NUMBER,
  disk_reads               NUMBER,
  direct_writes            NUMBER,
  rows_processed           NUMBER,
  fetches                  NUMBER,
  executions               NUMBER,
  end_of_fetch_count       NUMBER,
  optimizer_cost           NUMBER,
  optimizer_env            RAW(2000),
  priority                 NUMBER,
  command_type             NUMBER,
  first_load_time          VARCHAR2(19),
  stat_period              NUMBER,
  active_stat_period       NUMBER,
  other                    CLOB,
  plan_hash_value          NUMBER,
  sql_plan                 sql_plan_table_type,
  bind_list                sql_binds,
  con_dbid                 NUMBER,
  last_exec_start_time     VARCHAR2(19))

属性解释如下:


DBMS_SQLTUNE 子程序组

DBMS_SQLTUNE 子程序按功能分组,如下:

  • DBMS_SQLTUNE SQL 调优顾问子程序
  • DBMS_SQLTUNE SQL 配置文件子程序
  • DBMS_SQLTUNE SQL 调优集子程序
  • DBMS_SQLTUNE 实时SQL监控子程序
  • DBMS_SQLTUNE SQL 性能报告子程序

DBMS_SQLTUNE SQL 调优顾问子程序

这个子程序组提供了一个接口来管理 SQL 调优任务,如下:


DBMS_SQLTUNE SQL 配置文件子程序

这个子程序组提供了一个接口来管理 SQL 配置文件,如下:


DBMS_SQLTUNE SQL 调优集子程序

这个子程序组提供了一个接口来管理 SQL 调优集,如下:

DBMS_SQLTUNE 实时SQL监控子程序

该子程序组提供收集到V$SQL_MONITORV$SQL_PLAN_MONITOR中的监控数据的报告功能,如下:


DBMS_SQLTUNE SQL 性能报告子程序

该子程序组使用来自共享 SQL 区域和自动工作负载存储库 (AWR) 的统计信息提供有关 SQL 性能的详细报告。如下:


DBMS_SQLTUNE 子程序总结

ACCEPT_ALL_SQL_PROFILES Procedure

该过程接受调优任务的特定执行推荐的所有SQL配置文件,并根据用户传递的参数值设置SQL配置文件的属性。其语法格式如下:

DBMS_SQLTUNE.ACCEPT_ALL_SQL_PROFILES (
   task_name         IN VARCHAR2,
   category          IN VARCHAR2 := NULL,
   replace           IN BOOLEAN  := FALSE,
   force_match       IN BOOLEAN  := FALSE,
   profile_type      IN VARCHAR2 := REGULAR_PROFILE,
   autotune_period   IN NUMBER   := NULL,
   execution_name    IN VARCHAR2 := NULL,
   task_owner        IN VARCHAR2 := NULL,
   description       IN VARCHAR2 := NULL,
   database_link_to  IN VARCHAR2 := NULL);

其参数解释如下:

安全模型

该权限是必需的。该特权已弃用。ADMINISTER SQL MANAGEMENT OBJECTCREATE ANY SQL PROFILE


ACCEPT_SQL_PROFILE Procedure and Function

该子程序创建 SQL Tuning Advisor 推荐的 SQL 配置文件。

尽管 SQL 文本以非规范化形式存储在数据字典中以提高可读性,但出于匹配目的对 SQL 文本进行了规范化。SQL 文本是通过对 SQL 调优任务的引用提供的。如果引用的 SQL 语句不存在,则数据库报错。其语法格式如下:

DBMS_SQLTUNE.ACCEPT_SQL_PROFILE (
   task_name    IN  VARCHAR2,
   object_id    IN  NUMBER   := NULL,
   name         IN  VARCHAR2 := NULL,
   description  IN  VARCHAR2 := NULL,
   category     IN  VARCHAR2 := NULL);
   task_owner   IN VARCHAR2  := NULL,
   replace      IN BOOLEAN   := FALSE,
   force_match  IN BOOLEAN   := FALSE,
   profile_type IN VARCHAR2  := REGULAR_PROFILE);

DBMS_SQLTUNE.ACCEPT_SQL_PROFILE (
   task_name         IN  VARCHAR2,
   object_id         IN  NUMBER    := NULL,
   name              IN  VARCHAR2  := NULL,
   description       IN  VARCHAR2  := NULL,
   category          IN  VARCHAR2  := NULL;
   task_owner        IN  VARCHAR2  := NULL,
   replace           IN  BOOLEAN   := FALSE,
   force_match       IN  BOOLEAN   := FALSE,
   profile_type      IN  VARCHAR2  := REGULAR_PROFILE,
   database_link_to  IN  VARCHAR2  := NULL)
 RETURN VARCHAR2;

其参数解释如下:

其返回值为:SQL 配置文件的名称。

注:需要 ADMINISTER SQL MANAGEMENT OBJECT 特权。CREATE ANY SQL PROFILE 权限已弃用。

其使用案例如下:

您可以以相同的方式使用子程序的过程版本和函数版本,只是您必须指定返回值才能调用函数。这里我们只给出程序的例子。在此示例中,您从工作负载存储库中调优单个 SQL 语句,并创建 SQL Tuning Advisor 推荐的 SQL 配置文件。

VARIABLE stmt_task VARCHAR2(64);
VARIABLE sts_task VARCHAR2(64);
 
-- create a tuning task tune the statement 
EXEC :stmt_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(
   begin_snap  => 1, -
   end_snap    => 2, -
   sql_id      => 'ay1m3ssvtrh24');
 
-- execute the resulting task 
EXEC DBMS_SQLTUNE.EXECUTE_TUNING_TASK(:stmt_task);
 
EXEC DBMS_SQLTUNE.ACCEPT_SQL_PROFILE(:stmt_task);

请注意,您不必为 SQL Tuning Advisor 创建的 Advisor 框架对象指定 ID(即 object_id)以表示已调优的 SQL 语句。

您可能还想在不同的类别(例如,TEST)中接受推荐的 SQL 配置文件,以便默认情况下不使用它。

EXEC DBMS_SQLTUNE.ACCEPT_SQL_PROFILE (
   task_name  =>  :stmt_task, -
   category   =>  'TEST');

您可以使用命令 ALTER SESSION SET SQLTUNE_CATEGORY = ‘TEST’ 来查看此配置文件的行为方式。

以下调用创建一个 SQL 配置文件,该配置文件以任何与调优语句具有相同 force_matching_signature 的 SQL 语句为目标。

EXEC DBMS_SQLTUNE.ACCEPT_SQL_PROFILE (task_name   =>  :stmt_task, -
                                      force_match =>  TRUE);

在以下示例中,您调优了一个 SQL 调优集,并仅为 SQL 调优集中的一个 SQL 语句创建了一个 SQL 配置文件。SQL 语句由 ID 等于 5 的顾问框架对象表示。您必须将对象 ID 传递给 ACCEPT_SQL_PROFILE 过程,因为调优任务可能有许多 SQL 配置文件。此对象 ID 随报告一起提供。

EXEC :sts_task := DBMS_SQLTUNE.CREATE_TUNING_TASK ( -
  sqlset_name   => 'my_workload',  -
  rank1         => 'ELAPSED_TIME', -
  time_limit    => 3600,           -
  description   => 'my workload ordered by elapsed time');
 
-- execute the resulting task 
EXEC DBMS_SQLTUNE.EXECUTE_TUNING_TASK(:sts_task);

 -- create the profile for the sql statement corresponding to object_id = 5.
EXEC DBMS_SQLTUNE.ACCEPT_SQL_PROFILE (
   task_name  =>  :sts_task, -
   object_id  =>  5);

ADD_SQLSET_REFERENCE Function

此过程添加对现有 SQL 调优集的新引用以指示其由客户端使用。其语法格式如下:

DBMS_SQLTUNE.ADD_SQLSET_REFERENCE (
   sqlset_name  IN  VARCHAR2,
   description  IN  VARCHAR2 := NULL)
 RETURN NUMBER;

注:DBMS_SQLTUNE.ADD_SQLSET_REFERENCE 和 DBMS_SQLSET.ADD_REFERENCE 的参数相同。

其参数解释如下:

其返回值为:添加的引用的标识符。

其使用案例如下:

您可以添加对 SQL 调优集的引用。这可以防止调优集在使用时被修改。当您在 SQL 调优集上调用 SQL Tuning Advisor 时,会自动添加引用,因此您应该仅将此功能用于自定义目的。该函数返回一个引用 ID,用于稍后将其删除。您使用 REMOVE_SQLSET_REFERENCE 过程删除对 SQL 调优集的引用。

VARIABLE rid NUMBER; 
EXEC :rid := DBMS_SQLTUNE.ADD_SQLSET_REFERENCE( -
                                sqlset_name => 'my_workload', -
                                description => 'my sts reference');

您可以使用 DBA_SQLSET_REFERENCES 视图查找给定 SQL 调优集上的所有引用。


ALTER_SQL_PROFILE Procedure

此过程更改现有 SQL 配置文件对象的特定属性。可以更改以下属性(使用这些属性名称):

  • STATUS 可以设置为 ENABLED 或 DISABLED
  • NAME 可以重置为有效名称,该名称必须是有效的 Oracle 标识符并且必须是唯一的
  • DESCRIPTION 可以设置为任何长度不超过 500 个字符的字符串
  • CATEGORY 可以重置为有效的类别名称,该名称必须是有效的 Oracle 标识符,并且在与规范化 SQL 文本组合时必须是唯一的

其语法格式如下:

DBMS_SQLTUNE.ALTER_SQL_PROFILE (
   name                 IN  VARCHAR2,
   attribute_name       IN  VARCHAR2,
   value                IN  VARCHAR2);

其参数解释如下:

注:需要 ALTER ANY SQL PROFILE 权限。

其使用案例如下:

-- Disable a profile, so it is not be used by any sessions.
EXEC DBMS_SQLTUNE.ALTER_SQL_PROFILE ( name            =>  :pname,   -
                                      attribute_name  =>  'STATUS', -
                                      value           =>  'DISABLED');
 
-- Enable it back:
EXEC DBMS_SQLTUNE.ALTER_SQL_PROFILE ( name            =>   :pname,   -
                                      attribute_name  =>   'STATUS', -
                                      value           =>   'ENABLED');
 
-- Change the category of the profile so it is used only by sessions
-- with category set to TEST.
-- Use ALTER SESSION SET SQLTUNE_CATEGORY = 'TEST' to see how this profile 
-- behaves.
EXEC DBMS_SQLTUNE.ALTER_SQL_PROFILE ( name            =>  :pname,   -
                                      attribute_name  =>  'CATEGORY', -
                                      value           =>  'TEST');
 
-- Change it back:
EXEC DBMS_SQLTUNE.ALTER_SQL_PROFILE ( name            =>  :pname,   -
                                      attribute_name  =>  'CATEGORY', -
                                      value           =>  'DEFAULT');

CANCEL_TUNING_TASK Procedure

此过程取消当前正在执行的调优任务。删除所有中间结果数据。其语法格式如下:

DBMS_SQLTUNE.CANCEL_TUNING_TASK (
 task_name         IN VARCHAR2);

其参数解释如下:

其使用案例如下:

当您需要停止执行任务并且不需要查看任何已完成的结果时,您可以取消任务。

EXEC DBMS_SQLTUNE.CANCEL_TUNING_TASK(:my_task);

CAPTURE_CURSOR_CACHE_SQLSET Procedure

此过程将工作负载从共享 SQL 区域捕获到 SQL 调优集中。

该过程在一段时间内多次轮询缓存,并更新存储在那里的工作负载数据。它可以根据捕获整个系统工作负载所需的时间执行。其语法格式如下:

DBMS_SQLTUNE.CAPTURE_CURSOR_CACHE_SQLSET (
    sqlset_name         IN VARCHAR2, 
    time_limit          IN POSITIVE := 1800,
    repeat_interval     IN POSITIVE := 300,
    capture_option      IN VARCHAR2 := 'MERGE',
    capture_mode        IN NUMBER   := MODE_REPLACE_OLD_STATS,
    basic_filter        IN VARCHAR2 := NULL,
    sqlset_owner        IN VARCHAR2 := NULL,
    recursive_sql       IN VARCHAR2 := HAS_RECURSIVE_SQL);

注:DBMS_SQLTUNE.CAPTURE_CURSOR_CACHE_SQLSET 和 DBMS_SQLSET.CAPTURE_CURSOR_CACHE 的参数相同。

其参数解释如下:

其使用案例如下:

在此示例中,捕获发生在 30 秒的时间内,每五秒轮询一次缓存。这会捕获该期间运行的所有语句,但不会捕获之前或之后运行的语句。如果相同的语句第二次出现,则该过程用新出现的语句替换存储的语句。

请注意,在生产系统中,时间限制和重复间隔会设置得更高。您应该根据系统的工作负载时间和共享 SQL 区域周转率属性调优 time_limit 和 repeat_interval 参数。

 
EXEC DBMS_SQLTUNE.CAPTURE_CURSOR_CACHE_SQLSET( -
                                        sqlset_name     => 'my_workload', -
                                        time_limit      =>  30, -
                                        repeat_interval =>  5);

在下面的调用中,您可以边执行边累积执行统计信息。此选项生成每个游标的累积活动的准确图片,即使在超时期间也是如此,但它比前面的示例更昂贵。

EXEC DBMS_SQLTUNE.CAPTURE_CURSOR_CACHE_SQLSET( -
                         sqlset_name     => 'my_workload', -
                         time_limit      => 30, -
                         repeat_interval => 5, -
                         capture_mode    => dbms_sqltune.MODE_ACCUMULATE_STATS);

此调用执行非常便宜的捕获,您只插入新语句并且在将它们插入到 SQL 调优集中后不更新它们的统计信息:

EXEC DBMS_SQLTUNE.CAPTURE_CURSOR_CACHE_SQLSET( -
                                    sqlset_name     => 'my_workload', -
                                    time_limit      => 30, -
                                    repeat_interval => 5, -
                                    capture_option  => 'INSERT');

CREATE_SQL_PLAN_BASELINE Procedure

此过程为执行计划创建 SQL 计划基线。它可以在 SQL Tuning Advisor 进行的替代计划查找的上下文中使用。其语法格式如下:

DBMS_SQLTUNE.CREATE_SQL_PLAN_BASELINE (
   task_name            IN VARCHAR2,
   object_id            IN NUMBER   := NULL,
   plan_hash_value      IN NUMBER,
   owner_name           IN VARCHAR2 := NULL,
   database_link_to     IN VARCHAR2 := NULL); 

其参数解释如下:


CREATE_SQLSET Procedure and Function

此过程或函数在数据库中创建一个 SQL 调优集对象。其语法格式如下:

DBMS_SQLTUNE.CREATE_SQLSET (
   sqlset_name  IN  VARCHAR2,
   description  IN  VARCHAR2 := NULL
   sqlset_owner IN  VARCHAR2 := NULL);

DBMS_SQLTUNE.CREATE_SQLSET (
   sqlset_name  IN  VARCHAR2 := NULL,
   description  IN  VARCHAR2 := NULL,
   sqlset_owner IN  VARCHAR2 := NULL)
 RETURN VARCHAR2;

其语法格式如下:

其使用案例如下:

EXEC DBMS_SQLTUNE.CREATE_SQLSET(- 
  sqlset_name => 'my_workload', -
  description => 'complete application workload');

CREATE_STGTAB_SQLPROF Procedure

此过程创建用于将 SQL 配置文件从一个系统复制到另一个系统的暂存表。其语法格式如下:

DBMS_SQLTUNE.CREATE_STGTAB_SQLPROF (
   table_name            IN VARCHAR2,
   schema_name           IN VARCHAR2 := NULL,
   tablespace_name       IN VARCHAR2 := NULL);

其参数解释如下:

注意事项:

  • 在发出对 PACK_STGTAB_SQLPROF 过程的调用之前调用此过程一次
  • 要将不同的 SQL 配置文件放在不同的暂存表中,您可以多次调用此过程
  • 这是一个 DDL 操作,因此它不会发生在事务中

其使用案例如下:

创建一个暂存表来存储可以移动到另一个系统的配置文件数据。

EXEC DBMS_SQLTUNE.CREATE_STGTAB_SQLPROF (table_name  => 'PROFILE_STGTAB');

CREATE_STGTAB_SQLSET Procedure

此过程创建一个暂存表,通过该表导入和导出 SQL 调优集。其语法格式如下:

DBMS_SQLTUNE.CREATE_STGTAB_SQLSET (
   table_name           IN VARCHAR2,
   schema_name          IN VARCHAR2 := NULL,
   tablespace_name      IN VARCHAR2 := NULL,
   db_version           IN NUMBER   := NULL);

其参数解释如下:

  • NULL(默认值)— 指定当前数据库版本
  • STS_STGTAB_10_2_VERSION — 指定 10.2 数据库版本
  • STS_STGTAB_11_1_VERSION — 指定 11.1 数据库版本
  • STS_STGTAB_11_2_VERSION — 指定 11.2 数据库版本
  • STS_STGTAB_12_1_VERSION — 指定 12.1 数据库版本
  • STS_STGTAB_12_2_VERSION — 指定 12.2 数据库版本

安全模型:您必须在指定的架构和表空间中具有 CREATE TABLE 权限

注意事项:

  • 在打包 SQL 集之前调用此过程一次
  • 要在不同的暂存表中使用不同的调优集,您可以多次调用此过程
  • 这是一个 DDL 操作,因此它不会发生在事务中
  • 临时表包含嵌套的表列和索引,因此不应重命名

其使用案例如下:

创建用于打包并最终导出 SQL 调优集的暂存表,如下:

EXEC DBMS_SQLTUNE.CREATE_STGTAB_SQLSET(table_name => 'STGTAB_SQLSET');

创建一个临时表以将 SQL 调优集打包为 Oracle Database 11g 第 2 版 (11.2) 格式,如下:

BEGIN 
  DBMS_SQLTUNE.CREATE_STGTAB_SQLSET(
      table_name => 'STGTAB_SQLSET'
  ,   db_version => DBMS_SQLTUNE.STS_STGTAB_11_2_VERSION );
END;

CREATE_TUNING_TASK Functions

此函数创建一个 SQL Tuning Advisor 任务。您可以使用此函数的不同形式来:

  • 为给定文本的单个语句创建调优任务
  • 从给定标识符的共享 SQL 区域为单个语句创建调优任务
  • 给定一系列快照标识符,为来自工作负载存储库的单个语句创建调优任务
  • 为 SQL 调优集创建调优任务
  • 为 SQL Performance Analyzer 创建调优任务

在所有情况下,该函数主要创建 SQL Tuning Advisor 任务并设置其参数。

注意:多租户容器数据库是 Oracle Database 20c 中唯一受支持的架构。在修订文档时,遗留术语可能会继续存在。在大多数情况下,“数据库”和“非 CDB”指的是 CDB 或 PDB,具体取决于上下文。在某些情况下,例如升级,“非 CDB”是指来自先前版本的非 CDB。

其语法格式如下:

-- SQL text format:
DBMS_SQLTUNE.CREATE_TUNING_TASK (
  sql_text         IN CLOB,
  bind_list        IN sql_binds := NULL,
  user_name        IN VARCHAR2  := NULL,
  scope            IN VARCHAR2  := SCOPE_COMPREHENSIVE,
  time_limit       IN NUMBER    := TIME_LIMIT_DEFAULT,
  task_name        IN VARCHAR2  := NULL,
  description      IN VARCHAR2  := NULL,
  con_name         IN VARCHAR2  := NULL,
  database_link_to IN VARCHAR2  := NULL)
RETURN VARCHAR2;

-- SQL ID format:
DBMS_SQLTUNE.CREATE_TUNING_TASK (
  sql_id           IN VARCHAR2,
  plan_hash_value  IN NUMBER    := NULL,
  scope            IN VARCHAR2  := SCOPE_COMPREHENSIVE,
  time_limit       IN NUMBER    := TIME_LIMIT_DEFAULT,
  task_name        IN VARCHAR2  := NULL,
  description      IN VARCHAR2  := NULL,
  con_name         IN VARCHAR2  := NULL,
  database_link_to IN VARCHAR2  := NULL)
RETURN VARCHAR2;

-- AWR format:
DBMS_SQLTUNE.CREATE_TUNING_TASK (
  begin_snap       IN NUMBER,
  end_snap         IN NUMBER,
  sql_id           IN VARCHAR2,
  plan_hash_value  IN NUMBER    := NULL,
  scope            IN VARCHAR2  := SCOPE_COMPREHENSIVE,
  time_limit       IN NUMBER    := TIME_LIMIT_DEFAULT,
  task_name        IN VARCHAR2  := NULL,
  description      IN VARCHAR2  := NULL,
  con_name         IN VARCHAR2  := NULL,
  dbid             IN NUMBER    := NULL,
  database_link_to IN VARCHAR2  := NULL)
RETURN VARCHAR2;

-- SQL tuning set format:
DBMS_SQLTUNE.CREATE_TUNING_TASK (
  sqlset_name       IN VARCHAR2,
  basic_filter      IN VARCHAR2 :=  NULL,
  object_filter     IN VARCHAR2 :=  NULL,
  rank1             IN VARCHAR2 :=  NULL,
  rank2             IN VARCHAR2 :=  NULL,
  rank3             IN VARCHAR2 :=  NULL,
  result_percentage IN NUMBER   :=  NULL,
  result_limit      IN NUMBER   :=  NULL,
  scope             IN VARCHAR2 :=  SCOPE_COMPREHENSIVE,
  time_limit        IN NUMBER   :=  TIME_LIMIT_DEFAULT,
  task_name         IN VARCHAR2 :=  NULL,
  description       IN VARCHAR2 :=  NULL
  plan_filter       IN VARCHAR2 :=  'MAX_ELAPSED_TIME',
  sqlset_owner      IN VARCHAR2 :=  NULL,
  database_link_to IN VARCHAR2  :=  NULL)
RETURN VARCHAR2;

-- SQL Performance Analyzer format:
DBMS_SQLTUNE.CREATE_TUNING_TASK (
   spa_task_name     IN VARCHAR2,
   spa_task_owner    IN VARCHAR2 :=  NULL,
   spa_compare_exec  IN VARCHAR2 :=  NULL,
   basic_filter      IN VARCHAR2 :=  NULL,
   time_limit        IN NUMBER   :=  TIME_LIMIT_DEFAULT,
   task_name         IN VARCHAR2 :=  NULL,
   description       IN VARCHAR2 :=  NULL)
RETURN VARCHAR2; 

其参数解释如下:

  • LAST_GENERATED:最近的时间戳
  • FIRST_GENERATED:最早的时间戳,与LAST_GENERATED相反
  • LAST_LOADED:最近的first_load_time统计信息
  • FIRST_LOADED:最早的first_load_time统计信息,与LAST_LOADED相反
  • MAX_ELAPSED_TIME:最大运行时间
  • MAX_BUFFER_GETS:最大缓冲区获取
  • MAX_DISK_READS:最大磁盘读取
  • MAX_DIRECT_WRITES:最大直接写入
  • MAX_OPTIMIZER_COST:最大优化器成本
  • 对于 SQL 文本格式,此参数指定 SQL Tuning Advisor 在其中调优 SQL 语句的容器。如果为 null(默认),则 SQL Tuning Advisor 使用当前容器
  • 对于SQL ID 格式,该参数指定数据库从哪个容器中获取SQL 语句进行调优。SQL Tuning Advisor 调优此容器中的语句。如果为 null,则数据库使用当前 PDB 进行调优,从执行 SQL 语句的所有有效容器的游标缓存中获取语句,并调优其容器中最昂贵的语句
  • 对于 AWR 格式,此参数指定数据库从其 AWR 数据中提取 SQL 语句以进行调优的容器。SQL Tuning Advisor 调优此容器中的语句。如果为空,则数据库使用当前 PDB 进行调优,从所有具有此 SQL 语句的有效容器的 AWR 中获取语句,并调优其容器中最昂贵的语句

以下陈述适用于所有函数格式:

  • 在非 CDB 中,忽略此参数
  • 在 PDB 中,此参数必须为 null 或与 PDB 的容器名称匹配。否则,会发生错误
  • 在 CDB 根中,此参数必须为 null 或匹配此 CDB 中容器的容器名称。否则,会发生错误

其返回值为:用户唯一的 SQL 调优任务名称(两个不同的用户可以为他们的顾问任务指定相同的名称)。

注意事项:关于采用 SQL 调优集的此子程序的形式,提供给此函数的过滤器将作为当前用户运行的 SQL 的一部分进行评估。因此,它们以该用户的安全权限执行,并且可以包含用户可以访问的任何构造和子查询,但仅此而已。

其使用案例如下:

-- 以下示例假定以下变量定义:
VARIABLE stmt_task     VARCHAR2(64);
VARIABLE sts_task      VARCHAR2(64);
VARIABLE spa_tune_task VARCHAR2(64);


-- 使用 SQL 文本格式创建调优任务
EXEC :stmt_task := DBMS_SQLTUNE.CREATE_TUNING_TASK( -
  sql_text => 'SELECT quantity_sold FROM sales s, times t WHERE s.time_id = t.time_id AND s.time_id = TO_DATE(''24-NOV-00'')');


-- 使用 SQL ID 格式创建调优任务
EXEC :stmt_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(sql_id => 'ay1m3ssvtrh24');
 
EXEC :stmt_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(sql_id => 'ay1m3ssvtrh24', -
   scope => 'LIMITED');
 
EXEC :stmt_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(sql_id => 'ay1m3ssvtrh24', -
   time_limit => 600);


-- 使用 AWR 快照格式创建调优任务
EXEC :stmt_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(begin_snap => 1, -
   end_snap => 2, sql_id => 'ay1m3ssvtrh24');


-- 使用 SQL 调优集格式创建调优任务
-- 此示例创建一个任务,该任务按缓冲区获取的顺序调优 SQL 语句,并设置一小时的时间限制。默认排名度量是 elapsed time
EXEC :sts_task := DBMS_SQLTUNE.CREATE_TUNING_TASK( -
  sqlset_name  => 'my_workload', -
  rank1        => 'BUFFER_GETS', -
  time_limit   => 3600, -
  description  => 'tune my workload ordered by buffer gets');


-- 使用 SPA 任务格式创建调优任务
-- 此示例调优被报告为已从名为 task_123 的 SQL 性能分析器任务的比较性能执行中退化的 SQL 语句
EXEC :spa_tune_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(
   spa_task_name     => 'task_123',
   spa_task_owner    => 'SCOTT',
   spa_compare_exec  => 'exec1');


-- 在备库上创建 SQL 调优任务
-- 此示例在备用数据库上创建调优任务。tune_stby_wkld 任务使用 lnk_to_primary 数据库链接将数据写入打开读/写的主数据库
VAR tname VARCHAR2(30);
VAR query VARCHAR2(500);
EXEC :tname := 'tune_stby_wkld';
EXEC :query := 'SELECT /*+ FULL(t)*/ col1 FROM table1 t WHERE col1=9000';
EXEC :tname := DBMS_SQLTUNE.CREATE_TUNING_TASK(sql_text => :query,-
                 task_name => :tname, database_link_to => 'lnk_to_primary');

DELETE_SQLSET Procedure

此过程从 SQL 调优集中删除一组 SQL 语句。其语法格式如下:

DBMS_SQLTUNE.DELETE_SQLSET (
   sqlset_name   IN  VARCHAR2,
   basic_filter  IN  VARCHAR2 := NULL,
   sqlset_owner  IN  VARCHAR2 := NULL);

其参数解释如下:

其使用案例如下:

-- Delete all statements in a sql tuning set.
EXEC DBMS_SQLTUNE.DELETE_SQLSET(sqlset_name   => 'my_workload');
 
-- Delete all statements in a sql tuning set which ran for less than a second
EXEC DBMS_SQLTUNE.DELETE_SQLSET(sqlset_name   => 'my_workload', -
                                basic_filter  => 'elapsed_time < 1000000');

DROP_SQL_PROFILE Procedure

此过程从数据库中删除指定的 SQL 配置文件。其语法格式如下:

DBMS_SQLTUNE.DROP_SQL_PROFILE (
   name          IN  VARCHAR2,
   ignore        IN  BOOLEAN  := FALSE);

其参数解释如下:

注意事项:需要 DROP ANY SQL PROFILE 权限。

其使用案例如下:

-- Drop the profile:
EXEC DBMS_SQLTUNE.DROP_SQL_PROFILE(:pname);

DROP_SQLSET Procedure

如果 SQL 调优集不活动,则此过程会删除它。其语法格式如下:

DBMS_SQLTUNE.DROP_SQLSET (
   sqlset_name   IN  VARCHAR2,
   sqlset_owner  IN  VARCHAR2 := NULL); 

其参数解释如下:

注意事项:当一个或多个客户端引用 SQL 调优集时,您不能删除它。

其使用案例如下:

-- Drop the sqlset.
EXEC DBMS_SQLTUNE.DROP_SQLSET ('my_workload');

DROP_TUNING_TASK Procedure

此过程删除 SQL 调优任务。任务及其所有结果数据将被删除。其语法格式如下:

DBMS_SQLTUNE.DROP_TUNING_TASK (
 task_name         IN VARCHAR2);

其参数解释如下:


EXECUTE_TUNING_TASK Function and Procedure

此函数和过程执行先前创建的调优任务。函数和过程都在新任务执行的上下文中运行。区别在于函数版本返回新的执行名称。其语法格式如下:

DBMS_SQLTUNE.EXECUTE_TUNING_TASK (
   task_name         IN VARCHAR2,
   execution_name    IN VARCHAR2               := NULL,
   execution_params  IN dbms_advisor.argList   := NULL,
   execution_desc    IN VARCHAR2               := NULL,
   database_link_to  IN VARCHAR2               := NULL)
 RETURN VARCHAR2;

DBMS_SQLTUNE.EXECUTE_TUNING_TASK (
   task_name         IN VARCHAR2,
   execution_name    IN VARCHAR2               := NULL,
   execution_params  IN dbms_advisor.argList   := NULL,
   execution_desc    IN VARCHAR2               := NULL,
   database_link_to  IN VARCHAR2               := NULL);

其参数解释如下:

注意事项:调优任务可以执行多次而无需重新设置。

其使用案例如下:

EXEC DBMS_SQLTUNE.EXECUTE_TUNING_TASK(:stmt_task);

IMPLEMENT_TUNING_TASK Procedure

此过程实施 SQL Tuning Advisor 提出的一组 SQL 配置文件建议。执行 IMPLEMENT_TUNING_TASK 相当于执行了 SCRIPT_TUNING_TASK Function,然后运行脚本。其语法格式如下:

DBMS_SQLTUNE.IMPLEMENT_TUNING_TASK(
    task_name         IN  VARCHAR2,
    rec_type          IN  VARCHAR2 := REC_TYPE_SQL_PROFILES,
    owner_name        IN  VARCHAR2 := NULL,
    execution_name    IN  VARCHAR2 := NULL,
    database_link_to  IN  VARCHAR2 := NULL);

其参数解释如下:


INTERRUPT_TUNING_TASK Procedure

此过程会中断当前正在执行的调优任务。任务像正常退出时一样结束其操作,以便用户可以访问中间结果。其语法格式如下:

DBMS_SQLTUNE.INTERRUPT_TUNING_TASK (
 task_name         IN VARCHAR2);

其参数解释如下:

其使用案例如下:

EXEC DBMS_SQLTUNE.INTERRUPT_TUNING_TASK(:my_task);

LOAD_SQLSET Procedure

此过程使用一组选定的 SQL 语句填充 SQL 调优集。您可以多次调用该过程以添加新的 SQL 语句或替换现有语句的属性。其语法格式如下:

DBMS_SQLTUNE.LOAD_SQLSET (
   sqlset_name       IN  VARCHAR2,
   populate_cursor   IN  sqlset_cursor,
   load_option       IN VARCHAR2 := 'INSERT', 
   update_option     IN VARCHAR2 := 'REPLACE', 
   update_condition  IN VARCHAR2 :=  NULL,
   update_attributes IN VARCHAR2 :=  NULL,
   ignore_null       IN BOOLEAN  :=  TRUE,
   commit_rows       IN POSITIVE :=  NULL,
   sqlset_owner      IN VARCHAR2 := NULL);

其参数解释如下:

update_attributes 可能的值是:

  1. NULL(默认)— 指定输入游标的内容,执行上下文除外。换句话说,它相当于没有模块和动作等执行上下文的ALL
  2. BASIC — 仅指定统计信息和绑定
  3. TYPICAL — 指定带有 SQL 计划(没有行源统计信息)并且没有对象引用列表的 BASIC
  4. ALL — 指定所有属性,包括执行上下文属性,例如模块和操作
  5. 要更新的逗号分隔属性名称列表:
  • EXECUTION_CONTEXT
  • EXECUTION_STATISTICS
  • SQL_BINDS
  • SQL_PLAN
  • SQL_PLAN_STATISTICS(类似于添加了行源统计信息的 SQL_PLAN)

例外情况:

  • 当 sqlset_name 无效,或相应的 SQL 调优集不存在,或 populate_cursor 不正确而无法执行时,此过程将返回错误
  • 提供无效过滤器时也会引发异常。过滤器可能无效,因为它们不解析(例如,它们引用不在 sqlset_row 中的属性),或者因为它们违反了用户的权限

注意事项:输入 populate_cursor 中的行必须是 SQLSET_ROW 类型。

其使用案例如下:

在此示例中,您使用所有共享 SQL 区域语句创建并填充一个 SQL 调优集,其中经过时间为 5 秒或更长时间的语句不包括属于 SYS 模式的语句(以模拟应用程序用户工作负载)。您选择 SQL 语句的所有属性并使用默认模式将它们加载到调优集中,该模式仅加载新语句,因为 SQL 调优集是空的。

-- create the tuning set
EXEC DBMS_SQLTUNE.CREATE_SQLSET('my_workload');
-- populate the tuning set from the shared SQL area
DECLARE
  cur DBMS_SQLTUNE.SQLSET_CURSOR;
BEGIN
  OPEN cur FOR
    SELECT VALUE(P)
      FROM table(
        DBMS_SQLTUNE.SELECT_CURSOR_CACHE(
          'parsing_schema_name <> ''SYS'' AND elapsed_time > 5000000',
           NULL, NULL, NULL, NULL, 1, NULL,
          'ALL')) P;
 
  DBMS_SQLTUNE.LOAD_SQLSET(sqlset_name => 'my_workload', populate_cursor => cur);
END;
/

假设现在您希望使用工作负载存储库 (AWR) 中存储的信息来扩充此信息。您使用ACCUMULATE作为您的 update_option 填充调优集,因为假定当前在缓存中的游标自拍摄快照以来已经老化。

您省略了 elapsed_time 过滤器,因为假定在 AWR 中捕获的任何语句都很重要,但您仍然丢弃了 SYS 解析的游标以避免递归 SQL。

DECLARE
  cur DBMS_SQLTUNE.SQLSET_CURSOR;
BEGIN
  OPEN cur FOR
    SELECT VALUE(P)
      FROM table(
        DBMS_SQLTUNE.SELECT_WORKLOAD_REPOSITORY(1,2,
                                                'parsing_schema_name <> ''SYS''',
                                                NULL, NULL,NULL,NULL,
                                                1,
                                                NULL,
                                                'ALL')) P;

  DBMS_SQLTUNE.LOAD_SQLSET(sqlset_name     => 'my_workload',
                           populate_cursor => cur,
                           Using DBMS_SQLTUNE
                           load_option => 'MERGE',
                           update_option => 'ACCUMULATE');
END;

以下示例是一个简单的加载,它仅从工作负载存储库中插入新语句,跳过现有语句(在 SQL 调优集中)。请注意,INSERT是 LOAD_SQLSET 过程的 load_option 参数的默认值。

DECLARE
  cur sys_refcursor;
BEGIN
  OPEN cur FOR
  SELECT VALUE(P)
  FROM table(DBMS_SQLTUNE.SELECT_WORKLOAD_REPOSITORY(1,2)) P;
  DBMS_SQLTUNE.LOAD_SQLSET(sqlset_name => 'my_workload', populate_cursor => cur);
END;
/

下一个示例演示了使用 UPDATE 选项进行加载。这会更新 SQL 调优集中已存在的语句,但不会添加新语句。默认情况下,旧统计信息会被新值替换。

DECLARE
  cur sys_refcursor;
BEGIN
  OPEN cur FOR
    SELECT VALUE(P)
    FROM table(DBMS_SQLTUNE.SELECT_CURSOR_CACHE) P;
  
  DBMS_SQLTUNE.LOAD_SQLSET(sqlset_name     => 'my_workload',
                           populate_cursor => cur,
                           load_option     => 'UPDATE');
END;
/

PACK_STGTAB_SQLPROF Procedure

此过程从 SYS 复制配置文件数据。 模式到临时表中。其语法格式如下:

DBMS_SQLTUNE.PACK_STGTAB_SQLPROF (
   profile_name          IN VARCHAR2 := '%',
   profile_category      IN VARCHAR2 := 'DEFAULT',
   staging_table_name    IN VARCHAR2,
   staging_schema_owner  IN VARCHAR2 := NULL);

其参数解释如下:

安全模型:此过程需要对暂存表具有 ADMINISTER SQL MANAGEMENT OBJECT 特权和 INSERT 特权。

使用说明:此函数在打包每个 SQL 配置文件后发出 COMMIT。如果在执行过程中出现错误,则通过删除其行来清除staging表。

其使用案例如下:

仅将 DEFAULT 类别中的那些配置文件放入暂存表。这对应于该系统默认使用的所有配置文件。

EXEC DBMS_SQLTUNE.PACK_STGTAB_SQLPROF (staging_table_name => 'PROFILE_STGTAB');

这是将所有配置文件放入暂存表的另一个示例。请注意,这会移动当前默认情况下未使用但属于其他类别的配置文件,例如用于测试目的。

EXEC DBMS_SQLTUNE.PACK_STGTAB_SQLPROF (profile_category => '%', -
                                      staging_table_name => 'PROFILE_STGTAB');

PACK_STGTAB_SQLSET Procedure

此过程将一个或多个 SQL 调优集从它们在 SYS 模式中的位置复制到由 CREATE_STGTAB_SQLSET 过程创建的暂存表。其语法格式如下:

DBMS_SQLTUNE.PACK_STGTAB_SQLSET (
   sqlset_name          IN VARCHAR2,
   sqlset_owner         IN VARCHAR2 := NULL,
   staging_table_name   IN VARCHAR2,
   staging_schema_owner IN VARCHAR2 := NULL,
   db_version           IN NUMBER   := NULL);

其使用案例如下:

-- 将数据库上的所有 SQL 调优集放在暂存表中:
BEGIN 
  DBMS_SQLTUNE.PACK_STGTAB_SQLSET(
      sqlset_name        => '%'
  ,   sqlset_owner       => '%'
  ,   staging_table_name => 'STGTAB_SQLSET');
END;


-- 仅将当前用户拥有的那些 SQL 调优集放在暂存表中:
BEGIN 
  DBMS_SQLTUNE.PACK_STGTAB_SQLSET(
      sqlset_name        => '%'
  ,   staging_table_name => 'STGTAB_SQLSET');
END;


-- 打包特定的 SQL 调优集:
BEGIN 
  DBMS_SQLTUNE.PACK_STGTAB_SQLSET(
      sqlset_name         => 'my_workload'
  ,   staging_table_name  => 'STGTAB_SQLSET');
END;


-- 打包第二个 SQL 调优集:
BEGIN 
  DBMS_SQLTUNE.PACK_STGTAB_SQLSET(
      sqlset_name         => 'workload_subset'
  ,   staging_table_name  => 'STGTAB_SQLSET');
END;


-- 将 STS my_workload_subset 打包到为 Oracle Database 11g 第 1 版 (11.2) 创建的暂存表 stgtab_sqlset 中:
BEGIN
  DBMS_SQLTUNE.PACK_STGTAB_SQLSET(
      sqlset_name          => 'workload_subset'
  ,   staging_table_name   => 'STGTAB_SQLSET'
  ,   db_version           => DBMS_SQLTUNE.STS_STGTAB_11_2_VERSION);
END;

REMAP_STGTAB_SQLPROF Procedure

此过程会在执行解包操作之前更改暂存表中保存的配置文件数据值。

您可以使用此过程来更改配置文件的类别。如果系统上已存在同名配置文件,您还可以使用它来更改配置文件的名称。其语法格式如下:

DBMS_SQLTUNE.REMAP_STGTAB_SQLPROF (
  old_profile_name      IN VARCHAR2,
  new_profile_name      IN VARCHAR2 := NULL,
  new_profile_category  IN VARCHAR2 := NULL,
  staging_table_name    IN VARCHAR2,
  staging_schema_owner  IN VARCHAR2 := NULL);

其参数解释如下:

安全模型:此过程需要临时表的更新权限。

其使用案例如下:

-- 在我们解压缩之前更改配置文件的名称,以避免冲突
BEGIN 
  DBMS_SQLTUNE.REMAP_STGTAB_SQLPROF(
      old_profile_name    => :pname
  ,   new_profile_name    => 'IMP' || :pname
  ,   staging_table_name  => 'PROFILE_STGTAB');
END;


-- 在我们导入它之前,将暂存表中的 SQL 配置文件更改为“TEST”类别。 这样用户就可以在新系统激活之前测试配置文件
BEGIN
  DBMS_SQLTUNE.REMAP_STGTAB_SQLPROF(
      old_profile_name     => :pname
  ,   new_profile_category => 'TEST'
  ,   staging_table_name   => 'PROFILE_STGTAB');
END;

REMAP_STGTAB_SQLSET Procedure

此过程更改暂存表中的调优集名称和所有者,以便它们可以用不同的值解包。其语法格式如下:

DBMS_SQLTUNE.REMAP_STGTAB_SQLSET (
   old_sqlset_name        IN VARCHAR2,
   old_sqlset_owner       IN VARCHAR2 := NULL,
   new_sqlset_name        IN VARCHAR2 := NULL,
   new_sqlset_owner       IN VARCHAR2 := NULL,
   staging_table_name     IN VARCHAR2,
   staging_schema_owner   IN VARCHAR2 := NULL
   old_con_dbid           IN NUMBER   := NULL,
   new_con_dbid           IN NUMBER   := NULL);
);

注:DBMS_SQLTUNE.REMAP_STGTAB_SQLSET 和 DBMS_SQLSET.REMAP_SQLSET 过程的参数相同。

其参数解释如下:

注:多次调用此过程以重新映射多个调优集名称或所有者。此过程每次调用仅处理一个调优集。

其使用案例如下:

-- Change the name of an STS in the staging table before unpacking it.
-- 解包前更改暂存表中 STS 的名称
BEGIN 
  DBMS_SQLTUNE.REMAP_STGTAB_SQLSET(
      old_sqlset_name    => 'my_workload'                                      
  ,   old_sqlset_owner   => 'SH'
  ,   new_sqlset_name    => 'imp_workload'                                      
  ,   staging_table_name => 'STGTAB_SQLSET');
 
-- Change the owner of an STS in the staging table before unpacking it.
-- 在解包之前更改暂存表中 STS 的所有者
  DBMS_SQLTUNE.REMAP_STGTAB_SQLSET(
      old_sqlset_name    => 'imp_workload'
  ,   old_sqlset_owner   => 'SH'
  ,   new_sqlset_owner   => 'SYS'
  ,   staging_table_name => 'STGTAB_SQLSET');
END;

REMOVE_SQLSET_REFERENCE Procedure

此过程停用 SQL 调优集以指示客户端不再使用它。其语法格式如下:

DBMS_SQLTUNE.REMOVE_SQLSET_REFERENCE (
   sqlset_name   IN  VARCHAR2,
   reference_id  IN  NUMBER,
   sqlset_owner  IN  VARCHAR2 := NULL,
   force_remove  IN  NUMBER   := 0);

注:DBMS_SQLTUNE.REMOVE_SQLSET_REFERENCE 和 DBMS_SQLSET.REMOVE_REFERENCE 过程的参数相同。

其参数解释如下:

其使用案例如下:

-- 当您使用完给定的 SQL 调优集并希望使其再次可写时,您可以删除对它的引用。 以下示例删除对 my_workload 的引用:
EXEC DBMS_SQLTUNE.REMOVE_SQLSET_REFERENCE( -
                                sqlset_name   => 'my_workload', -
                                reference_id  => :rid,
                                sqlset_owner  => NULL,
                                force_remove  => 0);


-- 要查找对给定 SQL 调优集的所有引用,请查询 DBA_SQLSET_REFERENCES 视图。

REPORT_AUTO_TUNING_TASK Function

此函数显示来自自动调优任务的报告。

此函数报告一系列任务执行,而 REPORT_TUNING_TASK 函数报告单个执行。请注意,Oracle 数据库 11g 第 2 版 (11.2) 已弃用此函数,取而代之的是 DBMS_AUTO_SQLTUNE.REPORT_AUTO_TUNING_TASK。其语法格式如下:

DBMS_SQLTUNE.REPORT_AUTO_TUNING_TASK(
    begin_exec     IN VARCHAR2  := NULL,
    end_exec       IN VARCHAR2  := NULL,
    type           IN VARCHAR2  := TYPE_TEXT,
    level          IN VARCHAR2  := LEVEL_TYPICAL,
    section        IN VARCHAR2  := SECTION_ALL,
    object_id      IN NUMBER    := NULL,
    result_limit   IN NUMBER    := NULL)
  RETURN CLOB;

其参数解释如下:

其返回值为:包含所需报告的 CLOB。


REPORT_SQL_DETAIL Function

此函数为特定 SQLID 构建报告。对于每个 SQLID,它提供从 V$ 视图和 AWR 获得的各种统计信息和详细信息。其语法格式如下:

DBMS_SQLTUNE.REPORT_SQL_DETAIL (
   sql_id                   IN  VARCHAR2   DEFAULT NULL,
   sql_plan_hash_value      IN  NUMBER     DEFAULT NULL,
   start_time               IN  DATE       DEFAULT NULL,
   duration                 IN  NUMBER     DEFAULT NULL,
   inst_id                  IN  NUMBER     DEFAULT NULL,
   dbid                     IN  NUMBER     DEFAULT NULL,
   event_detail             IN  VARCHAR2   DEFAULT 'YES',
   bucket_max_count         IN  NUMBER     DEFAULT 128,
   bucket_interval          IN  NUMBER     DEFAULT NULL,
   top_n                    IN  NUMBER     DEFAULT 10,
   report_level             IN  VARCHAR2   DEFAULT 'TYPICAL',
   type                     IN  VARCHAR2   DEFAULT 'ACTIVE',
   data_source              IN  VARCHAR2   DEFAULT 'AUTO',
   end_time                 IN  DATE       DEFAULT NULL,
   duration_stats           IN  NUMBER     DEFAULT NULL,
   con_name                 IN  VARCHAR2   DEFAULT NULL)
RETURN CLOB;

其参数解释如下:

报告的详细程度,'BASIC','TYPICAL'or 'ALL'。 默认假定为“典型”。它们的含义解释如下。此外,还可以使用a +/- *section_name*启用或禁用各个报告部分。定义了几个部分:

  • ‘TOP’- 显示 SQL 语句的 ASH 维度的最高值;默认开启
  • ‘SPM’- 显示 SQL 语句的现有计划基线;默认关闭
  • ‘MISMATCH’- 显示创建新子游标的原因(违反共享标准);默认关闭。
  • ‘STATS’- 显示来自 GV$SQLAREA_PLAN_HASH 的每个计划的 SQL 执行统计信息;默认开启
  • ‘ACTIVITY’ - 显示来自 ASH 的每个 SQL 语句计划的最高活动;默认开启
  • ‘ACTIVITY_ALL’ - 显示 ASH 中 SQL 语句计划的每一行的最高活动;默认关闭
  • ‘HISTOGRAM’ - 显示 SQL 语句的每个计划的活动直方图(计划时间线直方图);默认开启
  • ‘SESSIONS’ - 显示每个 SQL 语句计划的顶级会话的活动;默认关闭
  • ‘MONITOR’ - 显示每个执行计划显示一个受监控的 SQL 执行;默认开启
  • ‘XPLAN’ - 显示执行计划;默认开启
  • ‘BINDS’ - 显示捕获的绑定数据;默认开启

此外,还可以在不同级别指定 SQL 文本:

  • -SQL_TEXT - 报告中没有 SQL 文本
  • +SQL_TEXT - OK 部分 SQL 文本最多前 2000 个字符存储在 GV$SQL_MONITOR
  • -SQL_FULLTEXT - 没有完整的 SQL 文本 (+SQL_TEXT)
  • +SQL_FULLTEXT - 显示完整的 SQL 文本(默认值)

三个顶层报告层级的含义分别是:

  • NONE - 最小可能
  • BASIC - SQL_TEXT+STATS+ACTIVITY+HISTOGRAM
  • TYPICAL - SQL_FULLTEXT+TOP+STATS+ACTIVITY+HISTOGRAM+XPLAN+MONITOR
  • ALL - 一切

只能指定这 4 个级别中的一个,如果是,它必须位于 REPORT_LEVEL 字符串的开头



安全模型:调用者需要对 DBMS_XPLAN 包的 EXECUTE 特权。

返回值:包含所需报告的 CLOB。

使用说明:

  1. ACTIVE 报告具有类似于 Enterprise Manager 的丰富的交互式用户界面,同时不需要安装任何 EM。构建的报告文件是 HTML 格式,因此大多数现代浏览器都可以解释它。首次查看报告时,网络浏览器会透明下载支持活动报告的代码,因此查看它需要外部连接
  2. 调用者需要对以下视图的 SELECT 或 READ 权限:
  • V$SESSION
  • DBA_ADVISOR_FINDINGS
  • V$DATABASE
  • GV$ASH_INFO
  • GV$ACTIVE_SESSION_HISTORY
  • GV$SQLAREA_PLAN_HASH
  • GV$SQL
  • DBA_HIST_SNAPSHOT
  • DBA_HIST_WR_CONTROL
  • DBA_HIST_ACTIVE_SESS_HISTORY
  • DBA_HIST_SQLSTAT
  • DBA_HIST_SQL_BIND_METADATA
  • DBA_HIST_SQLTEXT
  • DBA_SQL_PLAN_BASELINES
  • DBA_SQL_PROFILES
  • DBA_ADVISOR_TASKS
  • DBA_SERVICES
  • DBA_USERS
  • DBA_OBJECTS
  • DBA_PROCEDURES

REPORT_SQL_MONITOR Function

此函数为代表目标语句执行收集的监视信息构建报告(文本、简单 HTML、活动 HTML、XML)。其语法格式如下:

DBMS_SQLTUNE.REPORT_SQL_MONITOR(
   sql_id                    IN VARCHAR2  DEFAULT  NULL,
   dbop_name                 IN VARCHAR2  DEFAULT  NULL,
   dbop_exec_id              IN NUMBER    DEFAULT  NULL,
   session_id                IN NUMBER    DEFAULT  NULL,
   session_serial            IN NUMBER    DEFAULT  NULL,
   sql_exec_start            IN DATE      DEFAULT  NULL,
   sql_exec_id               IN NUMBER    DEFAULT  NULL,
   inst_id                   IN NUMBER    DEFAULT  NULL,
   start_time_filter         IN DATE      DEFAULT  NULL,
   end_time_filter           IN DATE      DEFAULT  NULL,
   instance_id_filter        IN NUMBER    DEFAULT  NULL,
   parallel_filter           IN VARCHAR2  DEFAULT  NULL,
   plan_line_filter          IN NUMBER    DEFAULT  NULL,
   event_detail              IN VARCHAR2  DEFAULT  'YES',
   bucket_max_count          IN NUMBER    DEFAULT  128,
   bucket_interval           IN NUMBER    DEFAULT  NULL,
   base_path                 IN VARCHAR2  DEFAULT  NULL,
   last_refresh_time         IN DATE      DEFAULT  NULL,
   report_level              IN VARCHAR2  DEFAULT 'TYPICAL',
   type                      IN VARCHAR2  DEFAULT 'TEXT',
   sql_plan_hash_value       IN NUMBER    DEFAULT  NULL,
   con_name                  IN VARCHAR2  DEFAULT  NULL,
   report_id                 IN NUMBER    DEFAULT  NULL)
 RETURN CLOB;

其参数解释如下:

仅适用于并行执行并允许仅报告并行执行中涉及的进程子集的活动(查询协调器和/或并行执行服务器)。该参数的值可以是:

  • NULL 以所有进程为目标
  • [qc][servers(<svr_grp>[,] <svr_set>[,] <srv_num>)]:“qc”代表查询协调器,servers() 规定要考虑哪些 PX 服务器。

以下示例显示了如何定位并行进程的子集:

  • qc:仅针对查询协调器
  • servers(1):以组号 1 中的所有并行执行服务器为目标。请注意,并行运行的语句有一个主服务器组(组号 1)加上一个附加组,用于并行运行的每个嵌套子查询
  • servers(,2):以来自任何组的所有并行执行服务器为目标,但仅在每个组的第 1 组中运行(每个组最多有两组并行执行服务器)
  • servers(1,1):只考虑组 1,集合 1
  • servers(1,2,4):仅考虑第 1 组,第 2 组,服务器编号 4。此报告针对单个并行服务器进程
  • qc servers(1,2,4):与上面相同,还包括查询协调器

report_level解释如下:

报告的详细程度:'NONE', 'BASIC','TYPICAL'or 'ALL'。默认假定为“典型”。此外,还可以使用 +/- section_name 启用或禁用各个报告部分。定义了几个部分:

  • ‘XPLAN’- 显示解释计划;默认开启
  • ‘PLAN’- 显示计划监控统计;默认开启
  • ‘SESSIONS’- 显示会话详细信息。仅适用于并行查询;默认开启
  • ‘INSTANCE’- 显示实例详细信息。仅适用于并行和交叉实例;默认开启
  • ‘PARALLEL’- 用于指定会话+实例详细信息的伞形参数
  • ‘ACTIVITY’ - 在全局级别、计划行级别和会话或实例级别(如果适用)显示活动摘要;默认开启
  • ‘BINDS’ - 可用时显示绑定信息;默认开启
  • ‘METRICS’ - 显示随时间推移的指标数据(CPU、I/O、…);默认开启
  • ‘ACTIVITY_HISTOGRAM’ - 显示整体查询活动的直方图;默认开启
  • ‘PLAN_HISTOGRAM’ - 在计划线级别显示活动直方图;默认关闭
  • ‘OTHER’ - 其他信息;默认开启

此外,还可以在不同级别指定 SQL 文本:

  • SQL_TEXT - 报告中没有 SQL 文本
  • +SQL_TEXT - OK 部分 SQL 文本最多前 2000 个字符存储在 GV$SQL_MONITOR
  • -SQL_FULLTEXT - 没有完整的 SQL 文本 (+SQL_TEXT)
  • +SQL_FULLTEXT - 显示完整的 SQL 文本(默认值)

report_level (contd.) 解释如下:三个顶层报告层级的含义分别是:

  • NONE - 最小可能
  • +BASIC - SQL_TEXT-PLAN-XPLAN-SESSIONS-INSTANCE-ACTIVITY_HISTOGRAM-PLAN_HISTOGRAM-METRICS
  • TYPICAL - 除PLAN_HISTOGRAM之外的一切
  • ALL - everything

只能指定这 4 个级别中的一个,如果是,它必须位于 REPORT_LEVEL 字符串的开头


其返回值为:包含所需报告的 CLOB。

使用说明:

  1. 此报告的目标 SQL 语句可以是:

    • Oracle 数据库监控的最新 SQL 语句。这是默认行为,因此无需指定任何参数
    • 由特定会话执行并由 Oracle 监视的最新 SQL 语句。会话由其会话 ID 和可选的序列号标识。例如,对当前会话使用 session_id => 或对会话 ID 20、序列号 103 使用 session_id => 20、session_serial => 103
    • 由其 sql_id 标识的特定语句的最近执行
    • SQL 语句的特定执行由其执行键(sql_id、sql_exec_start 和 sql_exec_id)标识
  2. 该报告生成由下面列出的几个固定视图公开的性能数据。为此,报表函数的调用者必须具有从这些固定视图中选择数据的权限(例如 SELECT_CATALOG 角色)

    • GV$SQL_MONITOR
    • GV$SQL_PLAN_MONITOR
    • GV$SQL_PLAN
    • GV$ACTIVE_SESSION_HISTORY
    • GV$SESSION_LONGOPS
    • GV$SQL
  3. bucket_max_count 和 bucket_interval 参数控制活动直方图。默认情况下,最大桶数设置为 128。数据库根据此计数得出 bucket_interval 值。计算 bucket_interval(值以秒为单位),使其成为 2 值的最小可能幂(从 1 秒开始),而不超过最大桶数。例如,如果查询已执行 600 秒,则数据库选择 8 秒(2 的幂)的 bucket_interval。数据库选择值 8,因为 600/8 = 74,小于 128 个桶的最大值。小于 8 秒将是 4 秒,这将导致比最大值 128 个更多的桶。如果指定了 bucket_interval,那么数据库将使用指定的值而不是从 bucket_max_count 派生

  4. ACTIVE 报告具有类似于 Enterprise Manager 的丰富的交互式用户界面,同时不需要安装任何 EM。报告文件为 HTML 格式。首次查看报告时,Web 浏览器会透明地下载支持活动报告的代码。因此,查看报告需要外部连接


REPORT_SQL_MONITOR_LIST Function

此函数为 Oracle 数据库监视的所有语句或语句子集构建报告。对于每条语句,子程序都会提供关键信息和相关的全局统计信息。

使用 REPORT_SQL_MONITOR 函数获取单个 SQL 语句的详细监控信息。其语法格式如下:

DBMS_SQLTUNE.REPORT_SQL_MONITOR_LIST(
   sql_id                    IN VARCHAR2  DEFAULT  NULL,
   session_id                IN NUMBER    DEFAULT  NULL,
   session_serial            IN NUMBER    DEFAULT  NULL,
   inst_id                   IN NUMBER    DEFAULT  NULL,
   active_since_date         IN DATE      DEFAULT  NULL,
   active_since_sec          IN NUMBER    DEFAULT  NULL,
   active_before_date        IN DATE      DEFAULT  NULL,
   last_refresh_time         IN DATE      DEFAULT  NULL,
   dbop_name                 IN VARCHAR2  DEFAULT  NULL,
   monitor_type              IN NUMBER    DEFAULT  MONITOR_TYPE_ALL,
   max_sqltext_length        IN NUMBER    DEFAULT  NULL,
   top_n_count               IN NUMBER    DEFAULT  NULL,
   top_n_rankby              IN VARCHAR2  DEFAULT  'LAST_ACTIVE_TIME',
   report_level              IN VARCHAR2  DEFAULT  'TYPICAL',
   auto_refresh              IN NUMBER    DEFAULT  NULL,
   base_path                 IN VARCHAR2  DEFAULT  NULL,
   type                      IN VARCHAR2  DEFAULT 'TEXT',
   con_name                  IN VARCHAR2  DEFAULT  NULL,
   top_n_detail_count        IN NUMBER    DEFAULT  NULL)
 RETURN CLOB;

其参数解释如下:

返回值为:已监视的 SQL 语句列表的报告。报告类型是文本、XML 或 HTML。

使用说明:您必须有权访问以下固定视图:GV$SQL_MONITORGV$SQL


REPORT_TUNING_TASK Function

此函数显示调优任务的结果。 默认情况下,报告为文本格式。其语法格式如下:

DBMS_SQLTUNE.REPORT_TUNING_TASK(
   task_name        IN   VARCHAR2,
   type             IN   VARCHAR2   := 'TEXT',
   level            IN   VARCHAR2   := 'TYPICAL',
   section          IN   VARCHAR2   := ALL,
   object_id        IN   NUMBER     := NULL,
   result_limit     IN   NUMBER     := NULL,
   owner_name       IN   VARCHAR2   := NULL,
   execution_name   IN   VARCHAR2   := NULL,
   database_link_to IN   VARCHAR2   := NULL)
RETURN CLOB;

其参数解释如下:

其返回值为:包含所需报告的 CLOB。

其使用案例如下:

-- Display the report for a single statement.
-- 显示单个语句的报告
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK(:stmt_task) 
FROM   DUAL;
 
-- Display the summary for a SQL tuning set.
-- 显示 SQL 调优集的摘要
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK(:sts_task, 'TEXT', 'TYPICAL', 'SUMMARY')
FROM   DUAL;
 
-- Display the findings for a specific statement.
-- 显示特定语句的结果
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK(:sts_task, 'TEXT', 'TYPICAL','FINDINGS', 5)
FROM   DUAL;

REPORT_TUNING_TASK_XML Function

此函数显示调优任务的 XML 报告。其语法格式如下:

DBMS_SQLTUNE.REPORT_TUNING_TASK_LIST_XML(
   task_name        IN   VARCHAR2   := NULL,
   level            IN   VARCHAR2   := LEVEL_TYPICAL,
   section          IN   VARCHAR2   := SECTION_ALL,
   object_id        IN   NUMBER     := NULL,
   result_limit     IN   NUMBER     := 160,
   owner_name       IN   VARCHAR2   := NULL,
   execution_name   IN   VARCHAR2   := NULL,
   autotune_period  IN   NUMBER     := NULL,
   report_tag       IN   VARCHAR2   := NULL)
RETURN XMLTYPE;

其参数解释如下:

返回值为:包含所需报告的 CLOB。


RESET_TUNING_TASK Procedure

在当前未执行的调优任务上调用此过程以准备重新执行。其语法格式如下:

DBMS_SQLTUNE.RESET_TUNING_TASK(
 task_name         IN VARCHAR2);

其参数解释如下:

其使用案例如下:

-- reset and re-execute a task
EXEC DBMS_SQLTUNE.RESET_TUNING_TASK(:sts_task);
 
-- re-execute the task
EXEC DBMS_SQLTUNE.EXECUTE_TUNING_TASK(:sts_task);

RESUME_TUNING_TASK Procedure

此过程恢复先前中断的任务,该任务是为处理 SQL 调优集而创建的。其语法格式如下:

DBMS_SQLTUNE.RESUME_TUNING_TASK(
 task_name         IN VARCHAR2,
 basic_filter      IN VARCHAR2 := NULL);

其参数解释如下:

使用说明:不支持恢复单个 SQL 调优任务(与 SQL 调优集相比,为调优单个 SQL 语句而创建的任务)。

其使用案例如下:

-- Interrupt the task
-- 中断任务
EXEC DBMS_SQLTUNE.INTERRUPT_TUNING_TASK(:conc_task);
 
-- Once a task is interrupted, we can elect to reset it, resume it, or check
-- out its results and then decide.  For this example we will just resume.
-- 一旦任务被中断,我们可以选择重置它、恢复它或检查它的结果然后再决定。 对于这个例子,我们将继续
 
EXEC DBMS_SQLTUNE.RESUME_TUNING_TASK(:conc_task);

SCHEDULE_TUNING_TASK Function

此函数为单个 SQL 语句创建调优任务并调度 DBMS_SCHEDULER 作业来执行调优任务。该函数的一种形式在共享 SQL 区域中查找有关要调优的语句的信息,而另一种形式在 AWR 中查找信息。其语法格式如下:

-- Shared SQL Area Format:
DBMS_SQLTUNE.SCHEDULE_TUNING_TASK(
  sql_id          IN VARCHAR2,
  plan_hash_value IN NUMBER                   := NULL,
  start_date      IN TIMESTAMP WITH TIME ZONE := NULL,   
  scope           IN VARCHAR2                 := SCOPE_COMPREHENSIVE,   
  time_limit      IN NUMBER                   := TIME_LIMIT_DEFAULT,
  task_name       IN VARCHAR2                 := NULL,    
  description     IN VARCHAR2                 := NULL,
  con_name        IN VARCHAR2                 := NULL)
RETURN VARCHAR2;

-- AWR Format:
DBMS_SQLTUNE.SCHEDULE_TUNING_TASK(
  begin_snap      IN NUMBER,
  end_snap        IN NUMBER,
  sql_id          IN VARCHAR2,
  plan_hash_value IN NUMBER                   := NULL,    
  start_date      IN TIMESTAMP WITH TIME ZONE := NULL,   
  scope           IN VARCHAR2                 := SCOPE_COMPREHENSIVE,   
  time_limit      IN NUMBER                   := TIME_LIMIT_DEFAULT,
  task_name       IN VARCHAR2                 := NULL,    
  description     IN VARCHAR2                 := NULL,
  con_name        IN VARCHAR2                 := NULL,
  dbid            IN NUMBER                   := NULL)
RETURN VARCHAR2;

其参数解释如下:

安全模型:调用者必须拥有该作业的 CREATE JOB 权限。

返回值为:每个用户唯一的 SQL 调优任务名称。多个用户可以为他们的顾问任务分配相同的名称。

使用说明:

  • 该任务仅安排一次
  • 调度程序作业的名称创建如下:sqltune_job_taskid_orahash(systimestamp)

SCRIPT_TUNING_TASK Function

此函数创建一个 SQL*Plus 脚本,然后可以执行该脚本以实施一组 SQL Tuning Advisor 建议。其语法格式如下:

DBMS_SQLTUNE.SCRIPT_TUNING_TASK(
  task_name         IN VARCHAR2,
  rec_type          IN VARCHAR2  := REC_TYPE_ALL,
  object_id         IN NUMBER    := NULL,
  result_limit      IN NUMBER    := NULL,
  owner_name        IN VARCHAR2  := NULL,
  execution_name    IN VARCHAR2  := NULL,
  database_link_to  IN VARCHAR2  := NULL)
 RETURN CLOB;

其参数解释如下:

返回值为:以 CLOB 的形式返回脚本。

使用说明:

  • 脚本返回后,在执行之前检查它
  • 调用 DBMS_ADVISOR.CREATE_FILE 将其放入文件中

其使用案例如下:

SET LINESIZE 140
 
-- Get a script for all actions recommended by the task.
-- 获取任务推荐的所有操作的脚本
SELECT DBMS_SQLTUNE.SCRIPT_TUNING_TASK(:stmt_task) FROM DUAL;
 
-- Get a script of only the sql profiles we should create.
-- 获取仅包含我们应创建的 sql 配置文件的脚本
SELECT DBMS_SQLTUNE.SCRIPT_TUNING_TASK(:stmt_task, 'PROFILES') FROM DUAL;
 
-- Get a script of only stale / missing stats
-- 获取仅包含陈旧/缺失统计信息的脚本
SELECT DBMS_SQLTUNE.SCRIPT_TUNING_TASK(:stmt_task, 'STATISTICS') FROM DUAL;
 
-- Get a script with recommendations about only one SQL statement when we have
-- tuned an entire STS.
-- 当我们调优了整个 STS 时,获取一个脚本,其中仅包含关于一个 SQL 语句的建议
SELECT DBMS_SQLTUNE.SCRIPT_TUNING_TASK(:sts_task, 'ALL', 5) FROM DUAL;

SELECT_CURSOR_CACHE

此函数从共享 SQL 区域收集 SQL 语句。其语法格式如下:

DBMS_SQLTUNE.SELECT_CURSOR_CACHE (
  basic_filter        IN   VARCHAR2 := NULL,
  object_filter       IN   VARCHAR2 := NULL,
  ranking_measure1    IN   VARCHAR2 := NULL,
  ranking_measure2    IN   VARCHAR2 := NULL,
  ranking_measure3    IN   VARCHAR2 := NULL,
  result_percentage   IN   NUMBER   := 1,
  result_limit        IN   NUMBER   := NULL,
  attribute_list      IN   VARCHAR2 := NULL,
  recursive_sql       IN   VARCHAR2 := HAS_RECURSIVE_SQL)
 RETURN sys.sqlset PIPELINED;

其参数解释如下:

attribute_list解释:指定要在结果中返回的 SQL 语句属性列表。可能的值是:

  1. TYPICAL — 指定 BASIC plus SQL 计划(没有行源统计信息)并且没有对象引用列表(默认)
  2. BASIC — 指定除计划之外的所有属性(例如执行统计信息和绑定)。执行上下文始终是结果的一部分
  3. ALL — 指定所有属性
  4. Comma 逗号分隔的属性名称列表。此值仅返回 SQL 属性的一个子集:
  • EXECUTION_STATISTICS
  • BIND_LIST
  • OBJECT_LIST
  • SQL_PLAN
  • SQL_PLAN_STATISTICS — 类似SQL_PLAN加上行源统计

返回值为:此函数针对每个数据源中找到的每个 SQL_ID 或 PLAN_HASH_VALUE 对返回一个 SQLSET_ROW。

使用说明:

  • 提供给该函数的过滤器作为当前用户运行的 SQL 的一部分进行评估。因此,它们以该用户的安全权限执行,并且可以包含用户可以访问的任何构造和子查询,但仅此而已
  • 用户需要对共享 SQL 区域视图具有特权

其使用案例如下:

-- Get sql ids and sql text for statements with 500 buffer gets.
-- 为具有 500 个缓冲区获取的语句获取 sql id 和 sql 文本
SELECT sql_id, sql_text 
FROM table(DBMS_SQLTUNE.SELECT_CURSOR_CACHE('buffer_gets > 500')) 
ORDER BY sql_id;
 
-- Get all the information we have about a particular statement.
-- 获取我们拥有的关于特定语句的所有信息
SELECT * 
FROM table(DBMS_SQLTUNE.SELECT_CURSOR_CACHE('sql_id = ''4rm4183czbs7j'''));
 
-- Notice that some statements can have multiple plans.  The output of the
-- SELECT_XXX table functions is unique by (sql_id, plan_hash_value).  This is
-- because a data source can store multiple plans per sql statement.
-- 请注意,某些语句可以有多个计划。SELECT_XXX 表函数的输出是唯一的(sql_id,plan_hash_value)。这是因为数据源可以为每个 sql 语句存储多个计划
SELECT sql_id, plan_hash_value
FROM table(dbms_sqltune.select_cursor_cache('sql_id = ''ay1m3ssvtrh24'''))
ORDER BY sql_id, plan_hash_value;
 
-- PL/SQL examples: load_sqlset is called after opening a cursor, along the
-- lines given below
-- PL/SQL 示例:load_sqlset 在打开游标后调用,如下所示
 
-- Select all statements in the shared SQL area.
-- 选择共享SQL区的所有语句
DECLARE
  cur sys_refcursor;
BEGIN
  OPEN cur FOR
    SELECT value(P) 
    FROM table(DBMS_SQLTUNE.SELECT_CURSOR_CACHE) P;
 
  -- Process each statement (or pass cursor to load_sqlset).
  -- 处理每个语句(或将游标传递给 load_sqlset)
 
  CLOSE cur;
END;/
 
 
-- Look for statements not parsed by SYS.
-- 查找未被 SYS 解析的语句
DECLARE
  cur sys_refcursor;
BEGIN
  OPEN cur for
    SELECT VALUE(P) 
    FROM table(
     DBMS_SQLTUNE.SELECT_CURSOR_CACHE('parsing_schema_name <> ''SYS''')) P;
 
  -- Process each statement (or pass cursor to load_sqlset).
  -- 处理每个语句(或将游标传递给 load_sqlset)
 
  CLOSE cur;
end;/
 
 
-- All statements from a particular module/action.
-- 来自特定模块/操作的所有语句
DECLARE
  cur sys_refcursor;
BEGIN
  OPEN cur FOR
    SELECT VALUE(P) 
    FROM table(
      DBMS_SQLTUNE.SELECT_CURSOR_CACHE(
         'module = ''MY_APPLICATION'' and action = ''MY_ACTION''')) P;
 
  -- Process each statement (or pass cursor to load_sqlset)
  -- 处理每个语句(或将游标传递给 load_sqlset)
 
  CLOSE cur;
END;/
 
 
-- all statements that ran for at least five seconds
-- 运行至少五秒钟的所有语句
DECLARE
  cur sys_refcursor;
BEGIN
  OPEN cur FOR
    SELECT VALUE(P) 
    FROM table(DBMS_SQLTUNE.SELECT_CURSOR_CACHE('elapsed_time > 5000000')) P;
 
  -- Process each statement (or pass cursor to load_sqlset)
  -- 处理每个语句(或将游标传递给 load_sqlset)
 
  CLOSE cur;
end;/
 
 
-- select all statements that pass a simple buffer_gets threshold and 
-- are coming from an APPS user
-- 选择所有通过简单 buffer_gets 阈值且来自 APPS 用户的语句
DECLARE
  cur sys_refcursor;
BEGIN
  OPEN cur FOR
    SELECT VALUE(P) 
    FROM table(
      DBMS_SQLTUNE.SELECT_CURSOR_CACHE(
        'buffer_gets > 100 and parsing_schema_name = ''APPS'''))P;
 
  -- Process each statement (or pass cursor to load_sqlset)
  -- 处理每个语句(或将游标传递给 load_sqlset)
 
  CLOSE cur;
end;/
 
 
-- select all statements exceeding 5 seconds in elapsed time, but also
-- select the plans (by default we only select execution stats and binds
-- for performance reasons - in this case the SQL_PLAN attribute of sqlset_row
-- is NULL) 
-- 选择所有运行时间超过 5 秒的语句,但也选择计划(默认情况下,出于性能原因,我们只选择执行统计和绑定——在这种情况下,sqlset_row 的 SQL_PLAN 属性为 NULL)
DECLARE
  cur sys_refcursor;
BEGIN
  OPEN cur FOR
    SELECT VALUE(P) 
    FROM table(dbms_sqltune.select_cursor_cache(
      'elapsed_time > 5000000', NULL, NULL, NULL, NULL, 1, NULL,
      'EXECUTION_STATISTICS, SQL_BINDS, SQL_PLAN')) P;
 
  -- Process each statement (or pass cursor to load_sqlset)
  -- 处理每个语句(或将游标传递给 load_sqlset)
 
  CLOSE cur;
END;/
 
 
-- Select the top 100 statements in the shared SQL area ordering by elapsed_time.
-- 选择共享SQL区中按elapsed_time排序的前100条语句
DECLARE
  cur sys_refcursor;
BEGIN
  OPEN cur FOR
    SELECT VALUE(P) 
    FROM table(DBMS_SQLTUNE.SELECT_CURSOR_CACHE(NULL,
                                                NULL,
                                                'ELAPSED_TIME', NULL, NULL,
                                                1,
                                                100)) P;
 
  -- Process each statement (or pass cursor to load_sqlset)
  -- 处理每个语句(或将游标传递给 load_sqlset)
 
  CLOSE cur;
end;/
 
 
-- Select the set of statements which cumulatively account for 90% of the 
-- buffer gets in the shared SQL area.  This means that the buffer gets of all
-- of these statements added up is approximately 90% of the sum of all 
-- statements currently in the cache.
-- 选择累计占共享SQL区buffer gets 90%的语句集。这意味着所有这些语句的缓冲区获取加起来大约是当前缓存中所有语句总和的 90%
DECLARE
  cur sys_refcursor;
BEGIN
  OPEN cur FOR
    SELECT VALUE(P) 
    FROM table(DBMS_SQLTUNE.SELECT_CURSOR_CACHE(NULL,
                                                NULL,
                                                'BUFFER_GETS', NULL, NULL,
                                                .9)) P;
 
  -- Process each statement (or pass cursor to load_sqlset).
  -- 处理每个语句(或将游标传递给 load_sqlset)
 
  CLOSE cur;
END;
/

SELECT_SQL_TRACE Function

此表函数读取一个或多个跟踪文件的内容,并以 sqlset_row 的格式返回它找到的 SQL 语句。其语法格式如下:

DBMS_SQLTUNE.SELECT_SQL_TRACE (
  directory              IN VARCHAR2,
  file_name              IN VARCHAR2 := NULL,
  mapping_table_name     IN VARCHAR2 := NULL,
  mapping_table_owner    IN VARCHAR2 := NULL,,
  select_mode            IN POSITIVE := SINGLE_EXECUTION,
  options                IN BINARY_INTEGER := LIMITED_COMMAND_TYPE,
  pattern_start          IN VARCHAR2 := NULL,
  pattern_end            IN VARCHAR2 := NULL,
  result_limit           IN POSITIVE := NULL)
 RETURN sys.sqlset PIPELINED;

其参数解释如下:

返回值为:该函数返回一个 SQLSET_ROW 对象。

使用说明:

  • 为系统目录创建目录对象的能力会产生潜在的安全问题。例如,在 CDB 中,所有容器都将跟踪文件写入同一目录。对该目录具有 SELECT 权限的本地用户可以读取属于任何容器的跟踪文件的内容
  • 要防止此类未经授权的访问,请将文件从默认的 SQL 跟踪目录复制到不同的目录,然后创建一个目录对象。使用 CREATE PLUGGABLE DATABASE 语句的 PATH_PREFIX 子句确保与 PDB 关联的所有目录对象路径都限制在指定目录或其子目录中

其使用案例如下:

以下代码显示了如何为一些 SQL 语句启用 SQL 跟踪并将结果加载到 SQL 调优集中:

-- turn on the SQL trace in the capture database
-- 在捕获数据库中打开 SQL 跟踪
ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 4'

-- run sql statements
-- 运行sql语句
SELECT 1 FROM DUAL;
SELECT COUNT(*) FROM dba_tables WHERE table_name = :mytab;
 
ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT OFF';
 
-- create mapping table from the capture database
-- 从捕获数据库创建映射表
CREATE TABLE mapping AS
SELECT object_id id, owner, substr(object_name, 1, 30) name
   FROM dba_objects
   WHERE object_type NOT IN ('CONSUMER GROUP', 'EVALUATION CONTEXT',
                             'FUNCTION', 'INDEXTYPE', 'JAVA CLASS',
                             'JAVA DATA', 'JAVA RESOURCE', 'LIBRARY',
                             'LOB', 'OPERATOR', 'PACKAGE',
                             'PACKAGE BODY', 'PROCEDURE', 'QUEUE',
                             'RESOURCE PLAN', 'TRIGGER', 'TYPE',
                             'TYPE BODY')
UNION ALL
SELECT user_id id, username owner, NULL name
   FROM dba_users;
 
-- create the directory object where the SQL traces are stored
-- 创建存储 SQL 跟踪的目录对象
CREATE DIRECTORY SQL_TRACE_DIR as '/home/foo/trace';

-- create the STS
-- 创建 STS
EXEC DBMS_SQLTUNE.CREATE_SQLSET('my_sts', 'test purpose');
 
-- load the SQL statements into STS from SQL TRACE
-- 从 SQL TRACE 加载 SQL 语句到 STS
DECLARE
   cur sys_refcursor;
BEGIN
   OPEN cur FOR
   SELECT value(p)
     FROM TABLE(
        DBMS_SQLTUNE.SELECT_SQL_TRACE(
           directory=>'SQL_TRACE_DIR',
           file_name=>'%trc',
           mapping_table_name=>'mapping')) p;
   DBMS_SQLTUNE.LOAD_SQLSET('my_sts', cur);
   CLOSE cur;
END;
/ 

SELECT_SQLPA_TASK Function

此函数从 SQL Performance Analyzer 比较任务中收集 SQL 语句。其语法格式如下:

DBMS_SQLTUNE.SELECT_SQLPA_TASK(
    task_name         IN VARCHAR2,
    task_owner        IN VARCHAR2 := NULL,
    execution_name    IN VARCHAR2 := NULL,
    level_filter      IN VARCHAR2 := 'REGRESSED',
    basic_filter      IN VARCHAR2 := NULL,
    object_filter     IN VARCHAR2 := NULL,
    attribute_list    IN VARCHAR2 := 'TYPICAL')
RETURN sys.sqlset PIPELINED;

其参数解释如下:

level_filter解释:指定要包括的 SQL 语句子集。与 DBMS_SQLPA.REPORT_ANALYSIS_TASK.LEVEL 相同的格式,删除了一些可能的字符串。

  • IMPROVED 仅包括改进的 SQL
  • REGRESSED 仅包含回归的 SQL(默认)
  • CHANGED 仅包括性能发生变化的 SQL
  • UNCHANGED 仅包括性能不变的 SQL
  • CHANGED_PLANS 仅包含具有计划更改的 SQL
  • UNCHANGED_PLANS 仅包括计划未更改的 SQL
  • ERRORS 仅包含有错误的 SQL
  • MISSING_SQL 仅包含缺失的 SQL 语句(跨 STS)
  • NEW_SQL 仅包含新的 SQL 语句(跨 STS)

attribute_list解释:定义要在结果中返回的 SQL 语句属性。可能的值是:

  • TYPICAL — 返回 BASIC 加上 SQL 计划(没有行源统计信息)并且没有对象引用列表。这是默认设置
  • BASIC — 返回除计划之外的所有属性(例如执行统计信息和绑定)。执行上下文始终是结果的一部分
  • ALL — 返回所有属性
  • Comma 逗号分隔的属性名称列表,这允许仅返回 SQL 属性的一个子集:EXECUTION_STATISTICS、SQL_BINDS、SQL_PLAN_STATISTICS(类似于 SQL_PLAN + 行源统计信息)

返回值为:此函数返回一个 SQL 调整集对象。

使用说明:例如,您可以使用此函数创建一个 SQL 调优集,其中包含在 SQL 性能分析器 (SPA) 实验期间回归的 SQL 语句的子集。您还可以指定其他任意过滤器。


SELECT_SQLSET Function

这是一个读取 SQL 调整集内容的表函数。其语法格式如下:

DBMS_SQLTUNE.SELECT_SQLSET (
  sqlset_name         IN   VARCHAR2,
  basic_filter        IN   VARCHAR2 := NULL,
  object_filter       IN   VARCHAR2 := NULL,
  ranking_measure1    IN   VARCHAR2 := NULL,
  ranking_measure2    IN   VARCHAR2 := NULL,
  ranking_measure3    IN   VARCHAR2 := NULL,
  result_percentage   IN   NUMBER   := 1,
  result_limit        IN   NUMBER   := NULL)
  attribute_list      IN   VARCHAR2 := NULL,
  plan_filter         IN   VARCHAR2 := NULL,
  sqlset_owner        IN   VARCHAR2 := NULL,
  recursive_sql       IN   VARCHAR2 := HAS_RECURSIVE_SQL)
 RETURN sys.sqlset PIPELINED;

其参数解释如下:

attribute_list解释:定义要在结果中返回的 SQL 语句属性。可能的值是:

  1. BASIC — 返回除计划之外的所有属性(例如执行统计信息和绑定)。执行上下文包含在结果中

  2. TYPICAL — 返回 BASIC 加上 SQL 计划,但没有行源统计信息和对象引用列表。这是默认设置

  3. ALL — 返回所有属性

  4. Comma 逗号分隔的属性名称列表。此值使函数能够仅返回 SQL 属性的一个子集:

    • EXECUTION_STATISTICS
    • SQL_BINDS
    • SQL_PLAN_STATISTICS(类似于SQL_PLAN加上行源统计)

plan_filter解释:指定计划过滤器。当语句有多个计划时,此参数使您可以选择单个计划。可能的值是:

  • LAST_GENERATED — 返回具有最新时间戳的计划
  • FIRST_GENERATED — 返回具有最近时间戳的计划
  • LAST_LOADED — 返回具有最新 FIRST_LOAD_TIME 统计信息的计划
  • FIRST_LOADED — 返回具有最近 FIRST_LOAD_TIME 统计信息的计划
  • MAX_ELAPSED TIME — 返回已用时间最长的计划
  • MAX_BUFFER_GETS — 返回具有最大缓冲区获取的计划
  • MAX_DISK_READS — 返回具有最大磁盘读取的计划
  • MAX_DIRECT_WRITES — 返回具有最大直接写入的计划
  • MAX_OPTIMIZER_COST — 返回具有最大优化器成本值的计划

返回值为:此函数针对在每个数据源中找到的每个 SQL_ID 或 PLAN_HASH_VALUE 对返回一个 SQLSET_ROW。

使用说明:提供给该函数的过滤器作为当前用户运行的 SQL 的一部分进行评估。因此,它们以该用户的安全权限执行,并且可以包含用户可以访问的任何构造和子查询,但仅此而已。

其使用案例如下:

-- select from a sql tuning set
-- 从 sql 调优集中选择
DECLARE
  cur sys_refcursor;
BEGIN
  OPEN cur FOR
    SELECT VALUE (P) 
    FROM table(dbms_sqltune.select_sqlset('my_workload')) P;
 
  -- Process each statement (or pass cursor to load_sqlset)
  -- 处理每个语句(或将游标传递给 load_sqlset)
 
  CLOSE cur;
END;
/

SELECT_WORKLOAD_REPOSITORY Function

此函数从工作负载存储库中收集 SQL 语句。重载表单使您能够从以下来源收集 SQL 语句:

  • begin_snap 和 end_snap 之间的快照
  • 工作负载存储库基线

其语法格式如下:

DBMS_SQLTUNE.SELECT_WORKLOAD_REPOSITORY (
  begin_snap        IN NUMBER,
  end_snap          IN NUMBER,
  basic_filter      IN VARCHAR2 := NULL,
  object_filter     IN VARCHAR2 := NULL,
  ranking_measure1  IN VARCHAR2 := NULL,
  ranking_measure2  IN VARCHAR2 := NULL,
  ranking_measure3  IN VARCHAR2 := NULL,
  result_percentage IN NUMBER   := 1,
  result_limit      IN NUMBER   := NULL,
  attribute_list    IN VARCHAR2 := NULL,
  recursive_sql     IN VARCHAR2 := HAS_RECURSIVE_SQL,
  dbid              IN NUMBER   := NULL)
 RETURN sys.sqlset PIPELINED;

DBMS_SQLTUNE.SELECT_WORKLOAD REPOSITORY (
  baseline_name     IN VARCHAR2,
  basic_filter      IN VARCHAR2 := NULL,
  object_filter     IN VARCHAR2 := NULL,
  ranking_measure1  IN VARCHAR2 := NULL,
  ranking_measure2  IN VARCHAR2 := NULL,
  ranking_measure3  IN VARCHAR2 := NULL,
  result_percentage IN NUMBER   := 1,
  result_limit      IN NUMBER   := NULL,
  attribute_list    IN VARCHAR2 := NULL,
  recursive_sql     IN VARCHAR2 := HAS_RECURSIVE_SQL,
  dbid              IN NUMBER   := NULL)
 RETURN sys.sqlset PIPELINED;

其参数解释如下:

attribute_list解释:指定要在结果中返回的 SQL 语句属性。可能的值是:

  • TYPICAL — 返回 BASIC 加上 SQL 计划(没有行源统计信息)并且没有对象引用列表。这是默认设置
  • BASIC — 返回除计划外的所有属性(例如执行统计信息和绑定)。执行上下文始终是结果的一部分
  • ALL — 返回所有属性
  • Comma:逗号分隔的属性名称列表,这允许仅返回 SQL 属性的一个子集:EXECUTION_STATISTICS、SQL_BINDS、SQL_PLAN_STATISTICS(类似于 SQL_PLAN 加上行源统计信息)

返回值为:此函数针对在每个数据源中找到的每个 SQL_ID 或 PLAN_HASH_VALUE 对返回一个 SQLSET_ROW。

使用说明:提供给该函数的过滤器作为当前用户运行的 SQL 的一部分进行评估。因此,它们以该用户的安全权限执行,并且可以包含用户可以访问的任何构造和子查询,但仅此而已。

其使用案例如下:

-- select statements from snapshots 1-2
-- 从快照 1-2 中选择语句
DECLARE
  cur sys_refcursor;
BEGIN
  OPEN cur FOR
    SELECT VALUE (P) 
    FROM table(dbms_sqltune.select_workload_repository(1,2)) P;
 
  -- Process each statement (or pass cursor to load_sqlset)
  -- 处理每个语句(或将游标传递给 load_sqlset)
 
  CLOSE cur;
END;
/

SET_TUNING_TASK_PARAMETER Procedures

此过程更新类型为 VARCHAR2 或 NUMBER 的 SQL 调整参数的值。其语法格式如下:

DBMS_SQLTUNE.SET_TUNING_TASK_PARAMETER (
   task_name        IN  VARCHAR2,
   parameter        IN  VARCHAR2,
   value            IN  VARCHAR2,
   database_link_to IN  VARCHAR2);

DBMS_SQLTUNE.SET_TUNING_TASK_PARAMETER (
   task_name        IN  VARCHAR2,
   parameter        IN  VARCHAR2,
   value            IN  NUMBER,
   database_link_to IN  VARCHAR2);
);

其参数解释如下:

parameter解释:要设置的参数的名称。可以通过此过程使用 VARCHAR2 形式的参数设置的可能调整参数:

  • APPLY_CAPTURED_COMPILENV:指示顾问程序是否可以使用通过 SQL 语句捕获的编译环境。默认值为 0(即 NO)
  • BASIC_FILTER:SQL调优集的基本过滤器
  • DAYS_TO_EXPIRE:任务被删除之前的天数
  • DEFAULT_EXECUTION_TYPE:当 EXECUTE_TUNING_TASK 函数和过程没有指定时,任务默认为这种执行类型
  • EXECUTION_DAYS_TO_EXPIRE:删除任务执行前的天数(不删除任务)
  • LOCAL_TIME_LIMIT:每条语句超时(秒)
  • MODE:调整范围(comprehensive, limited)
  • OBJECT_FILTER:SQL 调优集的对象过滤器
  • PLAN_FILTER:SQL 调整集的计划过滤器(请参阅 SELECT_SQLSET 了解可能的值)
  • RANK_MEASURE1:SQL 调优集的第一个排名度量
  • RANK_MEASURE2:SQL 调优集的第二个可能的排名度量
  • RANK_MEASURE3:SQL 调优集的第三个可能的排名度量
  • RESUME_FILTER:除了 BASIC_FILTER 之外的 SQL 调优集的额外过滤器
  • SQL_LIMIT:要调整的 SQL 语句的最大数量
  • SQL_PERCENTAGE:SQL调优集语句的百分比过滤器
  • TEST_EXECUTE:完全/自动/关闭
  • TIME_LIMIT:全局超时(秒)
  • USERNAME:在其下解析语句的用户名

使用说明:设置自动调整任务参数时,使用 DBMS_AUTO_SQLTUNE 包中的 SET_AUTO_TUNING_TASK_PARAMETER 过程。


SQLTEXT_TO_SIGNATURE Function

此函数返回 SQL 文本的签名。该签名可用于识别 dba_sql_profiles 中的 SQL 文本。其语法格式如下:

DBMS_SQLTUNE.SQLTEXT_TO_SIGNATURE (
  sql_text    IN CLOB,  
  force_match IN BOOLEAN  := FALSE)
RETURN NUMBER;

其参数解释如下:

返回值为:此函数返回指定 SQL 文本的签名。


UNPACK_STGTAB_SQLPROF Procedure

此过程复制存储在暂存表中的配置文件数据以在系统上创建配置文件。其语法格式如下:

DBMS_SQLTUNE.UNPACK_STGTAB_SQLPROF (
   profile_name          IN VARCHAR2 := '%',
   profile_category      IN VARCHAR2 := 'DEFAULT',
   replace               IN BOOLEAN,
   staging_table_name    IN VARCHAR2,
   staging_schema_owner  IN VARCHAR2 := NULL);

其参数解释如下:

使用说明:使用此过程需要 CREATE ANY SQL PROFILE 特权和对暂存表的 SELECT 特权。

其使用案例如下:

-- Unpack all profiles stored in a staging table.
-- 解压存储在暂存表中的所有配置文件
BEGIN 
  DBMS_SQLTUNE.UNPACK_STGTAB_SQLPROF(
      replace            => FALSE
  ,   staging_table_name => 'PROFILE_STGTAB');
END;

-- If there is a failure during the unpack operation, you can find the profile
-- that caused the error and perform a remap_stgtab_sqlprof operation targeting it.
-- You can resume the unpack operation by setting replace to TRUE so that
-- the profiles that were already created are replaced.
-- 如果在解包操作过程中出现错误,您可以找到导致错误的配置文件并针对它执行remap_stgtab_sqlprof 操作
-- 您可以通过将 replace 设置为 TRUE 来恢复解包操作,以便替换已经创建的配置文件
BEGIN
  DBMS_SQLTUNE.UNPACK_STGTAB_SQLPROF(
      replace            => TRUE
  ,   staging_table_name => 'PROFILE_STGTAB');
END;

UNPACK_STGTAB_SQLSET Procedure

此过程将一个或多个 SQL 调优集从它们在暂存表中的位置复制到 SQL 调优集架构中,使它们成为正确的 SQL 调优集。其语法格式如下:

DBMS_SQLTUNE.UNPACK_STGTAB_SQLSET (
   sqlset_name          IN VARCHAR2 := '%',
   sqlset_owner         IN VARCHAR2 := NULL,
   replace              IN BOOLEAN,
   staging_table_name   IN VARCHAR2,
   staging_schema_owner IN VARCHAR2 := NULL);

其参数解释如下:

DBMS_SQLTUNE.UNPACK_STGTAB_SQLSET 和 DBMS_SQLSET.UNPACK_STGTAB 的参数相同。

其使用案例如下:

 -- unpack all STS in the staging table
-- 解压临时表中的所有 STS
EXEC DBMS_SQLTUNE.UNPACK_STGTAB_SQLSET(sqlset_name         => '%', -
                                       sqlset_owner        => '%', -
                                       replace             => FALSE, -
                                       staging_table_name  => 'STGTAB_SQLSET');
 
-- errors can arise during STS unpack when a STS in the staging table has the
-- same name/owner as STS on the system.  In this case, users should call
-- remap_stgtab_sqlset to patch the staging table and with which to call unpack
-- Replace set to TRUE.
-- 当暂存表中的 STS 与系统上的 STS 具有相同的名称/所有者时,STS 解压缩期间可能会出现错误
-- 在这种情况下,用户应调用 remap_stgtab_sqlset 来修补暂存表并将调用 unpack Replace 设置为 TRUE
EXEC DBMS_SQLTUNE.UNPACK_STGTAB_SQLSET(sqlset_name         => '%', -
                                       sqlset_owner        => '%', -
                                       replace             => TRUE, -
                                       staging_table_name  => 'STGTAB_SQLSET');

UPDATE_SQLSET Procedures

此重载过程更新 SQL 调优集中 SQL 语句的选定字段。其语法格式如下:

DBMS_SQLTUNE.UPDATE_SQLSET (
   sqlset_name      IN  VARCHAR2,
   sql_id           IN  VARCHAR2,
   attribute_name   IN  VARCHAR2,
   attribute_value  IN  VARCHAR2 := NULL);

DBMS_SQLTUNE.UPDATE_SQLSET (
   sqlset_name      IN  VARCHAR2,
   sql_id           IN  VARCHAR2,
   attribute_name   IN  VARCHAR2,
   attribute_value IN NUMBER := NULL);

其参数解释如下:

04-18 23:47