我的程序中很多地方使用了数据库. 但有些程序建立了连接没有关闭.
随着未关的连接的积累, 数据库的性能会下降.
程序文件有几千个, 无法一一查那个文件没有关连接.
所以, 我想在未关的连接session中查出这个session都执行了那些sql语句,
怎么查?

解决方案 »

  1.   

    SELECT osuser, username, sql_text from v$session a, v$sqltext b 
    where a.sql_address =b.address order by address, piece;
      

  2.   

    捕捉运行很久的SQL
    select username,sid,opname,
           round(sofar*100 / totalwork,0) || '%' as progress,
           time_remaining,sql_text
    from v$session_longops , v$sql
    where time_remaining <> 0
    and sql_address = address
    and sql_hash_value = hash_value
      

  3.   

    如果跟踪自己的会话或者是别人的会话 
    [A]跟踪自己的会话很简单 
    Alter session set sql_trace true|false 
    如果跟踪别人的会话,需要调用一个包 
    exec dbms_system.set_sql_trace_in_session(sid,serial#,true|false) 
    or 
    exec dbms_system.set_sql_trace_in_session(sid,serial#,8,’’),这里的8是跟踪级别 
    跟踪的信息在user_dump_dest 目录下可以找到 
    可以通过Tkprof来解析跟踪文件,如 
    Tkprof 原文件 目标文件 sys=n 
    怎么设置整个数据库系统跟踪 
    [A]其实文档上的alter system set sql_trace=true是不成功的 
    但是可以通过设置事件来完成这个工作,作用相等 
    alter system set events 
      ‘10046 trace name context forever,level 1’; 
    如果关闭跟踪,可以用如下语句 
    alter system set events 
      ‘10046 trace name context off’; 
    其中的level 1与上面的8都是跟踪级别 
    level 1:跟踪SQL语句,等于sql_trace=true 
    level 4:包括变量的详细信息 
    level 8:包括等待事件 
    level 12:包括绑定变量与等待事件 
      

  4.   

    SELECT osuser, username, sql_text from v$session a, v$sqltext b 
    where a.sql_address =b.address order by address, piece;