[20250707]使用tpt dashtop.sql查询遇到的问题.txt

来源:这里教程网 时间:2026-03-03 22:20:12 作者:

[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】,这样查询到的就是备库的信息。

相关推荐