In this demonstration, assume that I have a local table called "TARGET_DATA" with a list of Countries and Products. A new company is being acquired and that organisations's product list has been loaded into a table called TMP_DATA in a different database PDBTMP.
So, I run a MINUS query to find the local products that are not in the new company's product list -- but this query is run across a Database Link.
Here is how I create the Database Link, run the MINUS query and then obtain a tkprof of the trace file generated for the query.
SQL> create database link pdbtmp_data
2 connect to data_load identified by data_load using 'pdbtmp';
Database link created.
SQL>
SQL> alter session set tracefile_identifier='MY_DBLINK_QRY';
Session altered.
SQL> alter session set statistics_level='ALL';
Session altered.
SQL>
SQL> exec dbms_session.session_trace_enable(waits=>TRUE,binds=>FALSE);
PL/SQL procedure successfully completed.
SQL>
SQL> select * from target_data
2 minus
3 select * from tmp_data@pdbtmp_data
4 /
...
...
600 rows selected.
SQL> select 'x' from dual;
'
-
x
SQL> show array
arraysize 15
SQL>
SQL> quit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.12.0.0.0
oracle19c>
-- tkprof of the trace file
select * from target_data
minus
select * from tmp_data@pdbtmp_data
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.02 0.24 0 0 1 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 41 0.17 0.30 453 455 0 600
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 43 0.19 0.55 453 455 1 600
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 106
Number of plan statistics captured: 1
Rows (1st) Rows (avg) Rows (max) Row Source Operation
---------- ---------- ---------- ---------------------------------------------------
600 600 600 MINUS (cr=455 pr=453 pw=0 time=306868 us starts=1)
71682 71682 71682 SORT UNIQUE (cr=455 pr=453 pw=0 time=142899 us starts=1 cost=872 size=2876679 card=73761)
73761 73761 73761 TABLE ACCESS FULL TARGET_DATA (cr=455 pr=453 pw=0 time=80877 us starts=1 cost=130 size=2876679 card=73761)
71143 71143 71143 SORT UNIQUE (cr=0 pr=0 pw=0 time=148559 us starts=1 cost=831 size=2927240 card=73181)
73181 73181 73181 REMOTE TMP_DATA (cr=0 pr=0 pw=0 time=96385 us starts=1 cost=80 size=2927240 card=73181)
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
PGA memory operation 135 0.00 0.00
SQL*Net message to client 41 0.00 0.00
Disk file operations I/O 1 0.00 0.00
db file sequential read 1 0.00 0.00
db file scattered read 21 0.00 0.04
SQL*Net message to dblink 4 0.00 0.00
SQL*Net message from dblink 4 0.00 0.00
SQL*Net more data from dblink 352 0.01 0.05
SQL*Net message from client 41 8.84 8.89
********************************************************************************
SQL ID: 04vfkrajpkrnj Plan Hash: 1388734953
select 'x'
from
dual
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.00 0.00 0 0 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.00 0.00 0 0 0 1
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 106
Number of plan statistics captured: 1
Rows (1st) Rows (avg) Rows (max) Row Source Operation
---------- ---------- ---------- ---------------------------------------------------
1 1 1 FAST DUAL (cr=0 pr=0 pw=0 time=1 us starts=1 cost=2 size=0 card=1)
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
SQL*Net message to client 2 0.00 0.00
SQL*Net message from client 2 11.31 11.31
********************************************************************************
OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 2 0.02 0.24 0 0 1 0
Execute 3 0.01 0.01 0 676 0 1
Fetch 43 0.17 0.30 453 455 0 601
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 48 0.20 0.56 453 1131 1 602
Misses in library cache during parse: 2
Misses in library cache during execute: 1
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
PGA memory operation 137 0.00 0.00
SQL*Net message to client 44 0.00 0.00
SQL*Net message from client 44 16.85 37.06
db file sequential read 1 0.00 0.00
single-task message 1 0.02 0.02
SQL*Net message from dblink 15 0.05 0.15
SQL*Net message to dblink 14 0.00 0.00
Disk file operations I/O 1 0.00 0.00
db file scattered read 21 0.00 0.04
SQL*Net more data from dblink 352 0.01 0.05
The query returns 600 rows but with an ARRAYSIZE of 15 for the sqlplus session, it results in 40 round trips (SQL*Net message to/from client) (plus 1 additional for the parse) resulting a total of 41 SQL*Net messages.
SQL ID: bv2zwsyu4hq3k Plan Hash: 0
SELECT /*+ FULL(P) +*/ *
FROM
"TMP_DATA" P
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.04 0.05 4 101 0 0
Execute 0 0.00 0.00 0 0 0 0
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 1 0.04 0.05 4 101 0 0
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 109
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
SQL*Net message to client 2 0.00 0.00
SQL*Net message from client 2 0.14 0.14
********************************************************************************
SQL ID: 33v4pbtw6zjxt Plan Hash: 3633341221
SELECT "COUNTRY","PRODUCT_NAME"
FROM
"TMP_DATA" "TMP_DATA"
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 4 0.05 0.08 450 455 0 73181
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 6 0.05 0.08 450 455 0 73181
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 109
Number of plan statistics captured: 1
Rows (1st) Rows (avg) Rows (max) Row Source Operation
---------- ---------- ---------- ---------------------------------------------------
73181 73181 73181 TABLE ACCESS FULL TMP_DATA (cr=455 pr=450 pw=0 time=66315 us starts=1 cost=124 size=2927240 card=73181)
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
SQL*Net message to client 4 0.00 0.00
db file sequential read 1 0.00 0.00
db file scattered read 19 0.00 0.03
SQL*Net message from client 4 20.26 20.31
SQL*Net more data to client 352 0.00 0.00
********************************************************************************
OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ----------- ---------- ---------- ----------
Parse 2 0.04 0.05 4 101 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 4 0.05 0.08 450 455 0 73181
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 7 0.09 0.13 454 556 0 73181
Misses in library cache during parse: 2
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
PGA memory operation 1 0.00 0.00
log file sync 1 0.00 0.00
SQL*Net message to client 11 0.00 0.00
SQL*Net message from client 11 20.26 20.47
db file sequential read 1 0.00 0.00
db file scattered read 19 0.00 0.03
SQL*Net more data to client 352 0.00 0.00
Note how the "select * from tmp_data" portion passed to PDBTMP is rewritten as
SELECT /*+ FULL(P) +*/ * FROM "TMP_DATA" P - and then as SELECT "COUNTRY","PRODUCT_NAME" FROM "TMP_DATA" "TMP_DATA"
select decode(upper(failover_method), NULL, 0 , 'BASIC', 1, 'PRECONNECT', 2 , 'PREPARSE', 4 , 0), decode(upper(failover_type), NULL, 1, 'NONE', 1, 'SESSION', 2, 'SELECT', 4, 'TRANSACTION', 8, 'AUTO' , 32, 1 ), failover_retries, failover_delay, flags, nvl(replay_initiation_timeout, 900), decode(upper(session_state_consistency), 'STATIC', 16, 0), failover_restore from sys.service$ where name = :1 insert into link_logons$(logon_time , source_id) VALUES ( SYSTIMESTAMP AT TIME ZONE 'UTC', :srcid ) XCTEND rlbk=0, rd_only=0, tim=.... XCTEND rlbk=1, rd_only=1, tim=... XCTEND rlbk=0, rd_only=1, tim=...
So, a Database Link query has overheads. Also, when running a query (just a SELECT statement) requires the two databases to synchronise SCN. Whichever is the database with the lower SCN has to increment its SCN to the other database's (higher) SCN
SQL> select dbms_metadata.get_ddl('TRIGGER','DATA_LOAD_LOGON_TRIG') from dual;
DBMS_METADATA.GET_DDL('TRIGGER','DATA_LOAD_LOGON_TRIG')
--------------------------------------------------------------------------------
CREATE OR REPLACE NONEDITIONABLE TRIGGER "SYS"."DATA_LOAD_LOGON_TRIG"
after logon on database
WHEN (user = 'DATA_LOAD') begin
execute immediate 'alter session set tracefile_identifier=''DATA_LOAD''';
execute immediate 'alter session set statistics_level=''ALL''';
dbms_session.session_trace_enable(waits=>TRUE,binds=>FALSE);
end;
ALTER TRIGGER "SYS"."DATA_LOAD_LOGON_TRIG" ENABLE
Such a trigger is useful when you want to trace every logon by a particular user but don't know when the logon will occur.