https://zhuanlan.zhihu.com/p/397834311
经常被问到查看执行计划的最佳工具是什么,对我来说,答案总是SQL Monitor(包含在 Oracle Tuning Pack 中)。如果您需要确定在执行任何长时间运行的 SQL 语句期间发生了什么,它确实是最宝贵的工具。
为了帮助您充分利用 SQL Monitor,我想与您分享我多年来从最初的数据库管理团队那里学到的一些技巧和窍门!
如何控制监视哪些语句?
1)默认情况下,将监视并行运行或在单次执行中消耗至少 5 秒的 CPU 和 I/O 组合时间的 SQL 语句。
2)还可以通过简单地向语句添加 MONITOR 提示来强制对任何 SQL 语句进行监视。
SELECT /*+ MONITOR */ col1 , col2 , col3 FROM t1 WHERE col1 = 5 ;
但是,如果您无法修改 SQL 语句,因为它是用于第三方应用程序等的。您仍然可以通过设置事件“sql_monitor”和SQL_ID列表来强制进行监视,以便在系统级。
3)更改系统设置事件'sql_monitor [sql: 5hc07qvt8v737|sql: 9ht3ba3arrzt3] force=true' ;
但是,如果您有非常大的工作负载或复杂的执行计划,您还应该注意一些额外的限制。
默认情况下,Oracle 将监控的 SQL 语句数限制为20 X CPU_COUNT。您可以通过设置下划线参数_sqlmon_max_plan来增加此限制,但请注意,这会增加 SQL Monitor 在 Shared_Pool 中使用的内存量,并可能导致 SQL Monitoring 信息更快地从内存中老化。
如果执行计划少于 300 行,SQL Monitor 只会监视 SQL 语句。如果你知道你的执行计划比这大得多,你可以设置下划线参数_sqlmon_max_planlines来增加这个限制。同样,这将增加 SQL Monitor 在 Shared_Pool 中使用的内存量。
最后,您可以通过设置下划线参数_sqlmon_threshold来降低或增加 5 秒的默认阈值。但是,您应该意识到任何增加都可能意味着受监控的执行将更快地从 SQL Monitor 缓冲区中老化。
由于这些下划线参数的副作用不太理想,我强烈建议您不要设置它们。如果您确实需要使用它们,请仅在会话级别使用。
SQL Monitor 报告在 Oracle 数据库中保留多长时间?
当 SQL Monitor 最初在 Oracle Database 11g 中引入时,生成报告所需的信息仅在动态性能视图V$SQL_MONITOR_*(大小受限的内存缓冲区)中可用,而不会持久保存到磁盘。因此,无法保证信息会在声明完成后保留一分钟以上。但实际上,它通常存在的时间更长。
如果您使用的是 11g,我强烈建议您手动保存您感兴趣的任何 SQL Monitor 报告(请参阅下面的详细信息)。
在 Oracle 数据库 12 中,c SQL Monitor 报告保存在数据字典表DBA_HIST_REPORTS 中。默认情况下,Oracle 会将 SQL Monitor 报告保留 8 天。
听起来有点熟?
它应该,因为它是 AWR 保留策略。没错,SQL Monitor 保留策略是由 AWR 策略控制的。事实上,存储在DBA_HIST_REPORTS表中的每个 SQL Monitor 报告都与一个 AWR SNAP_ID相关联。您可以使用DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS 过程更改保留策略。
注意:虽然 SQL Monitor 报告的保留由 AWR 保留策略控制,并且每个报告都有一个 关联的SNAP_ID,但是当您导出或导入相应的 AWR 数据时,不会导出或导入 SQL Monitor 报告。
如何生成实时 SQL Monitor 报告?
您可以从Enterprise Manager (EM)、EM Database Express、SQL Developer或通过命令行生成实时 SQL Monitor 报告。
在 EM Database Express 中,单击 Performance 下拉菜单中的 Performance Hub。然后单击时间线图下的受监控 SQL 选项卡。
这将打开一个窗口,其中包含当前可用的受监视 SQL 语句的列表。
单击您感兴趣的语句的SQL_ID,将为该语句自动打开 SQL 监视器报告。然后,您可以保存报告,以便稍后查看或通过单击屏幕右上角的保存图标将其发送给其他人。
如果您希望保存整个性能中心的当前内容(包括所有受监控的 SQL 语句),您可以通过单击屏幕右上角的 PerfHub 报告图标来实现。
要在 SQL Developer 中生成 SQL Monitor 报告,请转到工具菜单并单击 Real-Time SQL Monitor。
这将打开一个窗口,其中包含当前可用的受监视 SQL 语句的列表。单击您感兴趣的条目,SQL Monitor 报告将在窗口下方自动打开。您可以通过单击屏幕左上角的保存按钮来保存 SQL 监视器报告。
注意:从 SQL Developer 保存的 SQL Monitor 报告不是活动报告,而只是图像。
从 19c 开始,您可以通过调用 PL/SQL 函数DBMS_SQLTUNE.REPORT_SQL_MONITOR 或 DBMS_SQL_MONITOR在命令行上生成实时 SQL Monitor 报告。
下面的示例展示了如何使用DBMS_SQLTUNE.REPORT_SQL_MONITOR通过将“活动”设置为报告类型来生成活动报告。
SET trimspool ON SET TRIM ON SET pages 0 SET linesize 32767 SET LONG 1000000 SET longchunksize 1000000 假脱机 sqlmon_active 。html 选择dbms_sqltune 。Report_sql_monitor ( SQL_ID =&GT ; '&安培; SQL_ID' , TYPE =&GT ; '主动' ) FROM 双重; 阀芯关闭
请记住编辑生成的 sqlmon_active.html 文件以删除文件中的第一行和最后一行(假脱机关闭)。然后可以在任何浏览器中查看生成的 HTML 文件。浏览器必须连接到 OTN 才能加载活动报告代码。
当您使用该软件包时,您只会
如何在 Oracle Database 12 c 中检索历史 SQL Monitor 报告?
您可以从Enterprise Manager (EM)、EM Database Express或通过命令行查看历史或存档的 SQL Monitor 报告。
在 EM Database Express 中,在 Performance Hub 页面的 Monitored SQL 选项卡上,单击屏幕左上角时间图上方的 Select Time Period 按钮。将出现一个弹出窗口;您可以在其中选择要查看 SQL Monitor 报告的时间段。
选择您想要的时间段,然后单击“确定”。这将打开一个窗口,其中包含该时间段受监控的 SQL 语句的列表。
然后,您可以通过单击SQL_ID来查看单个 SQL 监视器报告。和以前一样,如果您想保存特定报告以供离线查看(类似于实时报告),您可以单击“保存”。
还可以通过单击 PerfHub 主页面上的 PerfHub 报告按钮来保存 PerfHub 本身的全部内容,包括单个 SQL 监视器报告。
要为单个 SQL 语句手动生成持久的 SQL Monitor 报告,您首先需要找到它的REPORT_ID,然后使用 PL/SQL 函数DBMS_AUTO_REPORT.REPORT_REPOSITORY_DETAIL来提取报告。
查找REPORT_ID的最简单方法是查询DBA_HIST_REPORTS并提供有关 SQL 语句及其执行时间的尽可能多的信息。
在DBA_HIST_REPORTS 中,大多数列名都是不言自明的。但是,有两列KEY1和KEY2需要一些解释,因为您至少需要使用其中之一才能找到正确的REPORT_ID。
KEY1是该语句的SQL_ID
KEY2是对语句的SQL execution_id
这是我使用的查询示例:
SELECT REPORT_ID FROM dba_hist_reports WHERE DBID = 1954845848 AND COMPONENT_NAME = 'sqlmonitor' AND REPORT_NAME = '主' AND period_start_time BETWEEN TO_DATE ('27 / 07/2017 11:00:00' , 'DD / MM / YYYY HH:MI:SS' ) AND To_date ( '27/07/2017 11:15:00' , 'DD/MM/YYYY HH:MI:SS' ) AND key1 = 'cvn84bcx7xgp3' ; REPORT_ID ========== 42
获得REPORT_ID 后,您可以使用 PL/SQL 函数DBMS_AUTO_REPORT.REPORT_REPOSITORY_DETAIL生成 SQL Monitor 报告,如下所示。
SET回波ON SET trimspool ON SET TRIM ON SET页0 SET LINESIZE 32767 SET LONG 千万 SET longchunksize百万 卷轴old_sqlmon 。html 选择dbms_auto_report 。Report_repository_detail ( rid = > ; 42 , TYPE = > ; 'active' ) FROM dual ; 阀芯关闭
请记住编辑生成的 old_sqlmon.html 文件以删除文件中的第一行和最后一行(假脱机关闭)。然后可以在任何浏览器中查看生成的 HTML 文件。浏览器必须连接到 OTN 才能加载活动报告。
是否可以为给定时间段内监视的所有 SQL 语句生成 SQL Monitor 报告?
从 Oracle Database 12c 开始,您可以使用$ORACLE_HOME/rdbms/admin目录中的perfhubrpt.sql脚本来生成给定时间段内的 PerfHub,其中将包括在此期间所有受监控 SQL 语句的 SQL Monitor 报告时期。
该脚本将提示您输入报告级别(默认为典型,但我会全部使用)、数据库 ID(默认为您所在的数据库)、实例编号(默认为您所在的实例)以及您所在的时间段有兴趣。
perfhubrpt.sql的输出是一个 html 文件,它是指定时间段内 EM 性能中心的历史视图。
单击时间线图下方的受监控 SQL 选项卡将打开一个窗口,其中包含您请求期间受监控 SQL 语句的列表。
然后,您可以通过单击任何 SQL ID 来深入查看各个报告。