

# Oracle SQLT
<a name="Oracle.Options.SQLT"></a>

Amazon RDS 通过使用 SQLT 选项来支持 Oracle SQLTXPLAIN (SQLT)。您可对任一版本的 Oracle Database 19c 及更高版本使用 SQLT。

Oracle `EXPLAIN PLAN` 语句可以确定 SQL 语句的执行计划。它可以验证 Oracle 优化程序是否选择某个执行计划，例如嵌套循环联接。它还可以帮助您了解优化程序的决定，例如为什么选择嵌套循环联接而不是哈希联接。所以 `EXPLAIN PLAN` 可帮助您了解该语句的效果。

SQLT 是一个生成报告的 Oracle 实用程序。报告包括对象统计信息、对象元数据、与优化程序相关的初始化参数，以及数据库管理员可用于调整 SQL 语句以获得最佳性能的其他信息。SQLT 会生成一个 HTML 报告，其中包含报表中所有部分的超链接。

与 Automatic Workload Repository 或 Statspack 报告不同，SQLT 适用于单个 SQL 语句。SQLT 是收集、存储和显示性能数据的 SQL、PL/SQL 和 SQL\$1Plus 文件的集合。

下面是每个 SQLT 版本支持的 Oracle 版本。


****  

| SQLT 版本 | Oracle Database 21c | Oracle Database 19c | 
| --- | --- | --- | 
|  2018-07-25.v1  |  支持  |  支持  | 
|  2018-03-31.v1  |  不支持  |  不支持  | 
|  2016-04-29.v1  |  不支持  |  不支持  | 

