
SQL 语句的执行效率对于数据库性能的影响非常重大,在性能测试过程中,需要查找和定位可能存在性能瓶颈的SQL 语句。
PL/SQL Developer 是一个Oracle 的PL/SQL 开发工具,同时具备Oracle 的一些管理功能,可利用它来跟踪客户端向Oracle 服务器提交的所有SQL 语句,方法是选择Session→SQL Trace命令,如图8.19 所示。

也可以指定跟踪某个Session 的SQL 语句,如图8.20 所示。

如果不用PL/SQL Developer 这类工具,也可以通过修改Oracle 全局参数sql_trace,来产生Trace 文件,之后再分析Trace 文件来分析提交到Oracle 的SQL 语句。如果想针对某个Session进行SQL 语句的跟踪,则可以采用以下办法(以下操作需要在SYS 用户下进行)。
(1)首先使用以下语句从Oracle 的v$session 表查出所有跟Oracle 连接的客户端程序的进程:
select SID, SERIAL#, USERNAME,OSUSER,MACHINE,TERMINAL,PROGRAM from v$session
(2)然后利用DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION 包来跟踪特定的进程向Oracle 提交的SQL 语句。
例如,下面语句为SID 为13,SERIAL#为96 的进程执行SQL 语句的跟踪功能:
execute dbms_system.set_sql_trace_in_session(13,96,TRUE);
(3)如果要停止跟踪,则提交以下语句:
execute dbms_system.set_sql_trace_in_session(13,96,FALSE);
然后在利用Oracle 的tkprof 工具对记录下来的SQL 跟踪文件进行分析,如图8.21 所示。

另外,也可以利用前面讲过的Spotlight 这个工具进行SQL 跟踪,在Spotlight 中跟踪指定Session 的SQL 语句,并查看执行计划,如图8.22 所示。

还可以利用SQL Tuning 的调优建议功能对SQL 语句进行分析,SQL Tunning 将自动查找更优的可替代SQL 语句,如图8.23 所示。

图8.23 中,SQL Tunning 把原来使用Having 进行条件过滤的SQL 语句改写为使用Where进行条件过滤,这样的SQL 语句执行效率更高。