直接在SQLPlus或SQLcl中执行@?/rdbms/admin/awrsqrpt.sql启动交互式单SQL性能报告,需满足STATISTICS_LEVEL为TYPICAL/ALL、SQL_ID存在于AWR、当前用户有DBA_HIST_视图SELECT权限三个前提。

awrsqrpt.sql 脚本怎么调用
直接在 SQL*Plus 或 SQLcl 中执行 @?/rdbms/admin/awrsqrpt.sql 即可启动交互式报告生成。它和 awrrpt.sql 的交互流程类似,但目标更聚焦:只分析一条 SQL(通过 SQL_ID 定位)。注意不是所有客户端都支持该脚本路径别名 ?,若报错“file not found”,请改用绝对路径,例如:@$ORACLE_HOME/rdbms/admin/awrsqrpt.sql。
必须提前确认的三个前提条件
运行前不满足任一条件,脚本会中途退出或返回空报告:
-
STATISTICS_LEVEL参数必须是TYPICAL或ALL(BASIC会禁用 AWR 数据采集) - 目标
SQL_ID必须存在于 AWR 历史中——即该 SQL 在指定快照区间内被采样过(通常要求执行次数 ≥ 10 次,或逻辑读 ≥ 数千次,否则可能漏采) - 当前用户需有
SELECT权限访问DBA_HIST_SQLSTAT、DBA_HIST_SNAPSHOT等 AWR 视图(常见于DBA或SELECT_CATALOG_ROLE)
快照范围选不对,报告就失去对比价值
awrsqrpt 不像 awrrpt 那样默认展示负载概览,它的核心输出是单条 SQL 在多个快照中的性能趋势。因此快照区间不能太窄(比如只选 2 个快照),否则看不出变化;也不能跨太久(比如 7 天),因为中间可能经历统计信息更新、索引增删、绑定变量值变更等干扰因素。建议:
- 先查该 SQL 的活跃时段:
SELECT snap_id, begin_interval_time FROM dba_hist_snapshot s JOIN dba_hist_sqlstat t ON s.snap_id = t.snap_id WHERE t.sql_id = 'abc123xyz' ORDER BY snap_id DESC LIMIT 10; - 再从中挑出连续、有业务意义的区间(如“大促前 vs 大促中”、“升级前后各1小时”)
- 避免包含
SNAP_ID为 0 或 1 的初始快照(数据不完整)
报告里最该盯住的四列指标
HTML 格式报告中,“SQL Statistics for SQL ID” 表格里的以下四列是判断性能是否异常的核心:
-
Elapsed Time (s):总耗时,看是否突增;注意单位是秒,不是毫秒 -
CPU Time (s):如果占比长期 > 80%,说明瓶颈在计算逻辑而非 I/O,优先检查执行计划是否走错索引或未绑定变量 -
Buffer Gets:逻辑读,同一 SQL 在不同快照间若翻倍增长,大概率是执行计划变更(PLAN_HASH_VALUE列会变) -
Executions:执行次数突降可能意味着应用层熔断或 SQL 被重写;突增则要结合应用日志确认是否误触发
真正容易被忽略的是:这些指标全是 _DELTA 值(快照区间增量),不是累计值。所以两个快照之间间隔越长,数值天然越大——比较时必须归一化到“每次执行”或“每秒”,否则会被时间长度误导。



















