小知识:SQL Monitor Report的使用

知识,sql,monitor,report,使用 · 浏览次数 : 222

小编点评

**使用 SQL Monitor Report 观察 SQL 执行计划的差异** **步骤 1:准备通用的 sqlmon.sql脚本** ```sql -- 设置页面大小 set pagesize 0 -- 设置输出格式 echo off -- 设置计时器 timing off -- 设置行大小 lineize 1000 -- 设置自动分页 trimpool on trim on long 2000000 longchunksize 2000000 feedback offspool sql_monitor_&sql_id\\.htmselect dbms_sqltune.report_sql_monitor(type=>'ACTIVE', sql_id=>'&sql_id', report_level=>'ALL') monitor_report from dual; -- 启动 SQL Monitor Report spool off2; -- 执行 SQL1 和 SQL2 -- 您可以使用以下方式获取 SQL_ID: -- --SQL1:select /*+ monitor */ count(*) from Lsql_id: ahtu40vr8dbhu -- --SQL2:select /*+ monitor no_inmemory */ count(*) from Lsql_id: 7rzcsju067wr0 -- 将 SQL_ID 值传递给 sqlmon_report 脚本 call sqlmon_report @sqlmonEnter value for sql_id: ahtu40vr8dbhu call sqlmon_report @sqlmonEnter value for sql_id: ahtu40vr8dbhu call sqlmon_report @sqlmonEnter value for sql_id: 7rzcsju067wr0 ``` **步骤 2:执行 SQL1 和 SQL2** ```sql -- 执行 SQL1 -- 这条 SQL 应该使用 In-Memory 模式 select /*+ monitor */ count(*) from Lsql_id: ahtu40vr8dbhu -- 执行 SQL2 select /*+ monitor no_inmemory */ count(*) from Lsql_id: 7rzcsju067wr0 ``` **步骤 3:调用 sqlmon_report 生成 SQL Monitor Report** ```sql -- 生成 SQL1 的 SQL Monitor Report SQL> @sqlmonEnter value for sql_id: ahtu40vr8dbhu -- 生成 SQL2 的 SQL Monitor Report SQL> @sqlmonEnter value for sql_id: ahtu40vr8dbhu -- 生成 SQL2 的 SQL Monitor Report SQL> @sqlmonEnter value for sql_id: 7rzcsju067wr0 -- 比较两个 SQL Monitor Report -- 注意:您可以根据需要修改 SQL 中的 `sql_id` 来比较其他 SQL ``` **比较两个 SQL Monitor Report 的差异** 可以观察 SQL Monitor Report 中的以下差异: * **执行时间**:SQL2 的 SQL Monitor Report 通常显示的执行时间更短,因为它使用 `no_inmemory` 模式。 * **IO资源**:SQL2 的 SQL Monitor Report 可以显示详细的 IO 资源消耗,例如读写次数、字节大小等。 * **执行计划**:SQL2 的 SQL Monitor Report 可以显示详细的执行计划,包括每个阶段的执行时间和 SQL 语句。

正文

在上一篇 优化利器In-Memory开启和效果
中,提到的两个SQL对比,使用的是传统的dbms_xplan.display_cursor方式来查看执行计划,好处是文本输出的通用性强,基本信息也都有。
但如果大家参加过我们的RWP培训,就会发现O原厂强烈推荐大家使用的一个工具是 SQL Monitor Report,且要使用ACTIVE的类型,这可以让看SQL执行计划变得赏心悦目。

本文就简单介绍下,如何使用 SQL Monitor Report,也以之前的例子,来更直观的看到二者执行计划的差异:

1.准备通用的sqlmon.sql脚本

为了更具通用性,这里以SQL_ID为输入条件:

vi sqlmon.sql

set pagesize 0 echo off timing off linesize 1000 trimspool on trim on long 2000000 longchunksize 2000000 feedback off
spool sql_monitor_&sql_id\.htm
select dbms_sqltune.report_sql_monitor(type=>'ACTIVE', sql_id=>'&sql_id', report_level=>'ALL') monitor_report from dual;
spool off

2.执行两条SQL,并确认各自的sql_id

这次使用更明确的hints来区分是否使用In-Memory和确保都可以生成SQL Monitor Report:

--SQL1:
select /*+ monitor */ count(*) from L

sql_id: ahtu40vr8dbhu

--SQL2:
select /*+ monitor no_inmemory */ count(*) from L

sql_id: 7rzcsju067wr0

