Building on the example of an Index having been created on a Materialized View in my previous blog post in this series, I've captured some information from the AWR report in 19c when this code is executed :
(Note that "MV_OF_SOURCE" is not dependent on SOURCE_TABLE_1 and as really had no rows to refresh, did not cause any load).
Some information in the AWR Report (note that this is 19.3) :
Quite interesting that there are large number of operations that occur.
Unlike a Trace File, the AWR does not report SQL operations as a chronologically-ordered sequence. In this case, they are ordered by Elapsed Time per operation.
Also, remember that PL/SQL calls will include the time for "child" SQL calls, so you will encounter double-counting if you add up the figures (e.g. the "dbms_mview.refresh('MV_1');" call included a number of SQL calls --- technically you can identify them only if you *trace* the session making this PL/SQL call. However, since there was no other activity in this database, almost everything that happened appears in this AWR extract.
The actual calls "delete source_table_1;" and "insert into source_table_1 select object_id, owner, object_name from source_table_2;" were issued *before* the "exec dbms_mview.refresh('MV_1');" and are are not "child" calls. The child calls that do appear in the AWR are not necessarily in the same chronological order of their execution.
The interesting "child" calls from the "dbms_mview.refresh" call that I would like to point out are :
In my next post, I'll share some other findings after I found something interesting in the AWR report.
SQL> delete source_table_1; 72454 rows deleted. SQL> insert into source_table_1 select object_id, owner, object_name from source_table_2; 72366 rows created. SQL> commit; Commit complete. SQL> exec dbms_mview.refresh('MV_OF_SOURCE'); PL/SQL procedure successfully completed. SQL> SQL> exec dbms_mview.refresh('MV_1'); PL/SQL procedure successfully completed.
(Note that "MV_OF_SOURCE" is not dependent on SOURCE_TABLE_1 and as really had no rows to refresh, did not cause any load).
Some information in the AWR Report (note that this is 19.3) :
SQL ordered by Elapsed Time DB/Inst: ORCLCDB/ORCLCDB Snaps: 54-55 -> Resources reported for PL/SQL code includes the resources used by all SQL statements called by the code. -> % Total DB Time is the Elapsed Time of the SQL statement divided into the Total Database Time multiplied by 100 -> %Total - Elapsed Time as a percentage of Total DB time -> %CPU - CPU Time as a percentage of Elapsed Time -> %IO - User I/O Time as a percentage of Elapsed Time -> Captured SQL account for 108.1% of Total DB Time (s): 30 -> Captured PL/SQL account for 85.2% of Total DB Time (s): 30 Elapsed Elapsed Time Time (s) Executions per Exec (s) %Total %CPU %IO SQL Id ---------------- -------------- ------------- ------ ------ ------ ------------- 16.1 1 16.09 53.5 12.8 21.6 2uusn1kyhm9h8 Module: SQL*Plus PDB: ORCLPDB1 BEGIN dbms_mview.refresh('MV_1'); END; 8.7 1 8.66 28.8 5.3 13.6 8chh7ksnytb52 PDB: ORCLPDB1 delete from "HEMANT"."MLOG$_SOURCE_TABLE_1" where snaptime$$ <= :1 4.5 1 4.55 15.1 17.3 75.6 57ctmbtabx1rw Module: SQL*Plus PDB: ORCLPDB1 BEGIN dbms_mview.refresh('MV_OF_SOURCE'); END; 4.0 1 3.96 13.2 37.2 26.1 dsyxhpb9annru Module: SQL*Plus PDB: ORCLPDB1 delete source_table_1 3.7 144,820 0.00 12.3 36.7 8.3 9ucb4uxnvzxc8 Module: SQL*Plus PDB: ORCLPDB1 INSERT /*+ NO_DST_UPGRADE_INSERT_CONV IDX(0) */ INTO "HEMANT"."MLOG$_SOURCE_TABL E_1" (dmltype$$,old_new$$,snaptime$$,change_vector$$,xid$$,"OBJECT_ID") VALUES ( :d,:o,to_date('4000-01-01:00:00:00','YYYY-MM-DD:HH24:MI:SS'),:c,:x,:1) 3.5 1 3.52 11.7 19.7 45.9 dxnyhyq7sqf8j PDB: ORCLPDB1 DELETE FROM "HEMANT"."MV_1" SNAP$ WHERE "OBJ_ID" IN (SELECT * FROM (SELECT MLOG$ ."OBJECT_ID" "OBJ_ID" FROM "HEMANT"."MLOG$_SOURCE_TABLE_1" MLOG$ WHERE "SNAPTIME $$" > :1 AND ("DMLTYPE$$" != 'I')) AS OF SNAPSHOT(:B_SCN) ) 3.3 1 3.25 10.8 45.2 .6 9n1gw9vpj9248 Module: SQL*Plus PDB: ORCLPDB1 insert into source_table_1 select object_id, owner, object_name from source_tabl e_2 2.3 2 1.14 7.6 18.4 77.4 94z4z19ygx34a Module: SQL*Plus PDB: ORCLPDB1 begin sys.dbms_irefstats.run_sa(:1, :2, :3, :4, :5, :6); end; 2.1 1 2.11 7.0 19.1 21.6 a2sctn32qtwnf PDB: ORCLPDB1 /* MV_REFRESH (MRG) */ MERGE INTO "HEMANT"."MV_1" "SNA$" USING (SELECT * FROM (S ELECT CURRENT$."OBJ_ID",CURRENT$."OBJ_OWNER",CURRENT$."OBJ_NAME" FROM (SELECT "S OURCE_TABLE_1"."OBJECT_ID" "OBJ_ID","SOURCE_TABLE_1"."OWNER" "OBJ_OWNER","SOURCE _TABLE_1"."OBJECT_NAME" "OBJ_NAME" FROM "SOURCE_TABLE_1" "SOURCE_TABLE_1") CURRE 1.7 1 1.67 5.6 50.3 43.5 btqubgr940awu Module: sqlplus@oracle-19c-vagrant (TNS V1-V3) PDB: CDB$ROOT BEGIN dbms_workload_repository.create_snapshot(); END; 1.3 1 1.33 4.4 27.3 .0 ggaxdw7tpmqjb PDB: ORCLPDB1 update "HEMANT"."MLOG$_SOURCE_TABLE_1" set snaptime$$ = :1 where snaptime$$ > t o_date('2100-01-01:00:00:00','YYYY-MM-DD:HH24:MI:SS') 0.9 89 0.01 3.1 1.7 98.6 3un99a0zwp4vd PDB: ORCLPDB1 select owner#,name,namespace,remoteowner,linkname,p_timestamp,p_obj#, nvl(proper ty,0),subname,type#,flags,d_attrs from dependency$ d, obj$ o where d_obj#=:1 and p_obj#=obj#(+) order by order# 0.5 183 0.00 1.6 6.0 98.3 2sxqgx5hx76qr PDB: ORCLPDB1 select /*+ rule */ bucket, endpoint, col#, epvalue, epvalue_raw, ep_repeat_count , endpoint_enc from histgrm$ where obj#=:1 and intcol#=:2 and row#=:3 order by b ucket 0.5 2 0.23 1.5 15.0 70.0 6tbg6ydrx9jmm Module: SQL*Plus PDB: ORCLPDB1 begin dbms_irefstats.purge_stats_mv_rp(in_time => :1, in_objnum => :2, in_r etention_period => :3); end; 0.4 9 0.04 1.3 15.4 69.2 g1s379sraujaq Module: SQL*Plus PDB: ORCLPDB1 DELETE FROM SYS.MVREF$_STMT_STATS WHERE REFRESH_ID = :B2 AND MV_OBJ# = :B1 0.4 2 0.20 1.3 16.4 76.8 8szmwam7fysa3 Module: SQL*Plus PDB: ORCLPDB1 insert into wri$_adv_objspace_trend_data select timepoint, space_usage, space_a lloc, quality from table(dbms_space.object_growth_trend(:1, :2, :3, :4, NULL, N ULL, NULL, 'FALSE', :5, 'FALSE')) 0.4 59 0.01 1.3 9.5 97.3 03guhbfpak0w7 PDB: CDB$ROOT select /*+ index(idl_ub1$ i_idl_ub11) */ piece#,length,piece from idl_ub1$ where obj#=:1 and part=:2 and version=:3 order by piece# 0.3 2 0.15 1.0 11.0 .0 a8xypykqc348c PDB: ORCLPDB1 BEGIN dbms_stats_internal.advisor_setup_obj_filter(:tid, :rid, 'EXECUTE', FAL SE); END; 0.3 2 0.15 1.0 8.7 .0 avf5k3k0x0cxn PDB: ORCLPDB1 insert into stats_advisor_filter_obj$ (rule_id, obj#, flag s, type) select :rule_id, obj#, :flag_include, :type_expanded from stats_advisor_filter_obj$ where type = :type_priv and (bitand(flags, :flag_orcl_owned) = 0 or :get_orcl_objects = 'T')
Quite interesting that there are large number of operations that occur.
Unlike a Trace File, the AWR does not report SQL operations as a chronologically-ordered sequence. In this case, they are ordered by Elapsed Time per operation.
Also, remember that PL/SQL calls will include the time for "child" SQL calls, so you will encounter double-counting if you add up the figures (e.g. the "dbms_mview.refresh('MV_1');" call included a number of SQL calls --- technically you can identify them only if you *trace* the session making this PL/SQL call. However, since there was no other activity in this database, almost everything that happened appears in this AWR extract.
The actual calls "delete source_table_1;" and "insert into source_table_1 select object_id, owner, object_name from source_table_2;" were issued *before* the "exec dbms_mview.refresh('MV_1');" and are are not "child" calls. The child calls that do appear in the AWR are not necessarily in the same chronological order of their execution.
The interesting "child" calls from the "dbms_mview.refresh" call that I would like to point out are :
delete from "HEMANT"."MLOG$_SOURCE_TABLE_1" where snaptime$$ <= :1
INSERT /*+ NO_DST_UPGRADE_INSERT_CONV IDX(0) */ INTO "HEMANT"."MLOG$_SOURCE_TABL E_1" (dmltype$$,old_new$$,snaptime$$,change_vector$$,xid$$,"OBJECT_ID") VALUES ( :d,:o,to_date('4000-01-01:00:00:00','YYYY-MM-DD:HH24:MI:SS'),:c,:x,:1)
DELETE FROM "HEMANT"."MV_1" SNAP$ WHERE "OBJ_ID" IN (SELECT * FROM (SELECT MLOG$ ."OBJECT_ID" "OBJ_ID" FROM "HEMANT"."MLOG$_SOURCE_TABLE_1" MLOG$ WHERE "SNAPTIME $$" > :1 AND ("DMLTYPE$$" != 'I')) AS OF SNAPSHOT(:B_SCN) )
/* MV_REFRESH (MRG) */ MERGE INTO "HEMANT"."MV_1" "SNA$" USING (SELECT * FROM (S ELECT CURRENT$."OBJ_ID",CURRENT$."OBJ_OWNER",CURRENT$."OBJ_NAME" FROM (SELECT "S OURCE_TABLE_1"."OBJECT_ID" "OBJ_ID","SOURCE_TABLE_1"."OWNER" "OBJ_OWNER","SOURCE _TABLE_1"."OBJECT_NAME" "OBJ_NAME" FROM "SOURCE_TABLE_1" "SOURCE_TABLE_1") CURRE
In my next post, I'll share some other findings after I found something interesting in the AWR report.
No comments:
Post a Comment