天天看点

Oracle常用工具使用-SQLT

说明

SQLTXPLAIN,也称为SQLT,是由Oracle服务器技术专家中心提供的工具 - ST CoE。 SQLT输入一个SQL语句并输出一组诊断文件。这些文件通常用于诊断性能不佳的SQL语句。 SQLT连接到数据库并收集执行计划,基于成本的优化程序CBO统计信息,schema对象元数据,性能统计信息,配置参数以及影响正在分析的SQL性能的类似元素。

SQLT不需要许可证,而且是免费的。

1.1. 下载地址

MOS 文档 ID 215187.1可以下载

1.1.1. 安全模式

SQLT 在 安装的过程中会创建两个用户和一个角色。这些用户和角色的名字都是固定的。

SQLT repository 是由用户 SQLTXPLAIN管理的。SQLT 的使用者每次使用 SQLT 提供的主要方法时都要提供 SQLTXPLAIN 的密码。 SQLTXPLAIN 用户被赋予了以下系统权限:

  • CREATE SESSION
  • CREATE TABLE

SQLT 包含的 PL/SQL 程序包以及视图都是由用户 SQLTXADMIN 管理的。SQLTXADMIN 用户处于锁定状态并且由一个随机产生的密码保护。SQLTXADMIN 用户被赋予了以下系统权限:

  • ADMINISTER SQL MANAGEMENT OBJECT
  • ADMINISTER SQL TUNING SET
  • ADVISOR
  • ALTER SESSION
  • ANALYZE ANY
  • SELECT ANY DICTIONARY
  • SELECT_CATALOG_ROLE

所有 SQLT 的使用者在使用 SQLT 提供的主要方法之前必须被赋予 SQLT_USER_ROLE 这个角色。SQLT_USER_ROLE 角色被赋予了以下系统权限:

  • ADVISOR
  • SELECT_CATALOG_ROLE

12c 在缺省情况下 SYS 用户不能作为 SQLT 的用户,因为 PL/SQL 安全模型上改变的原因。

为了处理这个改变,SQLTADMIN 需要在 SYS 上被授予 INHERIT PRIVILEGES 权限。

GRANT INHERIT PRIVILEGES ON USER SYS TO SQLTXADMIN

1.2. 解压SQLT压缩包

[root@host1 software]# unzip sqlt_122180331.zip
[root@host1 software]# chown -R oracle:oinstall sqlt
[root@host1 sqlt]# ll
total 112
drwxr-xr-x 2 oracle oinstall 31 Oct 6 2017 doc
drwxr-xr-x 3 oracle oinstall 20 Oct 6 2017 input
drwxr-xr-x 2 oracle oinstall 4096 Mar 31 17:17 install
drwxr-xr-x 2 oracle oinstall 4096 Oct 6 2017 run
-rw-r--r-- 1 oracle oinstall 57883 Mar 31 16:54 sqlt_instructions.html
-rw-r--r-- 1 oracle oinstall 38899 Oct 4 2017 sqlt_instructions.txt
drwxr-xr-x 7 oracle oinstall 4096 Oct 6 2017 utl           

1.3. 安装SQLT

1.卸载先前版本(可选)

该可选步骤将删除所有废弃的 SQLTXPLAIN/SQLTXADMIN schema 对象,并为全新安装准备环境。如果要保留 SQLT Repository 的现有内容,请跳过此步骤(推荐)

[oracle@host1 ~]$ cd /software/sqlt/install/
[oracle@host1 install]$ sqlplus / as sysdba
SQL> START sqdrop.sql           

2.以 SYS 身份连接数据库并执行安装脚本 sqlt/install/sqcreate.sql。

[oracle@host1 install]$ cd /software/sqlt/install/
[oracle@host1 install]$ sqlplus / as sysdba
SQL> START sqcreate.sql           

在安装期间,系统将要求你输入以下参数值:

1)可选连接标识符(当安装在一个可插拔数据库上时是必须的)

Optional Connect Identifier (ie: @PROD): @pdbcndba           