获取sql_id有多种方式,其实最方便的就是也可以通过传统看执行计划的方式来获取。

3.调用sqlmon脚本生成SQL Monitor Report

SQL> @sqlmon
Enter value for sql_id: ahtu40vr8dbhu
Enter value for sql_id: ahtu40vr8dbhu

SQL> @sqlmon
Enter value for sql_id: 7rzcsju067wr0
Enter value for sql_id: 7rzcsju067wr0

4.对比两个SQL Monitor Report

SQL1的SQL Monitor Report:

SQL2的SQL Monitor Report:

除了之前执行时就体验的执行时间差异,其对IO资源的实际消耗也可以非常直观的看到,二者有很大的差异。

与小知识:SQL Monitor Report的使用相似的内容:

小知识:SQL Monitor Report的使用

在上一篇 优化利器In-Memory开启和效果 中,提到的两个SQL对比,使用的是传统的dbms_xplan.display_cursor方式来查看执行计划,好处是文本输出的通用性强,基本信息也都有。 但如果大家参加过我们的RWP培训,就会发现O原厂强烈推荐大家使用的一个工具是 SQL Monito

小知识:IN和EXISTS的用法及效率验证

环境: Oracle 19.16 多租户架构 经常会在网上看到有人写exists和in的效率区别,其实在新版本的数据库中,是不存在这个问题的,优化器会自己判断选择最优的执行计划。 为了直观的说明,我在PDB中构造如下测试用例: vi 1.sql select count(*) from v$acti

SQL Thinking

s2下半年我在内部有一次部门级别的技术分享会,以本文内容分享为主。 其实有很多人问过我相同的问题,遇到需要改写的慢sql,不知道怎么改,改好了以后也不知道等不等价?不等价了也不知道错在哪?这个要怎么破? 其实都是因为绝大多数人没有做过开发,看不懂sql,不会写sql,没有sql思维,下面通过几个案例

小知识:什么叫做workaround?

技术人当遇到具体问题,能给出的各种解决方案,有一种类型叫做workaround,翻译过来通常为“应变方法”、“变通方法”; 其实这种方式通常是没有找到根本的解决方案,但是为了快速恢复业务而采用的一种巧妙规避/跳过的方式。 举个具体的例子:我有测试需求要在主库创建一个新的PDB: 1.创建新的PDB

小知识:使用errorstack定位特定问题

有客户遇到ORA-2289的报错,同事协助去现场排查,我帮着远程共同check下。 客户只是应用端报出的错误,为了进一步定位,服务端需要开errorstack协助定位具体问题。 下面就以这个ORA-2289为例,示范下errorstack的使用方法。 --开启errorstack alter sys

小知识:使用oracle用户查看RAC集群资源状态

正常情况按照标准配置的环境变量,只能grid用户查看RAC集群资源状态。 crsctl stat res -t 但是绝大部分操作其实都是oracle用户来操作,比如启停数据库,操作完成以后就需要检查下集群资源状态。 看到好多DBA在现场操作时就是来回各种切换或开多个窗口。 其实有两个简单的解决方法可

小知识:设置archive_lag_target参数强制日志切换

为客户测试一个ADG场景问题,发现测试环境的日志切换频率过低,总是需要定期手工切换,这非常影响测试心情。 实际上,可以设置archive_lag_target参数强制日志切换。 比如设置: alter system set archive_lag_target=1800; 这样即使库没任何压力,半小

小知识:grep过滤以#号开头的注释行 和 空行

xtts的配置文件,有很多注释不想直接去掉的情况下,想清楚的看到目前设置了哪些参数,可以用grep过滤查看: `grep -vE '^#|^$' xtt.properties` 效果如下: ```shell [oracle@db11gcas xtt]$ grep -vE '^#|^$' xtt.pr

小知识:开启NTP服务并设置为开机启动

我的一套测试环境发现时间慢了10分钟,影响我做各类测试。 首先就想到NTP服务,发现已安装NTP安装包,也有默认的NTP配置文件,只是没有启用。 用到的相关命令参考如下: ```shell [root@bogon ~]# vi /etc/ntp.conf systemctl status ntpd

小知识:PPT的幻灯片放映设置

最近给某客户讲课时,碰到了幻灯片自动翻页的情况,发现是因为之前做过粗略的计时演练,有些片子就快速过了。 **问题现象:** 结果导致放映时也出现了某些片子快速被自动翻页。 **解决方案:** 设置成手动推进幻灯片的方式即可解决,具体如下图所示: ![](https://img2023.cnblogs