ITPub博客

首页 > 数据库 > Oracle > [20250707]使用tpt dashtop.sql查询遇到的问题.txt

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

原创 Oracle 作者:lfree 时间:2025-07-13 19:54:24 0 删除 编辑

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

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-3090958/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969192