Oracle 数据库中的 V$SQLAREA
是一个动态性能视图(Dynamic Performance View),用于记录共享池(Shared Pool)中所有 SQL 语句的统计信息。每个 SQL 语句在共享池中存储为一个游标(Cursor),而 V$SQLAREA
提供了这些游标的聚合信息。
核心字段
SQL_ID
SQL 语句的唯一标识符(哈希值),用于跟踪特定 SQL。
HASH_VALUE
旧版 SQL 的哈希值(与
SQL_ID
并存,但SQL_ID
更常用)。
ADDRESS
SQL 语句在共享池中的内存地址,常用于联合其他视图(如
V$SQLTEXT
)。
VERSION_COUNT
共享池中该 SQL 的不同版本游标数量(如因绑定变量窥视导致的不同执行计划)。
PARSING_SCHEMA_NAME
解析该 SQL 的数据库用户(模式名)。
EXECUTIONS
SQL 语句的总执行次数。
FIRST_LOAD_TIME
SQL 首次被加载到共享池的时间戳(格式:YYYY-MM-DD HH24:MI:SS)。
LAST_LOAD_TIME
SQL 最后一次被加载到共享池的时间戳。
LAST_ACTIVE_TIME
SQL 最后一次执行的时间戳。
性能相关字段
ELAPSED_TIME
所有执行的总耗时(微秒),包括等待时间(如 I/O)。
CPU_TIME
所有执行消耗的 CPU 时间(微秒)。
BUFFER_GETS
所有执行中逻辑读(Logical Reads)的总次数。
DISK_READS
所有执行中物理读(Physical Reads)的总次数。
ROWS_PROCESSED
所有执行中处理的总行数。
OPTIMIZER_COST
优化器估算的 SQL 执行成本(相对值,非实际资源消耗)。
FETCHES
数据获取次数(通常针对查询语句)。
SORTS
所有执行中排序操作的总次数。
其他关键字段
MODULE / ACTION
应用程序通过
DBMS_APPLICATION_INFO
设置的模块名和操作名(用于追踪来源)。
SQL_TEXT
SQL 语句的前 1000 个字符(完整 SQL 需关联
V$SQLTEXT
)。
PLAN_HASH_VALUE
执行计划的哈希值,用于识别不同执行计划。
CHILD_NUMBER
子游标编号(需联合
V$SQL
使用)。
SHARABLE_MEM
共享内存占用量(字节)。
PERSISTENT_MEM
持久内存占用量(字节)。
RUNTIME_MEM
运行时内存占用量(字节)。
IO_CELL_OFFLOAD_ELIGIBLE_BYTES
可被智能扫描(Exadata)优化的 I/O 字节数(仅适用于 Exadata)。
IO_INTERCONNECT_BYTES
通过存储网络传输的实际 I/O 字节数。
应用场景
性能分析:通过
BUFFER_GETS
、DISK_READS
、CPU_TIME
等字段识别高资源消耗的 SQL。执行计划对比:利用
PLAN_HASH_VALUE
分析同一 SQL 是否因不同执行计划导致性能差异。绑定变量问题:高
VERSION_COUNT
可能暗示绑定变量窥视(Bind Peeking)引发的问题。SQL 生命周期:通过
LAST_ACTIVE_TIME
判断 SQL 是否长期未使用,以决定是否需优化或清理。
分析排序与资源竞争
通过 SORTS
和 ROWS_PROCESSED
字段,识别大量排序操作的 SQL。
SELECT
sql_id,
sql_text,
sorts,
rows_processed
FROM
v$sqlarea
WHERE
sorts > 1000 -- 排序次数超过阈值
ORDER BY
sorts DESC;
字段解释
sql_id
含义:SQL 语句的唯一标识符。
作用:用于区分不同的 SQL 语句,即使 SQL 文本完全相同,Oracle 也会为每次解析生成的执行计划分配唯一的
sql_id
。
sql_text
含义:SQL 语句的文本内容。
注意:由于视图
v$sqlarea
的限制,较长的 SQL 文本可能被截断。完整文本可通过v$sqlstats.sql_fulltext
或DBA_HIST_SQLTEXT
(AWR 历史表)查看。
sorts
含义:该 SQL 语句在所有执行过程中触发的 排序操作总次数。
背景:排序通常由以下操作触发:
ORDER BY
GROUP BY
DISTINCT
索引创建(如
CREATE INDEX
)
性能影响:
若排序在内存(PGA)中完成,效率较高。
若排序使用临时表空间(磁盘排序),会显著增加 I/O 开销,需优化。
rows_processed
含义:该 SQL 语句在所有执行过程中 处理的总行数。
分类:
对于
SELECT
,表示返回的行数。对于
INSERT/UPDATE/DELETE
,表示影响的行数。对于
MERGE
,表示合并的行数。