在一些受限访问的系统中,你可能需要指定连接标识符,例如 @PROD。如果不需要连接标识符,则不要输入任何数据,只需单击回车键。什么也不键入是最常使用的安装方法。

当安装在一个可插拔数据库上时连接标识符是必须提供的。

2)SQLTXPLAIN 密码。

Password for user SQLTXPLAIN:
Re-enter password:           

在大多数系统中区分大小写。

3)SQLTXPLAIN 默认表空间。

Default tablespace [UNKNOWN]: CNDBA           

从可用的永久表空间列表中,选择 SQLT Repository 的 SQLTXPLAIN 应使用的表空间。它必须具有 50MB 以上的可用空间。

4)SQLTXPLAIN 临时表空间。

Temporary tablespace [UNKNOWN]: TEMPTS1           

从可用的临时表空间列表中,选择 SQLTXPLAIN 临时操作和临时对象应使用的表空间。

5)可选应用程序用户。

Main application user of SQLT: SYS           

这是发出要分析 SQL 语句的用户。例如,在 EBS 系统上,指定为 APPS;在 Siebel 上,应指定为 SIEBEL;在 People Soft 上,应指定为 SYSADM。系统不会要求你输入此用户的密码。也可以在安装该工具后添加其他的 SQLT 用户,方法为:授予他们角色 SQLT_USER_ROLE。

6)授权的 Oracle Pack。(T,D 或 N)

"T" if you have license for Diagnostic and Tuning
"D" if you have license only for Oracle Diagnostic
"N" if you do not have these two licenses

Oracle Pack license [T]: T           

可以指定 T 表示 Oracle Tuning;D 表示 Oracle Diagnostic,或 N 表示都没有。如果选择 T 或 D,SQLT 可以在它生成的诊断文件中包含授权的内容。默认值为 T。如果选择 N,SQLT 将只安装限定的功能。

如果需要静默安装,可以使用下面三个选项来传递所有 6 个安装参数:

1)在文件中。

首先使用一个脚本进行值的预先定义,类似于示例脚本 sqlt/install/sqdefparams.sql。然后使用 sqlt/install/sqcsilent.sql,而不是 sqlt/install/sqcreate.sql。

$ cd sqlt/install
$ sqlplus / as sysdba
SQL> START sqdefparams.sql
SQL> START sqcsilent.sql           

2)命令行。

执行 sqlt/install/sqcsilent2.sql,而不是 sqlt/install/sqcreate.sql。前者以内嵌形式输入 6 个安装参数。

$ cd sqlt/install
$ sqlplus / as sysdba
SQL> START sqcsilent2.sql '' sqltxplain USERS TEMP '' T           

3)在 Oracle 内部安装。

执行 sqlt/install/sqcinternal.sql,而不是 sqlt/install/sqcreate.sql。前者首先执行 sqlt/install/sqdefparams.sql,然后是 sqlt/install/sqcsilent.sql。

$ cd sqlt/install
$ sqlplus / as sysdba
SQL> START sqcinternal.sql           

1.4. 查看sql_id

可以在AWR或ASH报告中找到语句的SQL_ID,也可以使用V$SQL视图从数据库数据字典中选择它。

1)如果可以使用特定的可识别字符串或某种独特的注释来识别SQL,例如:/ * TARGET SQL * /那么这将使其更容易定位。

SQL> SELECT /* TARGET SQL */ * FROM dual;

DUM
---
X

SQL> SELECT sql_id, plan_hash_value, substr(sql_text,1,40) sql_text
FROM v$sql
WHERE sql_text like 'SELECT /* TARGET SQL */%';

SQL_ID PLAN_HASH_VALUE SQL_TEXT
------------------------ --------------- ---------------------------------------------
0xzhrtn5gkpjs 272002086 SELECT /* TARGET SQL */ * FROM dual           

2)为方便起见,此处包含hash_value。还可以使用替换变量在V$SQL视图中找到SQL_ID:

SELECT sql_id, plan_hash_value, SUBSTR(sql_text,1,40) Text
FROM v$sql
WHERE sql_text LIKE '%&An_Identifiable_String%';           

