V$SQL 是 Oracle 数据库提供的一个 动态性能视图(Dynamic Performance View),用于记录当前在共享 SQL 区中缓存的所有 SQL 语句的执行信息。它是性能调优和 SQL 分析中最常用的视图之一。


🔍 V$SQL 的作用

  • 记录已执行并缓存在共享池中的 SQL 语句。
  • 提供 SQL 执行的统计信息,如执行次数、CPU 时间、逻辑读等。
  • 支持识别慢 SQL 或资源消耗高的 SQL。
  • 可用于诊断数据库性能问题。

📋 常见字段说明

字段名

含义

SQL_ID

SQL 的唯一标识符(哈希值生成)

SQL_TEXT

SQL 文本(前1000个字符)

ELAPSED_TIME

总耗时(单位:纳秒)

CPU_TIME

CPU 使用时间(单位:纳秒)

EXECUTIONS

已执行次数

FETCHES

获取行数的次数

ROWS_PROCESSED

处理的总行数

FIRST_LOAD_TIME

第一次加载到共享池的时间

LAST_ACTIVE_TIME

最后一次执行时间

DISK_READS

物理读取次数

BUFFER_GETS

逻辑读取次数(包括内存)

MODULE, ACTION

应用模块和操作名称(如果设置了)

IS_OBSOLETE

是否被标记为过期

更多字段可以使用 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

视图

描述

V$SQL

显示所有子游标(每个不同的执行计划都有一条记录)

V$SQLAREA

聚合了同一 SQL 的所有子游标,适合查看整体统计信息


如果你需要分析某段时间内的 SQL 性能趋势,建议配合 AWR(自动工作负载仓库)或 Statspack 报告进行更长时间的分析。