oracle 动态性能视图

发布于:2025-04-10 ⋅ 阅读:(34) ⋅ 点赞:(0)

Oracle 数据库中的 V$SQLAREA 是一个动态性能视图(Dynamic Performance View),用于记录共享池(Shared Pool)中所有 SQL 语句的统计信息。每个 SQL 语句在共享池中存储为一个游标(Cursor),而 V$SQLAREA 提供了这些游标的聚合信息。

核心字段

  1. SQL_ID

    • SQL 语句的唯一标识符(哈希值),用于跟踪特定 SQL。

  2. HASH_VALUE

    • 旧版 SQL 的哈希值(与 SQL_ID 并存,但 SQL_ID 更常用)。

  3. ADDRESS

    • SQL 语句在共享池中的内存地址,常用于联合其他视图(如 V$SQLTEXT)。

  4. VERSION_COUNT

    • 共享池中该 SQL 的不同版本游标数量(如因绑定变量窥视导致的不同执行计划)。

  5. PARSING_SCHEMA_NAME

    • 解析该 SQL 的数据库用户(模式名)。

  6. EXECUTIONS

    • SQL 语句的总执行次数。

  7. FIRST_LOAD_TIME

    • SQL 首次被加载到共享池的时间戳(格式:YYYY-MM-DD HH24:MI:SS)。

  8. LAST_LOAD_TIME

    • SQL 最后一次被加载到共享池的时间戳。

  9. LAST_ACTIVE_TIME

    • SQL 最后一次执行的时间戳。

性能相关字段

  1. ELAPSED_TIME

    • 所有执行的总耗时(微秒),包括等待时间(如 I/O)。

  2. CPU_TIME

    • 所有执行消耗的 CPU 时间(微秒)。

  3. BUFFER_GETS

    • 所有执行中逻辑读(Logical Reads)的总次数。

  4. DISK_READS

    • 所有执行中物理读(Physical Reads)的总次数。

  5. ROWS_PROCESSED

    • 所有执行中处理的总行数。

  6. OPTIMIZER_COST

    • 优化器估算的 SQL 执行成本(相对值,非实际资源消耗)。

  7. FETCHES

    • 数据获取次数(通常针对查询语句)。

  8. SORTS

    • 所有执行中排序操作的总次数。

其他关键字段

  1. MODULE / ACTION

    • 应用程序通过 DBMS_APPLICATION_INFO 设置的模块名和操作名(用于追踪来源)。

  2. SQL_TEXT

    • SQL 语句的前 1000 个字符(完整 SQL 需关联 V$SQLTEXT)。

  3. PLAN_HASH_VALUE

    • 执行计划的哈希值,用于识别不同执行计划。

  4. CHILD_NUMBER

    • 子游标编号(需联合 V$SQL 使用)。

  5. SHARABLE_MEM

    • 共享内存占用量(字节)。

  6. PERSISTENT_MEM

    • 持久内存占用量(字节)。

  7. RUNTIME_MEM

    • 运行时内存占用量(字节)。

  8. IO_CELL_OFFLOAD_ELIGIBLE_BYTES

    • 可被智能扫描(Exadata)优化的 I/O 字节数(仅适用于 Exadata)。

  9. IO_INTERCONNECT_BYTES

    • 通过存储网络传输的实际 I/O 字节数。

应用场景

  • 性能分析:通过 BUFFER_GETSDISK_READSCPU_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;

字段解释

  1. sql_id

    • 含义:SQL 语句的唯一标识符。

    • 作用:用于区分不同的 SQL 语句,即使 SQL 文本完全相同,Oracle 也会为每次解析生成的执行计划分配唯一的 sql_id

  2. sql_text

    • 含义:SQL 语句的文本内容。

    • 注意:由于视图 v$sqlarea 的限制,较长的 SQL 文本可能被截断。完整文本可通过 v$sqlstats.sql_fulltext 或 DBA_HIST_SQLTEXT(AWR 历史表)查看。

  3. sorts

    • 含义:该 SQL 语句在所有执行过程中触发的 排序操作总次数

    • 背景:排序通常由以下操作触发:

      • ORDER BY

      • GROUP BY

      • DISTINCT

      • 索引创建(如 CREATE INDEX

    • 性能影响

      • 若排序在内存(PGA)中完成,效率较高。

      • 若排序使用临时表空间(磁盘排序),会显著增加 I/O 开销,需优化。

  4. rows_processed

    • 含义:该 SQL 语句在所有执行过程中 处理的总行数

    • 分类

      • 对于 SELECT,表示返回的行数。

      • 对于 INSERT/UPDATE/DELETE,表示影响的行数。

      • 对于 MERGE,表示合并的行数。


网站公告

今日签到

点亮在社区的每一天
去签到