在pl/sql执行语句会提示你要替换的变量,也可以直接使用以下语句模糊查询

SELECT sql_id, plan_hash_value, SUBSTR(sql_text,1,40) Text
FROM v$sql
WHERE sql_text LIKE '%select%';           

3)如果v$sql中没有SQL,则可以使用DBA_HIST_SQLTEXT和DBA_HIST_SQLSTAT:

select t.sql_id,
t.sql_text,
s.executions_total,
s.elapsed_time_total
from DBA_HIST_SQLSTAT s, DBA_HIST_SQLTEXT t
where s.snap_id between 416 and 417;           

快照id可以通过以下语句查到:

select snap_id, dbid from DBA_HIST_SNAPSHOT;           

1.5. 主要方法

在使用 SQLT 提供的主要方法之前,须确保 SQLT 已经被正确安装,并且使用 SQLT 的用户被赋予了 SQLT_USER_ROLE 角色。

假如 SQLT 安装绕过了 SQL*Net (意味着你并没有在安装期间没有指定连接符),那么在从远端客户端执行任何 SQLT 主要方法前,你将需要手动设置连接符参数。即,假如你连接使用 sqlplus scott/tiger@myprod 那么你需要执行: EXEC sqltxadmin.sqlt$a.set_sess_param('connect_identifier', '@myprod');

SQLT 为一个 SQL 语句提供了下面 7种主要方法来生成诊断详细信息 XTRACT,XECUTE,XTRXEC,XTRSBY,XPLAIN,XPREXT 和 XPREXC。 XTRACT,XECUTE,XTRXEC,XTRSBY,XPREXT 和 XPREXC 处理绑定变量和会做 bind peeking(绑定变量窥视),但是 XPLAIN 不会。这是因为 XPLAIN 是基于 EXPLAIN PLAN FOR 命令执行的,该命令不做 bind peeking。因此,如果可能请避免使用XPLAIN.

除了 XPLAIN 的 bind peeking 限制外,所有这 7种主要方法都可以提供足够的诊断详细信息,对性能较差或产生错误结果集的 SQL 进行初步评估。如果该 SQL 仍位于内存中或者 Automatic Workload Repository (AWR) 中,请使用 XTRACT 或 XTRXEC,其他情况请使用 XECUTE。对于 Data Guard 或备用只读数据库,请使用 XTRSBY。仅当其他方法都不可行时,再考虑使用 XPLAIN。XPREXT 和 XPREXC 是类似于 XTRACT 和 XECUTE,但为了提高 SQLT 的性能它们禁了一些 SQLT 的特性。

1.5.1. XTRACT 方法

如果你知道待分析 SQL 的 SQL_ID 或 HASH_VALUE,请使用该方法,否则请使用 XECUTE。你可以在 AWR report 中找到 SQL_ID,在 SQL trace 中找到 HASH_VALUE(在 SQL 文本上面,通过 "hv=" 标记进行标识)。

如果该 SQL 仍位于内存中,或其已被 AWR 捕获,那么使用 XTRACT 可发现该 SQL 并提供一组诊断文件,否则 XTRACT 将输出错误。

如果对 SQL 进行硬分析时将参数 STATISTICS_LEVEL 设置为 ALL,将可以得到重要的性能统计信息(如每步操作的实际行数)。你也可以通过在 SQL 中包括以下 CBO 提示来生成同样有用的性能统计信息:/*+ GATHER_PLAN_STATISTICS */。在 11g 中,你可以在 SQL 中包含以下 CBO 提示以获得增强的诊断信息:/*+ GATHER_PLAN_STATISTICS MONITOR */

使用此方法时,它会要求提供 SQLTXPLAIN 密码,这个在导出与该 XTRACT 执行所对应的 SQLT Repository 时会被使用。

该方法需要对执行 SQLT 的应用程序用户授予 SQLT_USER_ROLE 角色。

要使用该 XTRACT 方法,首先确保已安装了 SQLT,然后以已执行待分析 SQL 的应用程序用户身份连接到 SQL*Plus,并执行 sqlt/run/sqltxtract.sql 脚本,传递 SQL_ID 或 HASH_VALUE。

