可以从当前会话动态视图v$sessions中获取数据库中正在运行的慢SQL。
select
sess_id, last_recv_time,
datediff(ss, last_recv_time, sysdate) exetime,
cast(sf_get_session_sql(sess_id) as varchar) fullsql, clnt_ip
from v$sessions
where state='ACTIVE'
order by exetime desc;
V$SQL_HISTORY中记录数据库中的历史运行SQL,根据运行时间可以获取慢SQL语句信息(该表记录数由参数SQL_HISTORY_CNT指定,默认10000);使用该视图需要开启SQL监控ENABLE_MONITOR=1(默认开启)。
--查询最近排行前十的慢SQL,按照耗时倒序排列
select top 10 t.TOP_SQL_TEXT, t.TIME_USED, t.START_TIME
from v$sql_history t
order by time_used desc;
DM开启SQL监控(ENABLE_MONITOR=1、MONITOR_TIME=1,默认开启),可以通过查询动态视图 VLONG_EXEC_SQLS 或 VSYSTEM_LONG_EXEC_SQLS 来获取慢SQL语句。
VLONG_EXEC_SQLS默认显示最近 1000 条执行时间较长的 SQL 语句,VSYSTEM_LONG_EXEC_SQLS显示服务器启动以来执行时间最长的300条SQL语句。具体记录数由如下两个参数控制:
SQL> show parameter long_exec_sqls
行号 PARA_NAME PARA_VALUE
---------- ------------------------- ----------
1 LONG_EXEC_SQLS_CNT 1000
2 SYSTEM_LONG_EXEC_SQLS_CNT 20
相关参数说明如下:
VLONG_EXEC_SQLS 和 VSYSTEM_LONG_EXEC_SQLS记录超过预定值时间的SQL,默认预定值时间是1000毫秒。可通过 SP_SET_LONG_TIME修改,通过 SF_GET_LONG_TIME查看当前值。
SQL> select SF_GET_LONG_TIME;
行号 SF_GET_LONG_TIME
---------- ----------------
1 1000
SQL> SP_SET_LONG_TIME(2000);
SQL> select SF_GET_LONG_TIME;
行号 SF_GET_LONG_TIME
---------- ----------------
1 2000
文章
阅读量
获赞