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
,表示合并的行数。
-
-