$ cd sqlt/run
$ sqlplus apps
SQL> START sqltxtract.sql [SQL_ID]|[HASH_VALUE] [sqltxplain_password]
SQL> START sqltxtract.sql 3kqrku32p6sfn sqltxplain_password
SQL> START sqltxtract.sql 2524255098 sqltxplain_password           

1.5.2. XECUTE 方法

与 XTRACT方法相比,该方法提供的信息更为详细。正如名称 XECUTE 所指示的,它将执行正在分析的 SQL,然后生成一组诊断文件。它的主要缺点是如果正在分析的 SQL 需要很长时间来执行,那么该方法也要花费很长的时间。

根据经验法则,仅当 SQL 执行少于 1 小时的情况下,才考虑使用此方法,否则请使用 XTRACT。

使用此 XECUTE 方法之前,必须创建一个包含 SQL 文本的文本文件。如果 SQL 包括绑定变量,则你的文件必须包含绑定变量声明和赋值。以 sqlt/input/sample/script1.sql 为例。你的 SQL 应该包含标记 /* ^^unique_id */(强烈建议)。

如果你的 SQL 需要与 SQL*Plus 无法使用的数据类型绑定,或者它使用了集合,你可能需要将 SQL 嵌入到匿名 PL/SQL 块中。在这种情况下,请使用 sqlt/input/sample/plsql1.sql 作为此方法的输入示例。

对于修改数据的语句,例如 INSERT/UPDATE/DELETE,工具会在语句执行之前创建一个保存点,这样在会话结束时事务处理可以回退到该保存点。关于 SAVEPOINT(保存点)的更多信息,请参阅《Oracle Concepts》参考手册。

使用此方法时,它会要求提供 SQLTXPLAIN 密码,这个在导出与该 XECUTE 执行所对应的 SQLT Repository 时会被使用。

该方法需要对执行 SQLT 的应用程序用户授予 SQLT_USER_ROLE 角色。

要使用该 XECUT 方法,首先确保已安装了 SQLT,然后以已执行待分析 SQL 的应用程序用户身份连接到 SQL*Plus,并执行 sqlt/run/sqltxecute.sql 脚本,传递包含 SQL 文本及其绑定变量的文本文件名称。你需要将该文件放置到 sqlt/input 目录下,并在位于 sqlt 主目录时运行 XECUTE,如下所示:

# cd sqlt
$ sqlplus apps
SQL> START [path]sqltxecute.sql [path]scriptname [sqltxplain_password]
SQL> START run/sqltxecute.sql input/sample/script1.sql sqltxplain_password           

1.5.3. XTRXEC 方法

该方法合并了 XTRACT 和 XECUTE 的功能。实际上,XTRXEC 连续执行了这两种方法。针对所请求 SQL 语句找到的开销较大的计划,XTRACT 阶段将生成一个包含提取的 SQL 以及绑定声明和赋值的脚本。然后,XTRXEC 使用第一阶段创建的脚本执行XECUTE 阶段。

SQLT 根据在内存中生成开销最大的执行计划时窥视到的值,创建脚本的绑定变量的以供 XTRACT使用。判断计划的开销大小的标准是基于这个计划的平均执行时间。

如果 XTRXEC 仅执行了第一个阶段(XTRACT) 后就输出错误,你可能需要检查在第二阶段(XECUTE)使用的脚本并相应调整绑定变量。使用不常用数据类型时尤其需要进行调整。

使用此方法时,它会要求提供 SQLTXPLAIN 密码,这个在导出与该 XTRXEC 执行所对应的 SQLT Repository 时会被使用。

该方法需要对执行 SQLT 的应用程序用户授予 SQLT_USER_ROLE 角色。

要使用该 XTRXEC 方法,首先确保已安装了 SQLT,然后以执行待分析 SQL 的应用程序用户身份连接到 SQL*Plus,并执行 sqlt/run/sqltxtrxec.sql 脚本,传递 SQL_ID 或 HASH_VALUE。

