问题提出:
在B/S系统中,页面纷繁复杂,而且经过系统长时间运行,如果发现某个session的wait比较严重,进行sql优化时,很难知道这个sql是用在程序的哪个模块,很多时候只能根据开发人员的经验来定位这个sql,或者打开程序代码,搜索。这样的效率很低,这里介绍一个方法来快速定位发生问题的sql的位置。
ORACLE提供了DBMS_APPLICATION_INFO包,其中提供了set_client_info、set_module、set_action、read_module、read_client_info、set_session_longops几个过程,其中分别用于设置客户端信息、设置module信息(这里同时必须设置一个action信息)、设置action信息、读取module信息(同时也会得到action信息)、读取client_info信息和手动设置一个会话为longops。
下面来看一个示例:
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.2.0
Connected as SYS
SQL> select distinct sid from v$mystat;
SID
----------
1036
SQL> select module,action,client_info from v$session where sid=1036;
MODULE ACTION CLIENT_INFO
------------------------------------------------ -------------------------------- ----------------------------------------------------------------
PL/SQL Developer Command Window - New
可以看到CLIENT_INFO为空。
SQL> exec dbms_application_info.set_client_info('test client info');
PL/SQL procedure successfully completed
SQL> select module,action,client_info from v$session where sid=1036;
MODULE ACTION CLIENT_INFO
------------------------------------------------ -------------------------------- ----------------------------------------------------------------
PL/SQL Developer Command Window - New test client info
设置后的CLIENT_INFO
SQL> exec dbms_application_info.set_module(module_name => 'test module',action_name => 'test action');
PL/SQL procedure successfully completed
SQL> select module,action,client_info from v$session where sid=1036;
MODULE ACTION CLIENT_INFO
------------------------------------------------ -------------------------------- ----------------------------------------------------------------
test module test action test client info
设置后的MODULE和ACTION
详细的解释请参考oracle的说明,在oracle的package的说明中就有详细的解释。