在 Oracle 数据库日常运维中,慢 SQL 往往是导致系统卡顿、CPU 飙高、业务响应缓慢的重要原因。
如果想快速查看当前数据库中的长时间执行 SQL,可以使用 V$LONG_EXEC_SQLS 视图。
一、查看慢 SQL 的常用语句
select *
from V$LONG_EXEC_SQLS
where 1=1
order by finish_time desc;
二、SQL 作用说明
该语句主要用于:
-
查询数据库中执行时间较长的 SQL
-
按完成时间倒序排列
-
优先查看最近出现的慢 SQL
其中:
| 字段 | 说明 |
|---|---|
| SQL_ID | SQL唯一标识 |
| EXEC_TIME | 执行耗时 |
| START_TIME | 开始时间 |
| FINISH_TIME | 结束时间 |
| SQL_TEXT | SQL文本 |
| USERNAME | 执行用户 |
三、为什么这个视图重要?
很多 DBA 在排查性能问题时,第一反应是:
-
AWR
-
ASH
-
Top SQL
-
Explain Plan
但实际上:
V$LONG_EXEC_SQLS更适合快速定位"当前正在拖慢系统"的 SQL。
尤其适用于:
-
系统突然变慢
-
CPU 飙高
-
会话阻塞
-
批量任务执行异常
-
夜间定时任务卡死
四、推荐优化版查询
实际生产环境中,建议不要直接 select *,可以筛选关键字段:
select
sql_id,
username,
exec_time,
start_time,
finish_time,
substr(sql_text,1,100) sql_text
from V$LONG_EXEC_SQLS
order by exec_time desc;
这样可以:
-
提高查询效率
-
避免输出过长
-
更容易快速分析
五、发现慢 SQL 后怎么办?
拿到 SQL 后,建议继续执行:
1. 查看执行计划
explain plan for SQL语句;
2. 查看是否走索引
重点关注:
-
FULL TABLE SCAN
-
HASH JOIN
-
SORT
-
TEMP
3. 检查是否存在:
-
大表全扫描
-
缺失索引
-
隐式类型转换
-
返回数据过多
-
where 条件未命中索引
六、实际生产经验
在生产环境中,经常遇到:
-
一个没有索引的查询
-
导致几十亿数据扫描
-
CPU 直接打满
-
整个数据库响应变慢
而通过:
V$LONG_EXEC_SQLS
往往几分钟内就能定位问题 SQL。
七、总结
V$LONG_EXEC_SQLS 是 Oracle DBA 排查性能问题非常实用的视图。
建议:
-
日常巡检定期查看
-
配合 AWR/ASH 使用
-
建立慢 SQL 监控机制
一句话:
数据库性能问题,80% 都能从慢 SQL 入手解决。