$ cd sqlt/run
$ sqlplus apps
SQL> START sqltxtrxec.sql [SQL_ID]|[HASH_VALUE] [sqltxplain_password]
SQL> START sqltxtrxec.sql 3kqrku32p6sfn sqltxplain_password
SQL> START sqltxtrxec.sql 2524255098 sqltxplain_password           

1.5.4. XTRSBY 方法

如果需要分析在 Data Guard 或备用只读数据库上执行的 SQL,请使用该方法。你需要知道要分析的 SQL 的 SQL_ID 或 HASH_VALUE。

在主库上创建一个到备库的database link,连接到的用户需要有访问数据字典的权限,通常都是使用有 DBA 权限的用户。

CREATE PUBLIC DATABASE LINK V1123 CONNECT TO mydba IDENTIFIED by mydba_password

USING '(DESCRIPTION = (ADDRESS=(PROTOCOL=TCP)

(HOST=coesrv14.us.oracle.com)(PORT=1521))(CONNECT_DATA=(SID = V1123)))';

如果该 SQL 仍位于只读数据库中的内存中,那么使用 XTRSBY 可发现该 SQL 并提供一组诊断文件,否则 XTRSBY 将输出错误。

如果对只读数据库中的 SQL 进行硬分析时将参数 STATISTICS_LEVEL 设置为 ALL,将可以得到重要的性能统计信息(如每个执行计划操作的实际行数)。你也可以通过在 SQL 中包括以下 CBO 提示来生成同样有用的性能统计信息:/*+ GATHER_PLAN_STATISTICS */。在 11g 中,你可以在 SQL 中包含以下 CBO 提示以获得改进的诊断信息:/*+ GATHER_PLAN_STATISTICS MONITOR */

使用此方法时,它会要求提供 SQLTXPLAIN 密码,这个在导出与该 XTRSBY 执行所对应的 SQLT Repository 时会被使用。

XTRSBY 需要 3 个参数: SQL id,DB_LINK的 ID,以及 SQLTXPLAIN 的密码。

该方法需要对执行 SQLT 的应用程序用户授予 SQLT_USER_ROLE 角色。

要使用该 XTRSBY 方法,首先确保在主数据库上已安装了 SQLT,并且已复制到该只读数据库中。然后连接到主要数据库中的 SQL*Plus 并执行 sqlt/run/sqltxtrsby.sql 脚本,传递 SQL_ID 或 HASH_VALUE,然后是 DB_LINK。

$ cd sqlt/run
$ sqlplus apps
SQL> START sqltxtrsby.sql [SQL_ID]|[HASH_VALUE] [sqltxplain_password] [DB_LINK]
SQL> START sqltxtrsby.sql 3kqrku32p6sfn sqltxplain_password V1123
SQL> START sqltxtrsby.sql 2524255098 sqltxplain_password v1123           

除了 XTRSBY,还可以从只读数据库直接执行 sqlt/utl/sqlhc.sql 或 sqlt/utl/sqlhcxec.sql。这两个只读脚本不在数据库上安装任何东西,也不执行 DML 命令。它们提供在 XTRSBY 中没有的其他信息。

1.5.5. XPLAIN 方法

该方法是基于 EXPLAIN PLAN FOR 命令执行的,因此它将无视你的 SQL 语句引用的绑定变量。仅当无法使用 XTRACT 或 XECUTE 时才使用该方法。

使用此 XPLAIN 方法之前,必须创建一个包含 SQL 文本的文本文件。如果 SQL 包括绑定变量,你有两个选择:保持 SQL 文本“不变”,或谨慎使用相同数据类型的字面值替换该绑定。以 sqlt/input/sample/sql1.sql 为例。

使用此方法时,它会要求提供 SQLTXPLAIN 密码,这个在导出与该 XPLAIN 执行所对应的 SQLT Repository 时会被使用。

该方法需要对执行 SQLT 的应用程序用户授予 SQLT_USER_ROLE 角色。

