面试宝典:介绍下Oracle数据库动态性能视图 V$SQLAREA_PLAN_HASH

在这里插入图片描述# 🧠 Oracle 19C V$SQLAREA_PLAN_HASH 视图详解

1. 视图概述与作用

V$SQLAREA_PLAN_HASH 是 Oracle 19C 中一个重要的动态性能视图,它提供了按 SQL_ID 和执行计划哈希值(PLAN_HASH_VALUE)聚合的 SQL 执行统计信息。这个视图是性能调优的重要工具,特别适用于分析同一SQL语句不同执行计划的性能差异。

核心作用:

  1. 执行计划分析:识别同一SQL语句的不同执行计划及其性能特征
  2. 计划稳定性监控:监控SQL语句执行计划的变化和稳定性
  3. 性能对比:比较不同执行计划对同一SQL语句的性能影响
  4. SQL调优验证:验证SQL优化后执行计划的变化和性能改善
  5. AWR数据访问:提供对AWR历史SQL数据的访问接口

2. 字段含义详解

下表详细说明了 V$SQLAREA_PLAN_HASH 视图中的各个字段:

字段名 (Column Name)数据类型 (Datatype)描述 (Description)
SQL_IDVARCHAR2(13)SQL语句的唯一标识符。基于SQL文本的哈希值。
PLAN_HASH_VALUENUMBER执行计划的哈希值。唯一标识特定的执行计划。
DBIDNUMBER数据库标识符
INSTANCE_NUMBERNUMBER实例编号(在RAC环境中)。
SNAP_IDNUMBERAWR快照ID。标识统计信息所属的快照。
EXECUTIONS_DELTANUMBER快照期间SQL语句的执行次数变化量
DISK_READS_DELTANUMBER快照期间物理读次数的变化量
BUFFER_GETS_DELTANUMBER快照期间逻辑读次数的变化量
ROWS_PROCESSED_DELTANUMBER快照期间处理行数的变化量
CPU_TIME_DELTANUMBER快照期间CPU时间的变化量(微秒)
ELAPSED_TIME_DELTANUMBER快照期间总执行时间的变化量(微秒)
IOWAIT_DELTANUMBER快照期间I/O等待时间的变化量
CLWAIT_DELTANUMBER快照期间集群等待时间的变化量
APWAIT_DELTANUMBER快照期间应用等待时间的变化量
CCWAIT_DELTANUMBER快照期间并发等待时间的变化量
PARSE_CALLS_DELTANUMBER快照期间解析调用次数的变化量
INVALIDATIONS_DELTANUMBER快照期间游标失效次数的变化量
LOADED_VERSIONS_DELTANUMBER快照期间加载版本数的变化量
VERSION_COUNT_DELTANUMBER快照期间版本计数的变化量
SHARABLE_MEM_DELTANUMBER快照期间共享内存的变化量
TOTAL_SQL_AREANUMBERSQL区域的总大小
SQL_PROFILEVARCHAR2(64)SQL配置文件的名称(如果存在)。
SQL_PATCHVARCHAR2(64)SQL补丁的名称(如果存在)。
SQL_BASELINEVARCHAR2(64)SQL基线的名称(如果存在)。
OPTIMIZER_COSTNUMBER优化器估算的执行成本
OPTIMIZER_MODEVARCHAR2(32)优化器模式
OPTIMIZER_ENV_HASH_VALUENUMBER优化器环境哈希值
PARSING_SCHEMA_NAMEVARCHAR2(128)解析该SQL语句的schema名称
MODULEVARCHAR2(64)执行SQL的应用程序模块名
ACTIONVARCHAR2(64)执行SQL的应用程序动作名
CON_IDNUMBER容器ID。在多租户环境中标识所属容器。

3. 使用场景

V$SQLAREA_PLAN_HASH 在以下场景中非常重要:

  1. 执行计划稳定性分析:监控同一SQL语句是否产生不同的执行计划
  2. 性能回归分析:当SQL性能下降时,检查执行计划是否发生变化
  3. AWR数据分析:分析历史时间段内SQL语句的执行计划变化
  4. SQL优化验证:验证优化措施(如索引添加、统计信息收集)是否改变了执行计划
  5. 多计划性能对比:比较同一SQL不同执行计划的性能特征
  6. 基线合规性检查:检查SQL是否使用正确的执行计划基线

4. 底层原理与相关知识点

4.1 执行计划哈希值原理

PLAN_HASH_VALUE 是执行计划的唯一标识符,基于执行计划的以下特征计算:

  • 表访问顺序和连接方法
  • 索引使用情况
  • 排序和聚合操作
  • 并行执行设置
  • 优化器环境设置

相同的执行计划会产生相同的PLAN_HASH_VALUE,即使SQL文本稍有不同。

4.2 AWR快照机制

V$SQLAREA_PLAN_HASH 的数据来源于AWR(自动工作负载仓库)快照:

  • 快照定期捕获性能数据(默认每小时一次)
  • Delta值表示两个快照之间的变化量
  • 数据持久化存储在SYSAUX表空间中

4.3 执行计划稳定性因素

影响执行计划稳定性的因素包括:

  • 统计信息变化
  • 绑定变量窥视
  • 优化器参数变更
  • 系统负载变化
  • 数据库对象变更

