如何配置AWR捕获更多SQL_修改TOPNSQL参数增加快照中的SQL数量

夏静小哥_3925

夏静小哥_3925

2026-04-07

676人浏览

原创

AWR的topnsql参数控制每快照捕获的Top SQL数量,默认30,需用DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS修改,范围1–100,仅影响后续快照。

AWR快照里SQL数量太少,topnsql参数在哪改

awr默认只保留每个快照中执行时间最长的30条sql(topnsql=30),想看更多,得改这个参数。它不是在init.ora或spfile里配的,而是存在数据字典里,用dbms_workload_repository包修改。

  • topnsql是AWR内部控制每份快照捕获多少条“Top SQL”的阈值,影响DBA_HIST_SQLSTAT和DBA_HIST_SQLTEXT里能查到的SQL数量
  • 修改必须用sys或具有ADMINISTER DATABASE TRIGGER权限的用户执行
  • 改完不会立即生效,只对后续新生成的快照起作用;已有快照里的SQL数量不会回填
  • 可设范围是1–100,超过100会报错ORA-13541: topnsql value must be between 1 and 100

示例:把TOP SQL数量提到60

EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(topnsql => 60);

改了topnsql但快照里还是没多出SQL

常见误解是“改完就能看到历史快照变多”,其实AWR不会重算旧快照。另外,即使设成100,也不代表每份快照真有100条SQL入库——它只取“该快照周期内排序前N的SQL”,如果某次采样周期内活跃SQL本身就少,或者大量SQL执行时间/逻辑读非常接近,可能仍不足设定值。

  • 检查当前设置是否生效:SELECT topnsql FROM dba_hist_wr_control;
  • 确认快照时间窗口内是否有足够“差异化”的高负载SQL;比如全是短平快的OLTP语句,elapsed_time拉不开差距,就容易被截断
  • 注意topnsql只影响按执行时间排序的SQL;不控制按CPU、IO、buffer gets等维度排名的SQL数量(那些由其他隐含参数控制)
  • 如果应用大量使用绑定变量且SQL文本相同,DBA_HIST_SQLTEXT里只会存一条,但DBA_HIST_SQLSTAT里仍按sql_id分开统计——别误以为“没多出来”

topnsql调太高有什么代价

增大topnsql直接增加每次快照采集时的内存开销和写入量,尤其在高并发、SQL种类多的系统上,可能拖慢快照生成速度,甚至导致AWR flush超时。

  • 每多记1条SQL,就要多写几行到WRH$_SQLSTAT基表,还涉及关联的WRH$_SQLTEXT、WRH$_SQL_BIND_METADATA等
  • Oracle 12c+默认启用了SQL Plan Directives和Auto SQL Tuning,这些功能也会读取同一套Top SQL数据,topnsql过大可能间接加重后台任务负担
  • 实测中,从30调到60一般无感;但跳到100后,在峰值每秒数百SQL执行的库上,单次快照生成时间可能延长10%~20%
  • 备份和传输AWR数据(如用DBMS_SWRF_INTERNAL导出)体积也会线性增长

有没有比改topnsql更灵活的替代方案

硬调topnsql是全局开关,不够精准。真要深度分析某类SQL,不如绕过AWR快照限制,直接查实时或近实时数据源。

  • 查V$SQL或V$SQLAREA:能看到当前共享池里所有解析过的SQL,不受topnsql限制,但生命周期短,重启或刷库就丢
  • 开启SQL Trace + DBMS_MONITOR:对特定模块/用户/服务做定向捕获,比AWR粒度细、无上限,只是需要提前规划
  • 用ASH(V$ACTIVE_SESSION_HISTORY)反推:虽然ASH本身也不存完整SQL文本,但结合sql_id去V$SQLTEXT捞,能还原出当时正在跑的任意SQL
  • 12c+可用DBMS_AUTO_SQLTUNE的自定义任务,指定scope="COMPREHENSIVE"并扩大time_limit,它会主动扫描更多候选SQL

真正难的不是“怎么让AWR多记几条”,而是判断哪些SQL值得记——盲目调高topnsql,最后查出来的可能全是低价值的重复查询。留心那些没进Top但持续消耗CPU的短SQL,它们常被topnsql机制漏掉。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4383

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

911

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1149

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6321

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3143

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6300

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

8561

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1170

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1012

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.8万人学习