要使用该 XPLAIN 方法,首先确保已安装了 SQLT,然后以已执行待分析 SQL 的应用程序用户的身份连接到 SQL*Plus,并执行 sqlt/run/sqltxplain.sql 脚本,传递包含 SQL 文本的文本文件名称。你需要将该文件放置到 sqlt/input 目录下,并在位于 sqlt 主目录时运行 XPLAIN,如下所示:

# cd sqlt
$ sqlplus apps
SQL> START [path]sqltxplain.sql [path]filename [sqltxplain_password]
SQL> START run/sqltxplain.sql input/sample/sql1.sql sqltxplain_password           

1.5.6. XPREXT 方法

假如你想使用 XTRACT 同时希望禁用一些 SQLT 的特性使之 执行更快,请使用这个方法。脚本 sqlt/run/sqltcommon11.sql 显示了哪些特性被禁用。

假如你知道要被分析的 SQL 的 SQL_ID 或者 HASH_VALUE,使用这个方法,否则请使用 XPREXC.你可以在 AWR report 中找到 SQL_ID,在 SQL trace 中找到 HASH_VALUE(在 SQL 文本上面,通过 "hv=" 标记进行标识)。

使用此方法时,它会要求提供 SQLTXPLAIN 密码,这个在导出与该 XPREXT 执行所对应的 SQLT Repository 时会被使用。

该方法需要对执行 SQLT 的应用程序用户授予 SQLT_USER_ROLE 角色。

要使用该 XPREXT 方法,首先确保已 安装了 SQLT,然后以已执行待分析 SQL 的应用程序用户身份连接到 SQL*Plus,并执行 sqlt/run/sqltxprext.sql 脚本,传递 SQL_ID 或 HASH_VALUE。

$ cd sqlt/run
$ sqlplus apps
SQL> START sqltxprext.sql [SQL_ID]|[HASH_VALUE] [sqltxplain_password]
SQL> START sqltxprext.sql 3kqrku32p6sfn sqltxplain_password
SQL> START sqltxprext.sql 2524255098 sqltxplain_password           

1.5.7. XPREXC 方法

假如你想使用 XECUTE 同时希望禁用一些 SQLT 的特性使之执行更快,请使用这个方法。脚本 sqlt/run/sqltcommon11.sql 显示哪些特性被禁用

根据经验法则,仅当 SQL 执行少于 1 小时的情况下,才考虑使用此方法,否则请使用 XPREXT。

使用此 XPREXC 方法之前,必须创建一个包含 SQL 文本的文本文件。如果 SQL 包括绑定变量,则你的文件必须包含绑定变量声明和赋值。以 sqlt/input/sample/script1.sql 为例。你的 SQL 应该包含标记 /* ^^unique_id */,这个标记应该拼写准确,换句话说请不要改变它。

如果你的 SQL 需要与 SQL*Plus 无法使用的数据类型绑定,或者它使用了集合,你可能需要将 SQL 嵌入到匿名 PL/SQL 块中。在这种情况下,请使用 sqlt/input/sample/plsql1.sql 作为此方法的输入示例。

对于修改数据的语句,例如 INSERT/UPDATE/DELETE,工具会在语句执行之前创建一个保存点,这样在会话结束时事务处理可以回退到该保存点。关于 SAVEPOINT(保存点)的更多信息,请参阅《Oracle Concepts》参考手册。

用此方法时,它会要求提供 SQLTXPLAIN 密码,这个在导出与该 XPREXC 执行所对应的 SQLT Repository 时会被使用。

该方法需要对执行 SQLT 的应用程序用户授予 SQLT_USER_ROLE 角色。

要使用该 XPREXC 方法,首先确保已 安装了 SQLT,然后以已执行待分析 SQL 的应用程序用户身份连接到 SQL*Plus,并执行 sqlt/run/sqltxprexc.sql 脚本,传递包含 SQL 文本及其绑定变量的文本文件名称。你需要将该文件放置到 sqlt/input 目录下,并在位于 sqlt 主目录时运行 XPREXC,如下所示:

# cd sqlt
$ sqlplus apps
SQL> START [path]sqltxprexc.sql [path]scriptname [sqltxplain_password]
SQL> START run/sqltxprexc.sql input/sample/script1.sql sqltxplain_password