
Oracle 19C V$SQLSTATS 动态性能视图全面详解
1. 视图概述与核心作用
V$SQLSTATS 是 Oracle 19C 中一个重要的动态性能视图,它提供了 SQL 语句执行统计信息的快速访问接口。这个视图专门为性能监控和优化设计,相比传统的 V$SQL 视图,它提供了更高效的访问方式和更稳定的数据持久性。
核心作用:
- 提供 SQL 语句执行的聚合统计信息
- 支持高性能的 SQL 监控和诊断
- 减少对共享池的访问竞争
- 提供比 V$SQL 更稳定的统计信息视图
- 支持基于各种指标的 SQL 性能分析
2. 主要使用场景
- SQL 性能监控:实时监控系统中执行的 SQL 语句性能
- 资源消耗分析:识别消耗大量资源的 SQL 语句
- 性能基线建立:建立 SQL 性能基线用于比较分析
- 容量规划:评估 SQL 工作负载对系统资源的需求
- 故障诊断:诊断性能问题和异常行为
- AWR 报告补充:为自动工作负载仓库报告提供基础数据
3. 字段详解
以下是 V$SQLSTATS 视图的主要字段及其详细说明:
| 字段名 | 数据类型 | 含义说明 | 重要程度 |
|---|---|---|---|
| SQL_ID | VARCHAR2(13) | SQL 语句的唯一标识符 | 高 |
| SQL_TEXT | VARCHAR2(1000) | SQL 语句的前1000个字符 | 高 |
| SQL_FULLTEXT | CLOB | SQL 语句的完整文本 | 高 |
| SQL_TYPE | NUMBER | SQL 语句类型 | 中 |
| SQL_PROFILE | VARCHAR2(128) | 使用的 SQL Profile 名称 | 中 |
| EXECUTIONS | NUMBER | 执行次数 | 高 |
| FETCHES | NUMBER | 获取次数 | 中 |
| END_OF_FETCH_COUNT | NUMBER | 完成获取的次数 | 中 |
| SORTS | NUMBER | 排序次数 | 中 |
| LOADED_VERSIONS | NUMBER | 加载的版本数 | 低 |
| OPENED_VERSIONS | NUMBER | 打开的版本数 | 低 |
| USERS_OPENING | NUMBER | 打开的用户数 | 低 |
| USERS_EXECUTING | NUMBER | 正在执行的用户数 | 中 |
| PARSE_CALLS | NUMBER | 解析调用次数 | 高 |
| DISK_READS | NUMBER | 磁盘读取次数 | 高 |
| DIRECT_WRITES | NUMBER | 直接写入次数 | 中 |
| BUFFER_GETS | NUMBER | 缓冲区获取次数 | 高 |
| APPLICATION_WAIT_TIME | NUMBER | 应用等待时间 | 高 |
| CONCURRENCY_WAIT_TIME | NUMBER | 并发等待时间 | 高 |
| CLUSTER_WAIT_TIME | NUMBER | 集群等待时间 | 高 |
| USER_IO_WAIT_TIME | NUMBER | 用户 I/O 等待时间 | 高 |
| PLSQL_EXEC_TIME | NUMBER | PL/SQL 执行时间 | 中 |
| JAVA_EXEC_TIME | NUMBER | Java 执行时间 | 中 |
| ROWS_PROCESSED | NUMBER | 处理的行数 | 高 |
| CPU_TIME | NUMBER | CPU 时间(微秒) | 高 |
| ELAPSED_TIME | NUMBER | 总耗时(微秒) | 高 |
| INVALIDATIONS | NUMBER | 失效次数 | 中 |
| LAST_LOAD_TIME | VARCHAR2(19) | 最后加载时间 | 中 |
| LAST_ACTIVE_TIME | DATE | 最后活动时间 | 高 |
| MODULE | VARCHAR2(64) | 执行模块名称 | 中 |
| ACTION | VARCHAR2(64) | 执行动作名称 | 中 |
| CON_ID | NUMBER | 容器 ID(多租户环境) | 中 |
4. 相关视图与基表
相关视图:
- V$SQL:提供详细的 SQL 执行统计信息,但访问开销较大
- V$SQLAREA:SQL 区域的共享游标统计信息
- V$SQLTEXT:SQL 语句的完整文本
- V$SQL_PLAN:SQL 执行计划信息
- V$SQL_MONITOR:实时 SQL 监控信息
- DBA_HIST_SQLSTAT:AWR 历史 SQL 统计信息
- GV$SQLSTATS:集群环境下所有实例的 SQL 统计信息
基表:
V$SQLSTATS 基于内存中的 X$ 表实现,主要是:
- X$KGLCURSOR_CHILD_STATS:子游标统计信息的内部表
- X$KGLCURSOR:游标信息的内部表
- X$KGLTABLE:对象句柄表
这些 X$ 表是 Oracle 内部数据结构的外部化表示,存储在 SGA 的共享池中。
5. 底层原理与内部机制
数据收集机制:
- 共享池管理:SQL 语句在共享池中解析和执行时,Oracle 会收集相关统计信息
- 统计信息聚合:
V$SQLSTATS提供了对共享池中 SQL 统计信息的聚合视图 - 内存结构:统计信息存储在 SGA 的共享池中的内部数据结构中
- 持久化机制:相比
V$SQL,V$SQLSTATS的统计信息在游标失效后仍然保持
性能优势:
- 减少竞争:通过减少对共享池的访问来降低竞争
- 优化访问:使用专门优化的访问路径获取统计信息
- 数据持久性:统计信息在游标老化出共享池后仍然可用
- 高效查询:针对常见的性能监控查询进行了优化
数据更新机制:
- 当 SQL 语句执行时,相关统计信息会实时更新
- 统计信息存储在共享池的内部结构中
V$SQLSTATS提供对这些统计信息的快速访问接口- 数据在实例关闭时丢失,但可以通过 AWR 进行持久化
6. 常用查询SQL
查询1:查找消耗最多CPU时间的SQL
SELECT sql_id, sql_text, cpu_time/1000000 cpu_seconds,
elapsed_time/1000000 elapsed_seconds,
executions, buffer_gets, disk_reads
FROM v$sqlstats
WHERE cpu_time > 0
ORDER BY cpu_time DESC
FETCH FIRST 10 ROWS ONLY;
查询2:识别高磁盘读的SQL语句
SELECT sql_id, sql_text, disk_reads,
disk_reads/NULLIF(executions,0) reads_per_exec,
buffer_gets, elapsed_time/1000000 elapsed_seconds
FROM v$sqlstats
WHERE disk_reads > 1000
ORDER BY disk_reads DESC;
查询3:分析SQL执行效率
SELECT sql_id, sql_text, executions,
buffer_gets/NULLIF(executions,0) avg_buffer_gets,
disk_reads/NULLIF(executions,0) avg_disk_reads,
rows_processed/NULLIF(executions,0) avg_rows,
elapsed_time/NULLIF(executions,0)/1000000 avg_elapsed_secs
FROM v$sqlstats
WHERE executions > 10
ORDER BY avg_buffer_gets DESC;
查询4:监控并发等待严重的SQL
SELECT sql_id, sql_text, concurrency_wait_time/1000000 concurrency_secs,
application_wait_time/1000000 application_secs,
user_io_wait_time/1000000 user_io_secs
FROM v$sqlstats
WHERE concurrency_wait_time > 1000000
ORDER BY concurrency_wait_time DESC;
查询5:查找频繁执行的SQL
SELECT sql_id, sql_text, executions,
last_active_time, module, action
FROM v$sqlstats
WHERE executions > 1000
ORDER BY executions DESC;
查询6:分析SQL解析情况
SELECT sql_id, sql_text, parse_calls,
parse_calls/NULLIF(executions,0) parse_ratio,
loaded_versions, opened_versions
FROM v$sqlstats
WHERE parse_calls > executions * 1.1
ORDER BY parse_ratio DESC;
查询7:多租户环境下的SQL监控
SELECT con_id, sql_id, sql_text,
SUM(executions) total_executions,
SUM(cpu_time)/1000000 total_cpu_seconds
FROM gv$sqlstats
WHERE con_id > 1
GROUP BY con_id, sql_id, sql_text
ORDER BY total_cpu_seconds DESC;
7. 关键知识点与注意事项
重要知识点:
- 性能优势:
V$SQLSTATS比V$SQL访问更快,对系统影响更小 - 数据持久性:统计信息在游标失效后仍然保持,便于历史分析
- 资源消耗:查询
V$SQLSTATS的资源消耗远低于V$SQL - 实时性:数据接近实时更新,但可能有轻微延迟
- 多租户支持:在 CDB 环境中提供每个容器的统计信息
诊断技巧:
- CPU 分析:使用
CPU_TIME识别计算密集型 SQL - I/O 分析:通过
DISK_READS和BUFFER_GETS识别 I/O 密集型 SQL - 等待分析:利用各种等待时间字段诊断并发和资源竞争问题
- 效率分析:通过比较
EXECUTIONS和ROWS_PROCESSED评估 SQL 效率 - 趋势分析:结合
LAST_ACTIVE_TIME进行时间序列分析
最佳实践:
- 使用
V$SQLSTATS代替V$SQL进行常规性能监控 - 定期收集关键 SQL 的基准性能数据
- 设置警报监控异常 SQL 行为
- 结合 AWR 报告进行历史趋势分析
- 使用绑定变量减少硬解析和共享池碎片
注意事项:
- 数据生命周期:数据在实例关闭时丢失,重要数据应定期保存到历史表
- 权限要求:需要
SELECT ANY DICTIONARY或相应权限 - 性能影响:虽然影响较小,但频繁查询仍可能对系统性能产生影响
- 数据准确性:在极高并发环境下,统计信息可能有轻微误差
- 版本差异:字段和行为可能在不同 Oracle 版本中有差异
与 V$SQL 的主要区别:
- 性能:
V$SQLSTATS访问更快,资源消耗更少 - 持久性:
V$SQLSTATS统计信息在游标失效后仍然保持 - 完整性:
V$SQL包含更多详细字段,但访问开销更大 - 使用场景:
V$SQLSTATS适合监控,V$SQL适合详细诊断
通过深入理解和使用 V$SQLSTATS 视图,DBA 和开发人员可以有效地监控和优化 SQL 性能,提高数据库系统的整体效率和稳定性。
欢迎关注我的公众号《IT小Chen》
969

被折叠的 条评论
为什么被折叠?



