全局或会话参数
Oracle 设置有一组初始化参数。如果未指定任何内容来覆盖它们,则默认情况下将使用它们。它们可以通过使用 ALTER SESSION(仅影响单个用户)或 ALTER SYSTEM(影响所有用户,直到 Oracle 重新启动)命令在会话或系统级别更改内容或通过在代码中使用优化器提示来覆盖。这些可能会对您看到的计划产生影响。
关于解释计划,不同的 Oracle 数据库可能具有不同的初始化参数或设置了一些会话/系统参数,这可能意味着 SAME 代码的行为不同(与另一个 Oracle 数据库相比,在一个 Oracle 数据库上获得不同的执行计划)。
此外,由于执行计划受所选数据的影响,因此在 TEST 中运行良好的查询或包可能永远不会在数据量大得多的 PRODUCTION 中完成。当代码没有使用准确的数据量进行测试时,这是一个常见的问题(或者至少使用从生产数据库导入的表统计信息,如果测试不能保存完整的生产数据量)。
跟踪
到目前为止的建议告诉您如何跟踪单个语句,假设您知道哪个语句有问题,但您提到您有一个包含多个 SQL 语句的 shell 脚本。
如果您使用的此处文档只需一次调用 SQL 并包含多个类似这样的 SQL 语句...
#!/bin/ksh
sqlplus -S user/pass <<EOF
set heading off
BEGIN
-- DO YOUR FIRST SQL HERE
-- DO YOUR SECOND SQL HERE
END;
/
EOF
...您可以像这样创建单个 oracle 跟踪文件
#!/bin/ksh
sqlplus -S user/pass <<EOF
set heading off
BEGIN
ALTER SESSION SET EVENTS '10046 trace name context forever, level 8'
-- DO YOUR FIRST SQL HERE
-- DO YOUR SECOND SQL HERE
END;
/
EOF
- 请注意,级别 8 用于使用 WAITS 进行跟踪。您可以执行第 4 级(绑定变量)和第 12 级(绑定和等待),但我总是发现只有第 8 级的问题。第 12 级也可能需要更长的时间来执行和在全尺寸环境中。
现在运行 shell 脚本进行一次执行,然后使用 SQL PLUS 检查跟踪文件的创建位置
SQL> show parameter user_dump_dest
/app/oracle/admin/rms/udump
转到该目录,如果没有启用其他跟踪,将有一个 .trc 文件,其中包含脚本中整个 SQL 运行的跟踪。
您需要使用 unix tkprof 命令将其转换为可读格式,如下所示
unix> tkprof your.trc ~/your.prf sys=no sort=fchela,exeela
现在切换到您的主目录,将有一个 .prf 文件,其中列出了按执行时间最长或获取时间最多的 SQL 语句的顺序与解释计划一起执行。tkprof 的这组参数允许您专注于修复耗时最长的语句,因此调整的回报最大。
请注意,如果您的 shell 脚本运行多个 sqlplus 命令,每个命令都将创建一个单独的会话,因此向每个命令添加一个 ALTER SESSION 语句将创建单独的跟踪文件。
另外,不要忘记很容易迷失在细节中,有时调优是要着眼于整体情况并以另一种方式做同样的事情,而不是从处理可能会增加几秒钟但在整体方案中的单个 SQL 开始无助于减少整体运行时间。
如果可以的话,尽量减少更新语句的数量,就像你有一个大表一样,如果你可以在表的一次通过中进行更新(并且有支持更新的索引)而不是做很多小更新。
如果您需要更多帮助,也许您可以发布脚本的相关部分、运行所需的总时间以及解释计划。