下载 SQLT 并了解它的使用说明：
+ 登录到 My Oracle Support 账户，然后打开以下文档：
+ 下载 SQLT：[文档 215187.1](https://support.oracle.com/epmos/faces/DocumentDisplay?id=215187.1)
+ SQLT 使用说明：[文档 1614107.1](https://support.oracle.com/epmos/faces/DocumentDisplay?id=1614107.1)
+ 有关 SQLT 的常见问题：[文档 1454160.1](https://support.oracle.com/epmos/faces/DocumentDisplay?id=1454160.1)
+ 有关读取 SQLT 输出的信息：[文档 1456176.1](https://support.oracle.com/epmos/main/downloadattachmentprocessor?parent=DOCUMENT&sourceId=1456176.1&attachid=1456176.1:58&clickstream=yes)
+ 主报告解释：[文档 1922234.1](https://support.oracle.com/epmos/faces/DocumentDisplay?parent=DOCUMENT&sourceId=215187.1&id=1922234.1)

Amazon RDS 不支持以下 SQLT 方法：
+ `XPLORE` 
+ `XHUME` 

## SQLT 的先决条件
<a name="Oracle.Options.SQLT.PreReqs"></a>

以下是使用 SQLT 的先决条件：
+ 您必须删除 SQLT 所需的用户和角色 (如果存在)。

  SQLT 选项将在数据库实例上创建以下用户和角色：
  + `SQLTXPLAIN` 用户
  + `SQLTXADMIN` 用户
  + `SQLT_USER_ROLE` 角色

  如果数据库实例具有这些用户或角色中的任意一个，请使用 SQL 客户端登录到数据库实例，并使用以下语句将其删除：

  ```
  DROP USER SQLTXPLAIN CASCADE;
  DROP USER SQLTXADMIN CASCADE;   
  DROP ROLE SQLT_USER_ROLE CASCADE;
  ```
+ 您必须删除 SQLT 所需的表空间 (如果存在)。

  SQLT 选项将在数据库实例上创建以下表空间：
  + `RDS_SQLT_TS`
  + `RDS_TEMP_SQLT_TS`

  如果数据库实例有这些表空间，请使用 SQL 客户端登录数据库实例，并将其删除。

## SQLT 选项设置
<a name="Oracle.Options.SQLT.Options"></a>

 SQLT 可以使用由 Oracle Tuning Pack 和 Oracle Diagnostics Pack 提供的许可功能。Oracle Tuning Pack 包括 SQL Tuning Advisor，Oracle Diagnostics Pack 包括 Automatic Workload Repository。SQLT 设置可允许或禁止从 SQLT 访问这些功能。

Amazon RDS 支持 SQLT 选项的以下设置。


****  

| 选项设置 | 有效值 | 默认值 | 描述 | 
| --- | --- | --- | --- | 
|  `LICENSE_PACK`  |  `T`, `D`, `N`  |  `N`   |  要使用 SQLT 访问的 Oracle 管理包。输入以下值之一： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/Oracle.Options.SQLT.html)  Amazon RDS 不提供这些 Oracle 管理包的许可。如果您指示要使用未包含在数据库实例中的包，则可以对数据库实例使用 SQLT。不过，SQLT 无法访问该包，并且 SQLT 报告不包括该包的数据。例如，如果您指定 `T`，但数据库实例不包括 Oracle Tuning Pack，则 SQLT 可用于数据库实例，但其生成的报告不包含与 Oracle Tuning Pack 相关的数据。   | 
|  `VERSION`  |  `2016-04-29.v1` `2018-03-31.v1` `2018-07-25.v1`  |  `2016-04-29.v1`   |  要安装的 SQLT 版本。  对于 Oracle Database 19c 和 21c，唯一受支持的版本是 `2018-07-25.v1`。此版本是这些发布的默认版本。   | 

## 添加 SQLT 选项
<a name="Oracle.Options.SQLT.Add"></a>

下面是将 SQLT 选项添加到数据库实例的一般过程：

1. 创建新的选项组，或者复制或修改现有选项组。

1. 向选项组添加 SQLT 选项。

1. 将选项组与数据库实例相关联。

在添加 SQLT 选项后，一旦激活该选项组，就会激活 SQLT。

**将 SQLT 选项添加到数据库实例**

1. 确定您要使用的选项组。您可以创建新的选项组，或使用现有选项组。如果您想使用现有选项组，请跳到下一步。或者，通过以下设置创建自定义数据库选项组：

   1. 对于 **Engine**，请选择要使用的 Oracle 版本。所有版本均支持 SQLT 选项。

   1. 对于**主引擎版本**，选择数据库实例的版本。

   有关更多信息，请参阅“[创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)”。

1. 将 **SQLT** 选项添加到该选项组。有关添加选项的更多信息，请参阅 [将选项添加到选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)。

1. 将选项组应用到新的或现有的数据库实例：
   + 对于新数据库实例，您可以在启动实例时应用选项组。有关更多信息，请参阅“[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)”。

      
   + 对于现有数据库实例，您可以通过修改实例并附加新的选项组来应用选项组。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

1. (可选) 使用 SQLT 选项验证每个数据库实例上的 SQLT 安装。

   1. 使用 SQL 客户端以主用户身份连接到数据库实例。

      有关使用 SQL 客户端连接到 Oracle 数据库实例的信息，请参阅[连接到 Oracle 数据库实例](USER_ConnectToOracleInstance.md)。

   1. 运行以下查询：

      ```
      SELECT sqltxplain.sqlt$a.get_param('tool_version') sqlt_version FROM DUAL;                        
      ```

      查询返回 Amazon RDS 上的 SQLT 选项的当前版本。`12.1.160429` 是 Amazon RDS 上可用的 SQLT 版本的一个例子。

1. 更改由 SQLT 选项创建的用户的密码。

   1. 使用 SQL 客户端以主用户身份连接到数据库实例。

   1. 运行以下 SQL 语句更改 `SQLTXADMIN` 用户的密码：

      ```
      ALTER USER SQLTXADMIN IDENTIFIED BY new_password ACCOUNT UNLOCK;                         
      ```
**注意**  
作为安全最佳实践，请指定除此处所示提示以外的密码。

   1. 运行以下 SQL 语句更改 `SQLTXPLAIN` 用户的密码：

      ```
      ALTER USER SQLTXPLAIN IDENTIFIED BY new_password ACCOUNT UNLOCK;                         
      ```
**注意**  
作为安全最佳实践，请指定除此处所示提示以外的密码。

**注意**  
升级 SQLT 需要卸载 SQLT 的旧版本然后安装新版本。因此，在升级 SQLT 时，所有 SQLT 元数据都可能会丢失。数据库的主要版本升级也会卸载并重新安装 SQLT。主版本升级的示例是从 Oracle Database 19c 升级到 Oracle Database 21c。

## 使用 SQLT
<a name="Oracle.Options.SQLT.Using"></a>

SQLT 可与 Oracle SQL\$1Plus 实用程序一起使用。

**使用 SQLT**

1.  从 My Oracle Support 网站上的[文档 215187.1](https://support.oracle.com/epmos/faces/DocumentDisplay?id=215187.1) 下载 SQLT .zip 文件。
**注意**  
您无法从 My Oracle Support 网站中下载 SQLT 12.1.160429。Oracle 已弃用该旧版本。

1.  解压缩 SQLT .zip 文件。

1.  从命令提示符处，转到文件系统上的 `sqlt/run` 目录。

1.  从命令提示符处，打开 SQL\$1Plus，并以主用户身份连接到数据库实例。

   有关使用 SQL\$1Plus 连接到数据库实例的信息，请参阅 [连接到 Oracle 数据库实例](USER_ConnectToOracleInstance.md)。

1.  获取 SQL 语句的 SQL ID：

   ```
   SELECT SQL_ID FROM V$SQL WHERE SQL_TEXT='sql_statement';                               
   ```

   输出类似于以下内容：

   ```
   SQL_ID
   -------------
   chvsmttqjzjkn
   ```

1. 使用 SQLT 分析 SQL 语句：

   ```
   START sqltxtract.sql sql_id sqltxplain_user_password                    
   ```

   例如，对于 SQL ID `chvsmttqjzjkn`，输入以下内容：

   ```
   START sqltxtract.sql chvsmttqjzjkn sqltxplain_user_password                    
   ```

   SQLT 在运行 SQLT 命令的目录中生成 HTML 报告和相关资源作为 .zip 文件。

1.  (可选) 要允许应用程序用户使用 SQLT 诊断 SQL 语句，请使用以下语句向每个应用程序用户授予 `SQLT_USER_ROLE`：

   ```
   GRANT SQLT_USER_ROLE TO application_user_name;                
   ```
**注意**  
Oracle 不建议对 `SYS` 用户或具有 `DBA` 角色的用户运行 SQLT。最佳实践是通过向应用程序用户授予 `SQLT_USER_ROLE`，使用应用程序用户账户运行 SQLT 诊断。

## 升级 SQLT 选项
<a name="Oracle.Options.SQLT.Upgrading"></a>

对于 Amazon RDS for Oracle，您可以将 SQLT 选项从现有版本升级到更高版本。要升级 SQLT 选项，请完成[使用 SQLT](#Oracle.Options.SQLT.Using)中的步骤 1–3 以升级到新的 SQLT 版本。此外，如果您在本节的步骤 7 中为以前版本的 SQLT 授予了权限，请再次为新的 SQLT 版本授予权限。

升级 SQLT 选项将导致旧 SQLT 版本的元数据丢失。删除旧 SQLT 版本的架构和相关对象，并安装新版本的 SQLT。有关 SQLT 最新版本中的更改的更多信息，请参阅 My Oracle Support 网站上的[文档 1614201.1](https://support.oracle.com/epmos/faces/DocumentDisplay?parent=DOCUMENT&sourceId=215187.1&id=1614201.1)。

**注意**  
不支持版本降级。

## 修改 SQLT 设置
<a name="Oracle.Options.SQLT.ModifySettings"></a>

在启用 SQLT 后，您可以修改该选项的 `LICENSE_PACK` 和 `VERSION` 设置。

有关如何修改选项设置的更多信息，请参阅 [修改选项设置](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.ModifyOption)。有关各项设置的更多信息，请参阅[SQLT 选项设置](#Oracle.Options.SQLT.Options)。

## 删除 SQLT 选项
<a name="Oracle.Options.SQLT.Remove"></a>

您可以从数据库实例中删除 SQLT。

要从数据库实例中删除 SQLT，请执行下列操作之一：
+ 要从多个数据库实例中删除 SQLT，请从数据库实例所属的选项组中删除 SQLT 选项。此更改会影响使用该选项组的所有数据库实例。有关更多信息，请参阅“[从选项组中删除选项](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.RemoveOption)”。

   
+ 要从单个数据库实例中删除 SQLT，请修改该数据库实例，并指定另一个不包含 SQLT 选项的选项组。您可以指定默认（空）选项组，或指定其他自定义选项组。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。