5. 相关视图

视图名称主要用途描述
DBA_HIST_SQLSTATAWR历史SQL统计信息
V$SQL当前共享池中的SQL详细信息
V$SQLAREASQL语句的汇总统计信息
DBA_HIST_SQL_PLANAWR历史执行计划信息
V$SQL_PLAN当前共享池中的执行计划
DBA_HIST_SQLTEXTAWR历史SQL文本

6. 基表信息

V$SQLAREA_PLAN_HASH 基于底层的 AWR表构建,主要是:

  • WRH$_SQLSTAT:AWR SQL统计信息表
  • WRH$_SQL_PLAN:AWR执行计划表
  • WRM$_SNAPSHOT:AWR快照元数据表

这些表存储在SYSAUX表空间中,由MMON后台进程维护。

7. 常用查询 SQL

7.1 同一SQL的不同执行计划性能对比

SELECT 
    sql_id,
    plan_hash_value,
    sum(executions_delta) as executions,
    sum(buffer_gets_delta) as buffer_gets,
    sum(disk_reads_delta) as disk_reads,
    sum(cpu_time_delta)/1000000 as cpu_sec,
    sum(elapsed_time_delta)/1000000 as elapsed_sec,
    round(sum(buffer_gets_delta) / decode(sum(executions_delta),0,1,sum(executions_delta))) as avg_gets_per_exec,
    round(sum(cpu_time_delta) / decode(sum(executions_delta),0,1,sum(executions_delta))/1000) as avg_cpu_ms_per_exec
FROM 
    v$sqlarea_plan_hash
WHERE 
    sql_id = '&sql_id'
    AND executions_delta > 0
GROUP BY 
    sql_id, plan_hash_value
ORDER BY 
    executions DESC;

7.2 执行计划稳定性分析

SELECT 
    sql_id,
    count(distinct plan_hash_value) as plan_count,
    sum(executions_delta) as total_executions,
    min(snap_id) as first_snap,
    max(snap_id) as last_snap,
    round(sum(elapsed_time_delta) / decode(sum(executions_delta),0,1,sum(executions_delta))/1000, 2) as avg_elapsed_ms
FROM 
    v$sqlarea_plan_hash
WHERE 
    executions_delta > 100
GROUP BY 
    sql_id
HAVING 
    count(distinct plan_hash_value) > 1
ORDER BY 
    plan_count DESC;

7.3 执行计划性能回归分析

SELECT 
    sql_id,
    plan_hash_value,
    to_char(min(begin_interval_time), 'YYYY-MM-DD HH24:MI') as period_start,
    to_char(max(end_interval_time), 'YYYY-MM-DD HH24:MI') as period_end,
    sum(executions_delta) as executions,
    round(sum(elapsed_time_delta) / decode(sum(executions_delta),0,1,sum(executions_delta))/1000, 2) as avg_elapsed_ms,
    round(sum(buffer_gets_delta) / decode(sum(executions_delta),0,1,sum(executions_delta))) as avg_gets
FROM 
    v$sqlarea_plan_hash sph
JOIN 
    dba_hist_snapshot sn ON sph.snap_id = sn.snap_id AND sph.dbid = sn.dbid
WHERE 
    sql_id = '&sql_id'
    AND executions_delta > 0
GROUP BY 
    sql_id, plan_hash_value
ORDER BY 
    period_start;

7.4 高资源消耗执行计划查询

SELECT 
    sql_id,
    plan_hash_value,
    sum(executions_delta) as executions,
    sum(buffer_gets_delta) as total_buffer_gets,
    sum(disk_reads_delta) as total_disk_reads,
    sum(cpu_time_delta)/1000000 as total_cpu_sec,
    round(sum(buffer_gets_delta) / decode(sum(executions_delta),0,1,sum(executions_delta))) as avg_gets,
    round(sum(cpu_time_delta) / decode(sum(executions_delta),0,1,sum(executions_delta))/1000) as avg_cpu_ms
FROM 
    v$sqlarea_plan_hash
WHERE 
    executions_delta > 1000
GROUP BY 
    sql_id, plan_hash_value
HAVING 
    sum(buffer_gets_delta) / decode(sum(executions_delta),0,1,sum(executions_delta)) > 10000
ORDER BY 
    avg_gets DESC;

8. 最佳实践与注意事项

  1. 定期监控:建立定期的执行计划稳定性监控机制
  2. 性能基线:为关键SQL语句建立性能基线,包括执行计划和性能指标
  3. 变更管理:任何可能影响执行计划的变更(如统计信息收集、参数调整)都应记录和验证
  4. AWR保留策略:确保AWR数据有足够的保留期以供历史分析
  5. SQL计划管理:使用SQL计划基线稳定关键SQL的执行计划
  6. 多维度分析:结合其他视图(如DBA_HIST_SQL_PLAN)进行深度分析
  7. 趋势分析:关注执行计划和性能指标的历史趋势,而不仅仅是当前状态

通过正确使用 V$SQLAREA_PLAN_HASH 视图,DBA可以深入了解SQL语句的执行计划行为,及时发现和解决执行计划不稳定导致的性能问题,确保数据库的性能和稳定性。

欢迎关注我的公众号《IT小Chen

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值