[20250707]使用tpt dashtop.sql查询遇到的问题.txt --//前几天帮别人优化数据库遇到的问题,实际上关于pdb还是cdb建立awr的问题,做一个记录,通过例子说明问题。 1.环境: SCOTT@book01p> @ ver2 ============================== PORT_STRING : x86_64/Linux 2.4.xx VERSION : 21.0.0.0.0 BANNER : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production BANNER_FULL : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production Version 21.3.0.0.0 BANNER_LEGACY : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production CON_ID : 0 PL/SQL procedure successfully completed. SYS@book> select inst_id, con_id, dbid, con_uid, guid, name,dict_flags from x$con; INST_ID CON_ID DBID CON_UID GUID NAME DICT_FLAGS ---------- ---------- ---------- ---------- -------------------------------- ------------------------------ ---------- 1 1 1617337831 1 C8209F27C6B16005E053362EE80AE60E CDB$ROOT 0 1 2 2763294012 2763294012 1F36DBBBA2C8169BE0636538A8C04D12 PDB$SEED 3221487616 1 3 1073777561 1073777561 1F36F47256D41C08E0636538A8C03260 BOOK01P 1074003968 2.建立问题语句例子: SYS@book01p> @ cr_s exec dbms_workload_repository.create_snapshot(); PL/SQL procedure successfully completed. --//在pdb=book01下收集awr信息。 --//产生一条问题sql语句: SCOTT@book01p> select count(*) from emp,emp,emp,emp,emp,emp,emp,depT; COUNT(*) ---------- 421654016 SCOTT@book01p> @ hash HASH_VALUE SQL_ID CHILD_NUMBER KGL_BUCKET PLAN_HASH_VALUE HASH_HEX SQL_EXEC_START SQL_EXEC_ID ---------- ------------- ------------ ---------- --------------- ---------- ------------------- ----------- 177759897 ggtn3ns59htnt 0 26265 776537916 a986699 2025-07-07 16:20:42 16777216 SYS@book> @ ashtop sql_id sql_id='ggtn3ns59htnt' &day Total Distinct Distinct Distinct Seconds AAS %This SQL_ID FIRST_SEEN LAST_SEEN Execs Seen Tstamps Execs Seen1 --------- ------- ------- ------------- ------------------- ------------------- ---------- -------- ----------- 19 .0 100% | ggtn3ns59htnt 2025-07-07 16:20:43 2025-07-07 16:21:01 1 19 1 --//使用tpt的ashtop.sql脚本可以查询到相关语句。 --//简单说明,对方系统存在大量不良sql语句,而且没有使用绑定变量,我想先建立保存相关信息在数据库,便于事后分析。 3.产生问题: SYS@book01p> @ cr_s exec dbms_workload_repository.create_snapshot(); PL/SQL procedure successfully completed. --//在pdb=book01下收集awr信息。 SYS@book> @ dashtop sql_id sql_id='ggtn3ns59htnt' &day no rows selected --//居然查询不到,实际上主要原因在于对方执行dbms_workload_repository.create_snapshot();在pdb下。 --//并没有在cdb下建立awr报表,导致使用dashtop查询不到相关信息。 SYS@book> select SNAP_ID,DBID,INSTANCE_NUMBER,BEGIN_INTERVAL_TIME,con_id from dba_hist_snapshot where begin_interval_time between trunc(sysdate) and sysdate order by 4; SNAP_ID DBID INSTANCE_NUMBER BEGIN_INTERVAL_TIME CON_ID ---------- ---------- --------------- ----------------------- ---------- 888 1617337831 1 2025-07-07 08:52:08.000 0 889 1617337831 1 2025-07-07 09:03:14.974 0 890 1617337831 1 2025-07-07 16:15:48.000 0 SYS@book01p> select SNAP_ID,DBID,INSTANCE_NUMBER,BEGIN_INTERVAL_TIME,con_id from dba_hist_snapshot where begin_interval_time between trunc(sysdate) and sysdate order by 4; SNAP_ID DBID INSTANCE_NUMBER BEGIN_INTERVAL_TIME CON_ID ---------- ---------- --------------- ----------------------- ---------- 888 1617337831 1 2025-07-07 08:52:08.000 0 889 1617337831 1 2025-07-07 09:03:14.974 0 890 1617337831 1 2025-07-07 16:15:48.000 0 7 1073777561 1 2025-07-07 16:15:48.000 3 8 1073777561 1 2025-07-07 16:21:23.982 3 --//pdb下视图可以看到con_id=0的snap_id --//使用tpt的dashtop.sql在cdb下查询自然查询不到相关信息。当我切换pdb下查询时: SYS@book01p> @ dashtop sql_id sql_id='ggtn3ns59htnt' &day no rows selected --//居然查询不到!!当我检查dashtop.sql脚本发现查询条件如下: WHERE a.user_id = u.user_id (+) AND a.current_obj# = o.object_id(+) AND &2 AND a.sample_time BETWEEN &3 AND &4 --AND a.dbid = (SELECT d.dbid FROM v$database d) -- for partition pruning --AND a.snap_id IN (SELECT sn.snap_id FROM dba_hist_snapshot sn WHERE sn.begin_interval_time >= &3 AND sn.end_interval_time <= &4) -- for partition pruning --AND snap_id IN (SELECT snap_id FROM dba_hist_snapshot WHERE sample_time BETWEEN &3 AND &4) -- for partition pruning ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ AND (a.dbid, a.snap_id) IN (SELECT d.dbid, sn.snap_id FROM v$database d, dba_hist_snapshot sn WHERE d.dbid = sn.dbid AND sn.begin_interval_time >= &3 AND sn.end_interval_time <= &4) -- for partition pruning --//发现作者的一个小错误,以前没注意,原始脚本作者使用下划线的查询条件,视图dba_hist_snapshot没有sample_time字段,实际上 --//作者相当于写成: AND snap_id IN (SELECT snap_id FROM dba_hist_snapshot ) --//没有利用partition pruning减少查询量。而我使用的条件是 AND (a.dbid, a.snap_id) IN (SELECT d.dbid, sn.snap_id FROM v$database d, dba_hist_snapshot sn WHERE d.dbid = sn.dbid AND sn.begin_interval_time >= &3 AND sn.end_interval_time <= &4) -- for partition pruning SYS@book01p> select dbid,con_dbid from v$database; DBID CON_DBID ---------- ---------- 1617337831 1073777561 --//pdb下dbid=1617337831不变,但是dba_hist_snapshot记录的dbid=1073777561(相当于con_dbid值)。 --//相当于查询dbid=1617337831,不会查询使用dbid=1073777561的信息。 --//注解以上查询条件: SYS@book01p> @ dashtop sql_id sql_id='ggtn3ns59htnt' &day Total Distinct Distinct Distinct Seconds AAS %This SQL_ID FIRST_SEEN LAST_SEEN Execs Seen Tstamps Execs Seen1 --------- ------- ------- ------------- ------------------- ------------------- ---------- -------- ----------- 20 .0 100% ggtn3ns59htnt 2025-07-07 16:20:51 2025-07-07 16:21:01 1 2 1 --//ok,可以查询到相关信息。 --//在等整点cdb运行awr信息收集后再次查询: SYS@book01p> @ dashtop sql_id sql_id='ggtn3ns59htnt' &day Total Distinct Distinct Distinct Seconds AAS %This SQL_ID FIRST_SEEN LAST_SEEN Execs Seen Tstamps Execs Seen1 --------- ------- ------- ------------- ------------------- ------------------- ---------- -------- ----------- 40 .0 100% ggtn3ns59htnt 2025-07-07 16:20:51 2025-07-07 16:21:01 1 2 1 --//记录时间翻倍,因为cdb上到了整点启动awr信息收集。 --//取消注解: SYS@book01p> @ dashtop sql_id,con_id sql_id='ggtn3ns59htnt' &day Total Distinct Distinct Distinct Seconds AAS %This SQL_ID CON_ID FIRST_SEEN LAST_SEEN Execs Seen Tstamps Execs Seen1 --------- ------- ------- ------------- ---------- ------------------- ------------------- ---------- -------- ----------- 20 .0 100% ggtn3ns59htnt 3 2025-07-07 16:20:51 2025-07-07 16:21:01 1 2 1 --//这时查询使用的是snap_id=890,891的信息。 SYS@book01p> select SNAP_ID,DBID,INSTANCE_NUMBER,BEGIN_INTERVAL_TIME,end_interval_time,con_id from dba_hist_snapshot where begin_interval_time between trunc(sysdate) and sysdate order by 5; SNAP_ID DBID INSTANCE_NUMBER BEGIN_INTERVAL_TIME END_INTERVAL_TIME CON_ID ---------- ---------- --------------- ----------------------- ----------------------- ---------- 888 1617337831 1 2025-07-07 08:52:08.000 2025-07-07 09:03:14.974 0 889 1617337831 1 2025-07-07 09:03:14.974 2025-07-07 09:40:47.990 0 890 1617337831 1 2025-07-07 16:15:48.000 2025-07-07 16:19:09.396 0 7 1073777561 1 2025-07-07 16:15:48.000 2025-07-07 16:21:23.982 3 8 1073777561 1 2025-07-07 16:21:23.982 2025-07-07 16:35:59.422 3 891 1617337831 1 2025-07-07 16:19:09.396 2025-07-07 16:58:01.023 0 6 rows selected. 4.小结: --//总之:以后优化注意这个问题,另外dashtop还存在一个小问题,作者使用dba_users u,dba_objects,这些视图无法查询pdb下的用 --//户以及对象。 FROM dba_hist_active_sess_history a) a , dba_users u , (SELECT object_id,data_object_id,owner,object_name,subobject_name,object_type , owner||'.'||object_name obj , owner||'.'||object_name||' ['||object_type||']' objt FROM dba_objects) o --//查看tpt相关网站的更新,实际上作者已经发现这个问题,建立一个cashtop.sql脚本,里面使用就是cdb_users ,cdb_objects视图。 --//只是d系列的脚本没有写罢了。 SYS@book> @ dashtop sql_id,objt,username sql_id='ggtn3ns59htnt' &day Total Distinct Distinct Distinct Seconds AAS %This SQL_ID OBJT USERNAME FIRST_SEEN LAST_SEEN Execs Seen Tstamps Execs Seen1 --------- ------- ------- ------------- --------------------- -------------------- ------------------- ------------------- ---------- -------- ----------- 20 .0 100% ggtn3ns59htnt 2025-07-07 16:20:51 2025-07-07 16:21:01 1 2 1 --//在cdb下查询objt,username为null。 SYS@book01p> @ dashtop sql_id,objt,username sql_id='ggtn3ns59htnt' &day Total Distinct Distinct Distinct Seconds AAS %This SQL_ID OBJT USERNAME FIRST_SEEN LAST_SEEN Execs Seen Tstamps Execs Seen1 --------- ------- ------- ------------- -------------------- -------------------- ------------------- ------------------- ---------- -------- ----------- 20 .0 100% ggtn3ns59htnt SCOTT.PK_EMP [INDEX] SCOTT 2025-07-07 16:20:51 2025-07-07 16:21:01 1 2 1 --//顺手写一个dcashtop.sql脚本,很容易实现。 $ cp dashtop.sql dcashtop.sql --//然后修改dba_users->cdb_ussers,dba_objects->cdb_objects. SYS@book> @ ash/dcashtop sql_id,objt sql_id='ggtn3ns59htnt' &day Total Distinct Distinct Distinct Seconds AAS %This SQL_ID OBJT FIRST_SEEN LAST_SEEN Execs Seen Tstamps Execs Seen1 --------- ------- ------- ------------- --------------------- ------------------- ------------------- ---------- -------- ----------- 20 .0 100% ggtn3ns59htnt SCOTT.PK_EMP [INDEX] 2025-07-07 16:20:51 2025-07-07 16:21:01 1 2 1 --//另外就是在解决问题时遇到使用工具出问题,还是比较影响工作的心情。 --//顺便提一个小问题,必须引起注意,如果收集dg数据库的awr,使用dashtop.sql仅仅查询到主库的awr信息。 --//要想获得备库的awr信息,关于建立备考的awr参考:[20230220][20230110]生成相关备库的awr报表.txt --//其收集awr信息保存在数据库不是原来的dbid,而是使用 select * from dba_umf_registration;视图查询到备库的NODE_ID。 --//这样dashtop.sql要适当修改,注解以上该行,不然仅仅查询到主库的awr信息。 --//如果不加过滤条件db_id=<备库_node_id>【参数3】,这样查询到的就是主库与备库的信息,主备库混在一起,要引起注意。 --//如果加过滤条件db_id=<备库_node_id>【参数3】,这样查询到的就是备库的信息。
[20250707]使用tpt dashtop.sql查询遇到的问题.txt
来源:这里教程网
时间:2026-03-03 22:20:12
作者:
编辑推荐:
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 第44期 使用什么命令能删除 FOREIGN ARCHIVED LOG
第44期 使用什么命令能删除 FOREIGN ARCHIVED LOG
26-03-03 - 比格比萨,怎么成了披萨界的“穷鬼自助”顶流?
比格比萨,怎么成了披萨界的“穷鬼自助”顶流?
26-03-03 - 保险业加速向外资开放,险企入华前景几何?
保险业加速向外资开放,险企入华前景几何?
26-03-03 - YU7不便宜,为什么还让人觉得“赚到了”?
YU7不便宜,为什么还让人觉得“赚到了”?
26-03-03 - Oracle连接问题排查实录:TNSPING跟踪在定位故障中的实战应用
Oracle连接问题排查实录:TNSPING跟踪在定位故障中的实战应用
26-03-03 - oracle 23ai通过接口访问deepseek模型
oracle 23ai通过接口访问deepseek模型
26-03-03 - 一招解锁:快速解决Oracle ORA-38029错误
一招解锁:快速解决Oracle ORA-38029错误
26-03-03 - 雨花用诚意写下“背包客创业指南”!
雨花用诚意写下“背包客创业指南”!
26-03-03 - 谁在为三块钱的冰杯买单?
谁在为三块钱的冰杯买单?
26-03-03 - Oracle LibCache等待优化(一)
Oracle LibCache等待优化(一)
26-03-03
