V$SQL
是 Oracle 数据库提供的一个 动态性能视图(Dynamic Performance View),用于记录当前在共享 SQL 区中缓存的所有 SQL 语句的执行信息。它是性能调优和 SQL 分析中最常用的视图之一。
🔍 V$SQL
的作用
- 记录已执行并缓存在共享池中的 SQL 语句。
- 提供 SQL 执行的统计信息,如执行次数、CPU 时间、逻辑读等。
- 支持识别慢 SQL 或资源消耗高的 SQL。
- 可用于诊断数据库性能问题。
📋 常见字段说明
字段名 | 含义 |
| SQL 的唯一标识符(哈希值生成) |
| SQL 文本(前1000个字符) |
| 总耗时(单位:纳秒) |
| CPU 使用时间(单位:纳秒) |
| 已执行次数 |
| 获取行数的次数 |
| 处理的总行数 |
| 第一次加载到共享池的时间 |
| 最后一次执行时间 |
| 物理读取次数 |
| 逻辑读取次数(包括内存) |
| 应用模块和操作名称(如果设置了) |
| 是否被标记为过期 |
更多字段可以使用 DESC V$SQL
查看完整结构。
🕒 数据周期
✅ 存活时间:
V$SQL
中的数据是内存中的缓存数据,只保留那些仍在共享池中的 SQL。- 当 SQL 被老化(LRU 算法)、刷新共享池(如执行
ALTER SYSTEM FLUSH SHARED_POOL
)或数据库重启后,相关记录会被清除。
⏳ 一般生命周期:
- 几分钟到几小时不等,取决于系统负载、共享池大小以及 SQL 活跃程度。
- 如果你想要长期保存 SQL 执行信息,应定期将感兴趣的数据导出到表中。
🧪 示例查询
-- 查询最耗时的 SQL
SELECT
SQL_ID,
SQL_TEXT,
ELAPSED_TIME / 1e6 AS elapsed_ms,
CPU_TIME / 1e6 AS cpu_ms,
EXECUTIONS,
BUFFER_GETS
FROM
V$SQL
ORDER BY
elapsed_ms DESC
FETCH FIRST 10 ROWS ONLY;
🚨 注意事项
- 不同子游标(child cursor)可能会有不同执行计划,可结合
V$SQL_PLAN
查看执行计划。 - 若启用了绑定变量窥探或自适应游标共享,可能有多个子游标 (
CHILD_NUMBER
)。 V$SQL
中的统计信息是累计值,需注意是否包含多次执行的结果。
🔄 对比 V$SQLAREA
视图 | 描述 |
| 显示所有子游标(每个不同的执行计划都有一条记录) |
| 聚合了同一 SQL 的所有子游标,适合查看整体统计信息 |
如果你需要分析某段时间内的 SQL 性能趋势,建议配合 AWR(自动工作负载仓库)或 Statspack 报告进行更长时间的分析。