You are on page 1of 121

Crucle SQL

Performunce:
vrltlng SQL Rlght
karen MorLon
Sr. 1echnlcal ConsulLanL

kurenmorton.blogsot.com
kuren_morton
kuren.mortonQenkltec.com
"1hlnk outslde the box"
clich magic
1he cllche ls overused.

lt lmlles there's somethlng
muglcul ubout creutlvlty.

8ut creutlvlty ls u sklll thut
cun be develoed.


Llvergent

Convergent

Llvergent

Cenerute
lmuglne
Lxerlment
8rulnstorm
Lefer judgment
Lvuluute
Crgunlze
Select
locus
Refne

Convergent

Llvergent

Convergent
Seurute these urouches.
vhen you're dlverglng, focus only on dlverglng.
Cnce you've exlored u wlde runge of ldeus, then you cun converge.
vhy ls lt so
hurd
to thlnk
outslde the box?
htt:jjwww.ted.comjseukersjslr_ken_roblnson.html
Now thut l've
got you thlnklng.
llrst
thlngs
frst
(1hls ls !"#$$% lmortunt)
Revlew the stutement.

vhut ls lt
suosed
to do?

1une the questlon,
not the query.
!"# %&'(

1hlngs
1o lee
ln Mlnd
1est eectlvely.
Nume your SQL
SELECT /* kmtest */
FROM tab
j* guther_lun_stutlstlcs *j
(~= stutlstlcs_level = ALL)
dbms_xlun.dlsluy_cursor
('ALLS1A1S LAS1')
Collect & Revlew Plun Stutlstlcs
dbms_sqltune.reort_sql_monltor
j* monltor *j
Collect & Revlew Plun Stutlstlcs
lnow your dutu.
(und your schemu)
vlsuullze
(vlsuul SQL 1unlng)
Lmburcudero L8 Ctlmlzer
vutch for
common mlstukes.
"Columnless"
jolned tubles
SELECT b.*
FROM a, b
WHERE a.col1 = b.col1
AND b.col2 = <condition>
SELECT b.*
FROM b
WHERE b.col2 = <condition>
AND EXISTS (SELECT null
FROM a WHERE a.col1 = b.col1)
1hls
8ecomes
lmroer
outer jolns
AND tab1.col1 = tab2.col1 (+)
AND tab2.col2 = <condition>
AND tab1.col1 = tab2.col1
AND tab2.col2 = <condition>
1hls
8ecomes
8ecuuse the condltlon would be null for the outer jolned row,
so the redlcute could never be true.
Reeuted use
of sume tubles
und redlcutes
SELECT rite.event_name, count(*)
FROM riffs.rf_order ro, riffs.rf_order_item roi,
riffs.rf_item_transaction rit,
riffs.rf_item_transaction_event rite
WHERE ro.is_test = '0'
AND ro.order_id = roi.order_id
AND roi.order_item_id = rit.order_item_id
AND roi.order_id = rit.order_id
AND rit.transaction_id = rite.transaction_id
AND (rite.event_name >'AUTHORIZED' OR rite.event_name <'AUTHORIZED')
GROUP BY rite.event_name
UNION ALL
SELECT 'TRANSACTION_INITIATED', count(*)
FROM
(SELECT count(*)
FROM riffs.rf_order ro, riffs.rf_order_item roi,
riffs.rf_item_transaction rit,
riffs.rf_item_transaction_event rite
WHERE ro.is_test = '0'
AND ro.order_id = roi.order_id
AND roi.order_item_id = rit.order_item_id
AND roi.order_id = rit.order_id
AND rit.transaction_id = rite.transaction_id
AND rite.event_name = 'AUTHORIZED'
GROUP BY substr(rit.TRANSACTION_ID,1,INSTR(rit.TRANSACTION_ID,'_')-1))
Check vlublllty
of lndexes
Look for
LlS1lNC1jUNlCN
to remove dullcutes.
verlfy uctuul
curdlnullty
SELECT <column list>
FROM TR_CLUP
WHERE CUST_SYS_ID = 6419
AND LOC_SYS_ID = 37837
AND UW_SYS_ID = 72
AND PROP_STATE_CD= 'AL'
AND ROWNUM <= 1000
ORDER BY UW_SYS_ID, PROP_STATE_CD, CUST_LOC_NBR;
SELECT count(*)
FROM TR_CLUP
WHERE CUST_SYS_ID = 6419
AND LOC_SYS_ID = 37837
AND UW_SYS_ID = 72
AND PROP_STATE_CD= 'AL'
AND ROWNUM <= 1000
;
SQL Antlutterns
Leurnlng whut to do
by leurnlng whut
)"' to do
P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N










P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N










P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N










P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N

PERFORM
ANCE ANTIPATTERN PERFORM
ANCE ANTIPATTERN PERFORM
ANCE ANTIPATTERN PERFORM
ANCE ANTIPATTERN
Llvlde
&
Conquer
MlnjMux Ctlmlzutlon

SQL> select /* km_min */ min(department_id) from employees ;

MIN(DEPARTMENT_ID)
------------------
10


SQL_ID 3xfdnnga1pcdf, child number 0
-------------------------------------
Plan hash value: 613773769

-------------------------------------------------------------------------------
| Id |Operation |Name |Starts |A-Rows |Buffers |
-------------------------------------------------------------------------------
| 0 |SELECT STATEMENT | | 1 | 1 | 1 |
| 1 | SORT AGGREGATE | | 1 | 1 | 1 |
| 2 | INDEX FULL SCAN (MIN/MAX)|EMP_DEPARTMENT_IX | 1 | 1 | 1 |
-------------------------------------------------------------------------------

SQL> select /* km_min_max */ min(department_id),
max(department_id) from employees ;

MIN(DEPARTMENT_ID) MAX(DEPARTMENT_ID)
------------------ ------------------
10 110



SQL_ID 18883amg21pnp, child number 0
-------------------------------------
Plan hash value: 1756381138

-----------------------------------------------------------------------------------
|Id | Operation |Name |Starts |E-Rows |A-Rows | A-Time |Buffers |
-----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 7 |
| 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.01 | 7 |
| 2 | TABLE ACCESS FULL|EMPLOYEES | 1 | 107 | 107 |00:00:00.01 | 7 |
-----------------------------------------------------------------------------------
SQL> select /* km_split */
2 (select min(department_id) from employees) min_id,
3 (select max(department_id) from employees) max_id
4 from dual ;

MIN_ID MAX_ID
--------------- ---------------
10 110


SQL_ID ad2bpg2z204b5, child number 0
-------------------------------------
Plan hash value: 2189307159

------------------------------------------------------------------------------
|Id | Operation |Name |Starts |A-Rows |Buffers |
------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 1 | 0 |
| 1 | SORT AGGREGATE | | 1 | 1 | 1 |
| 2 | INDEX FULL SCAN (MIN/MAX)|EMP_DEPARTMENT_IX | 1 | 1 | 1 |
| 3 | SORT AGGREGATE | | 1 | 1 | 1 |
| 4 | INDEX FULL SCAN (MIN/MAX)|EMP_DEPARTMENT_IX | 1 | 1 | 1 |
| 5 | FAST DUAL | | 1 | 1 | 0 |
------------------------------------------------------------------------------
All or None
z
SELECT /* korig */ cd.cust_sys_id, cd.clup_sys_id
FROM td_clup_detail_mv cd
JOIN td_row_level_security_mv rl
ON cd.clup_sys_id = rl.clup_sys_id
JOIN td_individual_mv i
ON rl.user_sys_id = i.indiv_sys_id
WHERE doc_type_cd IN ('AGENCY', 'FNAS-LNR')
AND agent_stat_cd = 'ACTIVE'
AND i.user_login_id = 'Reporting'


SQL_ID bjasak8wj3q9v, child number 0
-------------------------------------
Plan hash value: 1846763385

-------------------------------------------------------------------------
| Id | Operation |A-Rows | A-Time |Buffers |
-------------------------------------------------------------------------
|* 1 | HASH JOIN | 20908 |00:00:23.46 | 55968 |
| 2 | MAT_VIEW ACCESS BY INDEX ROWID | 118K|00:00:22.45 | 53856 |
| 3 | NESTED LOOPS | 118K|00:00:00.24 | 136 |
| 4 | MAT_VIEW ACCESS BY INDEX ROWID| 1 |00:00:00.01 | 3 |
|* 5 | INDEX RANGE SCAN | 1 |00:00:00.01 | 2 |
|* 6 | INDEX RANGE SCAN | 118K|00:00:00.17 | 133 |
|* 7 | VIEW | 20908 |00:00:00.71 | 2112 |
|* 8 | HASH JOIN | 20908 |00:00:00.68 | 2112 |
|* 9 | HASH JOIN | 20908 |00:00:00.28 | 173 |
|* 10 | INDEX RANGE SCAN | 47734 |00:00:00.01 | 61 |
| 11 | INLIST ITERATOR | 88001 |00:00:00.09 | 112 |
|* 12 | INDEX RANGE SCAN | 88001 |00:00:00.01 | 112 |
|* 13 | INDEX FAST FULL SCAN | 88001 |00:00:00.18 | 1939 |
-------------------------------------------------------------------------
Unrestrlcted user


SQL_ID 5zuyphy3v87rm, child number 0
-------------------------------------
Plan hash value: 1846763385

-------------------------------------------------------------------------
| Id | Operation |A-Rows | A-Time |Buffers |
-------------------------------------------------------------------------
|* 1 | HASH JOIN | 1199 |00:00:00.71 | 10908 |
| 2 | MAT_VIEW ACCESS BY INDEX ROWID | 11507 |00:00:00.12 | 10106 |
| 3 | NESTED LOOPS | 11509 |00:00:00.02 | 18 |
| 4 | MAT_VIEW ACCESS BY INDEX ROWID| 1 |00:00:00.01 | 3 |
|* 5 | INDEX RANGE SCAN | 1 |00:00:00.01 | 2 |
|* 6 | INDEX RANGE SCAN | 11507 |00:00:00.02 | 15 |
|* 7 | VIEW | 20908 |00:00:00.53 | 802 |
|* 8 | HASH JOIN | 20908 |00:00:00.51 | 802 |
|* 9 | HASH JOIN | 20908 |00:00:00.28 | 173 |
|* 10 | INDEX RANGE SCAN | 47734 |00:00:00.01 | 61 |
| 11 | INLIST ITERATOR | 88001 |00:00:00.09 | 112 |
|* 12 | INDEX RANGE SCAN | 88001 |00:00:00.01 | 112 |
|* 13 | INDEX FAST FULL SCAN | 88001 |00:00:00.09 | 629 |
-------------------------------------------------------------------------

Restrlcted user
WITH /* krewrite */ access_lvl as
(
SELECT row_access_auth_cd, indiv_sys_id
FROM td_individual_mv
WHERE user_login_id = 'Reporting'
)
SELECT c.cust_sys_id, c.clup_sys_id
FROM td_clup_detail_mv c, access_lvl a
WHERE c.doc_type_cd IN ('AGENCY', 'FNAS-LNR')
AND c.agent_stat_cd = 'ACTIVE'
AND a.row_access_auth_cd = 'RESTRICTED'
AND c.clup_sys_id in (select rl.clup_sys_id
from td_row_level_security_mv rl
where rl.user_sys_id = a.indiv_sys_id)
UNION ALL
SELECT c.cust_sys_id, c.clup_sys_id
FROM td_clup_detail_mv c, access_lvl a
WHERE c.doc_type_cd IN ('AGENCY', 'FNAS-LNR')
AND c.agent_stat_cd = 'ACTIVE'
AND a.row_access_auth_cd = 'UNRESTRICTED'
---------------------------------------------------------------------------
| Id | Operation |A-Rows | A-Time |Buffers |
---------------------------------------------------------------------------
| 1 | TEMP TABLE TRANSFORMATION | 20908 |00:00:00.34 | 4763 |
| 2 | LOAD AS SELECT | 1 |00:00:00.05 | 7 |
| 3 | MAT_VIEW ACCESS BY INDEX ROWID | 1 |00:00:00.01 | 3 |
|* 4 | INDEX RANGE SCAN | 1 |00:00:00.01 | 2 |
| 5 | UNION-ALL | 20908 |00:00:00.27 | 4753 |
|* 6 | HASH JOIN | 0 |00:00:00.01 | 6 |
| 7 | NESTED LOOPS | 0 |00:00:00.01 | 6 |
|* 8 | VIEW | 0 |00:00:00.01 | 6 |
| 9 | TABLE ACCESS FULL | 1 |00:00:00.01 | 6 |
| 10 | SORT UNIQUE | 0 |00:00:00.01 | 0 |
| 11 | MAT_VIEW ACCESS BY INDEX ROWID| 0 |00:00:00.01 | 0 |
|* 12 | INDEX RANGE SCAN | 0 |00:00:00.01 | 0 |
|* 13 | VIEW | 0 |00:00:00.01 | 0 |
|* 14 | HASH JOIN | 0 |00:00:00.01 | 0 |
|* 15 | HASH JOIN | 0 |00:00:00.01 | 0 |
|* 16 | INDEX RANGE SCAN | 0 |00:00:00.01 | 0 |
| 17 | INLIST ITERATOR | 0 |00:00:00.01 | 0 |
|* 18 | INDEX RANGE SCAN | 0 |00:00:00.01 | 0 |
|* 19 | INDEX FAST FULL SCAN | 0 |00:00:00.01 | 0 |
| 20 | MERGE JOIN CARTESIAN | 20908 |00:00:00.25 | 4747 |
|* 21 | VIEW | 1 |00:00:00.01 | 3 |
| 22 | TABLE ACCESS FULL | 1 |00:00:00.01 | 3 |
| 23 | BUFFER SORT | 20908 |00:00:00.23 | 4744 |
|* 24 | MAT_VIEW ACCESS FULL | 20908 |00:00:00.19 | 4744 |
---------------------------------------------------------------------------
Rewrltten Restrlcted
---------------------------------------------------------------------------
| Id | Operation |A-Rows | A-Time |Buffers |
---------------------------------------------------------------------------
| 1 | TEMP TABLE TRANSFORMATION | 1199 |00:00:01.09 | 10925 |
| 2 | LOAD AS SELECT | 1 |00:00:00.01 | 7 |
| 3 | MAT_VIEW ACCESS BY INDEX ROWID | 1 |00:00:00.01 | 3 |
|* 4 | INDEX RANGE SCAN | 1 |00:00:00.01 | 2 |
| 5 | UNION-ALL | 1199 |00:00:01.07 | 10915 |
|* 6 | HASH JOIN | 1199 |00:00:01.07 | 10912 |
| 7 | NESTED LOOPS | 11507 |00:00:00.46 | 10110 |
|* 8 | VIEW | 1 |00:00:00.01 | 6 |
| 9 | TABLE ACCESS FULL | 1 |00:00:00.01 | 6 |
| 10 | SORT UNIQUE | 11507 |00:00:00.45 | 10104 |
| 11 | MAT_VIEW ACCESS BY INDEX ROWID| 11507 |00:00:00.41 | 10104 |
|* 12 | INDEX RANGE SCAN | 11507 |00:00:00.17 | 15 |
|* 13 | VIEW | 20908 |00:00:00.55 | 802 |
|* 14 | HASH JOIN | 20908 |00:00:00.53 | 802 |
|* 15 | HASH JOIN | 20908 |00:00:00.28 | 173 |
|* 16 | INDEX RANGE SCAN | 47734 |00:00:00.01 | 61 |
| 17 | INLIST ITERATOR | 88001 |00:00:00.09 | 112 |
|* 18 | INDEX RANGE SCAN | 88001 |00:00:00.01 | 112 |
|* 19 | INDEX FAST FULL SCAN | 88001 |00:00:00.09 | 629 |
| 20 | MERGE JOIN CARTESIAN | 0 |00:00:00.01 | 3 |
|* 21 | VIEW | 0 |00:00:00.01 | 3 |
| 22 | TABLE ACCESS FULL | 1 |00:00:00.01 | 3 |
| 23 | BUFFER SORT | 0 |00:00:00.01 | 0 |
|* 24 | MAT_VIEW ACCESS FULL | 0 |00:00:00.01 | 0 |
---------------------------------------------------------------------------

Rewrltten Unrestrlcted
!"#$%&' )*+&, -&.%
unresLrlcLed 1 23.46 33968
unresLrlcLed 2 0.34 4763
8esLrlcLed 1 0.71 10908
8esLrlcLed 2 1.09 10923
P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N










P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N










P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N










P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N

PERFORM
ANCE ANTIPATTERN PERFORM
ANCE ANTIPATTERN PERFORM
ANCE ANTIPATTERN PERFORM
ANCE ANTIPATTERN
1he
Cutllng
Cun
Reeutlng
uggregutes

SELECT ATTRITION_FCTR, ATTRITION_FACTOR_CLNDR_YR,
ATTRITION_FACTOR_CLNDR_MO, PGRD_PROJECT_CODE
FROM ODS_PGRD_PROJECT_ATRTN_FACTORS A
WHERE SIMULATION_CLNDR_YR || SIMULATION_CLNDR_MO =
(SELECT MAX(B.SIMULATION_CLNDR_YR ||
B.SIMULATION_CLNDR_MO)
FROM ODS_PGRD_PROJECT_ATRTN_FACTORS B
WHERE A.PGRD_PROJECT_CODE = B.PGRD_PROJECT_CODE)
Eow bud ls lt?
Profle by dutubuse cull.
/&%$01%& 23&
4%&501'%6
7#""
13,238.249 100.0 lL1CP (18,480 rows)
3.943 0.0 beLween calls
0.032 0.0 A8SL
0.012 0.0 LxLC
89:;<<=;>? 8@@=@A B0.#" ,&%$01%& 23&
hrs mlns secs
-- Profile (R = 4 hours 14 minutes 4.236 seconds)

DB Call Duration CPU Other %R Rows LIO PIO
------------- ---------- ---------- ------- ----- ------ ---------- ----------
FETCH 15,238.249 15,297.950 -59.701 100% 18,480 52,756,900 38,490,001
Between Calls 5.943 0.000 5.943 0% 0 0 0
PARSE 0.032 0.030 0.002 0% 0 0 0
EXEC 0.012 0.000 0.012 0% 0 3 1
------------- ---------- ---------- ------- ----- ------ ---------- ----------
Total 15,244.236 15,297.980 -53.744 100% 18,480 52,756,903 38,490,002
-- Execution Plan

ID Row Source Operation Duration %R Rows LIO PIO
-- ----------------------------------- ---------- ------ ---------- ---------- ----------
1 FILTER -123.167 -0.8% 18,480 86,529 0
2 TABLE ACCESS FULL OBJ#(32390) 1.526 0.0% 271,830 3,053 7,588
3 SORT AGGREGATE 0.761 0.0% 28,843 0 0
4 SORT AGGREGATE 96.790 0.6% 28,843 0 0
5 TABLE ACCESS FULL OBJ#(32390) 15,093.126 100.2% 14,816,070 52,667,318 38,482,413
-- ----------------------------------- ---------- ------ ---------- ---------- ----------
15,069.036 100.0% 52,756,900 38,490,001

SELECT a.ATTRITION_FCTR,
a.ATTRITION_FACTOR_CLNDR_YR,
a.ATTRITION_FACTOR_CLNDR_MO,
a.PGRD_PROJECT_CODE
FROM
( SELECT MAX(simulation_clndr_yr || simulation_clndr_mo)
over (partition by pgrd_project_code) as the_max,
ATTRITION_FCTR,
ATTRITION_FACTOR_CLNDR_YR,
ATTRITION_FACTOR_CLNDR_MO,
PGRD_PROJECT_CODE,
SIMULATION_CLNDR_YR || SIMULATION_CLNDR_MO
as the_yrmo
FROM ODS_PGRD_PROJECT_ATRTN_FACTORS
) a
WHERE a.the_yrmo = a.the_max ;
Profle by dutubuse cull.
/&%$01%& 23&
4%&501'%6
7#""
11.662 68.6 lL1CP (18,480 rows)
3.030 29.6 beLween calls
0.272 1.6 LxLC
0.026 0.2 A8SL
8?=CDC 8@@=@A B0.#" ,&%$01%& 23&
-- Profile (R = 16.989 seconds)

DB Call Duration CPU Other %R Rows LIO PIO
------------- -------- ------- ------- ----- ------ ----- -----
FETCH 11.662 11.110 0.552 68.6% 18,480 1,828 4,680
Between Calls 5.030 0.000 5.030 29.6% 0 0 0
EXEC 0.272 0.030 0.242 1.6% 0 3 1
PARSE 0.026 0.030 -0.004 0.2% 0 6 0
------------- -------- ------- ------- ----- ------ ----- -----
Total 16.989 11.170 5.819 100% 18,480 1,837 4,681

-- Execution Plan

ID Row Source Operation Duration %R Rows LIO PIO/R PIO/W
-- ----------------------------------- ---------- ------ ------- ----- ----- -----
1 VIEW 1.742 15.2% 18,480 0 0 0
2 WINDOW SORT 8.127 70.9% 271,830 7 2,861 1,340
3 TABLE ACCESS FULL OBJ#(32390) 1.598 13.9% 271,830 1,826 1,819 0
-- ----------------------------------- ---------- ------ ------- ----- ----- -----
11.467 100.0% 1,833 4,680 1,340
8eforeufter comurlson.
)&E0,&
4%&56
FG&,
4%&56
H#IJ1-% 7#""
13,238.249 11.662 100.00 lL1CP (18,480 rows)
3.943 3.030 13.4 beLween calls
0.032 0.026 18.8 A8SL
0.012 0.272 -93.6 LxLC
89:;<<=;>? 8?=CDC 8@@=@A B0.#" ,&%$01%& 23&
!"#$%&' KLM NLM
8efore 4 hr 13 mln 32,736,900 38,490,002
Aer 16.9 sec 1837 4681
P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N










P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N










P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N










P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N

PERFORM
ANCE ANTIPATTERN PERFORM
ANCE ANTIPATTERN PERFORM
ANCE ANTIPATTERN PERFORM
ANCE ANTIPATTERN
Relnventlng
the vheel
Current YrjPrlor Yr
vurlunce Reort

WITH /* k2orig */
curr_period AS
(SELECT t3.time_wh_sys_id, t3.acct_period_dt, t3.acct_month_year
,t3.acct_year
,CASE
WHEN t3.acct_month IN ('1', '2', '3')
THEN '1'
WHEN t3.acct_month IN ('4', '5', '6')
THEN '2'
WHEN t3.acct_month IN ('7', '8', '9')
THEN '3'
WHEN t3.acct_month IN ('10', '11', '12')
THEN '4'
END curr_qtr
FROM tw_dim_time t3
, (SELECT MAX (time_wh_sys_id) time_wh_sys_id
FROM tw_dim_time
WHERE acct_month_year <= '200912'
AND is_acct_end_of_month = '1'
AND actual_date < SYSDATE) t
WHERE t3.time_wh_sys_id = t.time_wh_sys_id)
,curr_q_periods AS
(SELECT CASE curr_period.curr_qtr
WHEN '4'
THEN (SELECT t.acct_month_year
FROM tw_dim_time t
WHERE t.acct_month IN ('10')
AND t.acct_year = curr_period.acct_year
AND t.is_acct_end_of_month = '1')
WHEN '1'
THEN (SELECT t.acct_month_year
FROM tw_dim_time t
WHERE t.acct_month IN ('1')
AND t.acct_year = curr_period.acct_year
AND t.is_acct_end_of_month = '1')
WHEN '2'
THEN (SELECT t.acct_month_year
FROM tw_dim_time t
WHERE t.acct_month IN ('4')
AND t.acct_year = curr_period.acct_year
AND t.is_acct_end_of_month = '1')
WHEN '3'
THEN (SELECT t.acct_month_year
FROM tw_dim_time t
WHERE t.acct_month IN ('7')
AND t.acct_year = curr_period.acct_year
AND t.is_acct_end_of_month = '1')
END begin_curr_qtr
,CASE curr_period.curr_qtr
WHEN '4'
THEN (SELECT t.acct_month_year
FROM tw_dim_time t
WHERE t.acct_month IN ('12')
AND t.acct_year = curr_period.acct_year
AND t.is_acct_end_of_month = '1')
WHEN '1'
THEN (SELECT t.acct_month_year
FROM tw_dim_time t
WHERE t.acct_month IN ('3')
AND t.acct_year = curr_period.acct_year
AND t.is_acct_end_of_month = '1')
WHEN '2'
THEN (SELECT t.acct_month_year
FROM tw_dim_time t
WHERE t.acct_month IN ('6')
AND t.acct_year = curr_period.acct_year
AND t.is_acct_end_of_month = '1')
WHEN '3'
THEN (SELECT t.acct_month_year
FROM tw_dim_time t
WHERE t.acct_month IN ('9')
AND t.acct_year = curr_period.acct_year
AND t.is_acct_end_of_month = '1')
END end_curr_qtr
FROM curr_period)
,prior_period AS
(SELECT t2.time_wh_sys_id prior_yr_time_sys_id
,t2.acct_month_year prior_yr_period
FROM tw_dim_time t2, curr_period
WHERE t2.acct_period_dt = ADD_MONTHS (curr_period.acct_period_dt, -12)
AND is_acct_end_of_month = '1')
,prior_qtr AS
(SELECT DECODE (curr_period.curr_qtr
,'1', '4'
,'2', '1'
,'3', '2'
,'4', '3'
) prior_qtr
,DECODE (curr_period.curr_qtr
,'1', curr_period.acct_year - 1
,curr_period.acct_year
) prior_qtr_year
FROM curr_period)
,prior_q_periods AS
(SELECT CASE pq.prior_qtr
WHEN '4'
THEN (SELECT t.acct_month_year
FROM tw_dim_time t
WHERE t.acct_month IN ('10')
AND t.acct_year = pq.prior_qtr_year
AND t.is_acct_end_of_month = '1')
WHEN '1'
THEN (SELECT t.acct_month_year
FROM tw_dim_time t
WHERE t.acct_month IN ('1')
AND t.acct_year = pq.prior_qtr_year
AND t.is_acct_end_of_month = '1')
WHEN '2'
THEN (SELECT t.acct_month_year
FROM tw_dim_time t
WHERE t.acct_month IN ('4')
AND t.acct_year = pq.prior_qtr_year
AND t.acct_year = pq.prior_qtr_year
AND t.is_acct_end_of_month = '1')
WHEN '3'
THEN (SELECT t.acct_month_year
FROM tw_dim_time t
WHERE t.acct_month IN ('7')
AND t.acct_year = pq.prior_qtr_year
AND t.is_acct_end_of_month = '1')
END begin_prior_qtr
,CASE pq.prior_qtr
WHEN '4'
THEN (SELECT t.acct_month_year
FROM tw_dim_time t
WHERE t.acct_month IN ('12')
AND t.acct_year = pq.prior_qtr_year
AND t.is_acct_end_of_month = '1')
WHEN '1'
THEN (SELECT t.acct_month_year
FROM tw_dim_time t
WHERE t.acct_month IN ('3')
AND t.acct_year = pq.prior_qtr_year
AND t.is_acct_end_of_month = '1')
WHEN '2'
THEN (SELECT t.acct_month_year
FROM tw_dim_time t
WHERE t.acct_month IN ('6')
AND t.acct_year = pq.prior_qtr_year
AND t.is_acct_end_of_month = '1')
WHEN '3'
THEN (SELECT t.acct_month_year
FROM tw_dim_time t
WHERE t.acct_month IN ('9')
AND t.acct_year = pq.prior_qtr_year
AND t.is_acct_end_of_month = '1')
END end_prior_qtr
FROM prior_qtr pq)
,time_slices AS
(SELECT curr_period.time_wh_sys_id, curr_period.acct_month_year
,curr_period.curr_qtr, prior_period.prior_yr_time_sys_id
,prior_period.prior_yr_period, prior_q_periods.begin_prior_qtr
,prior_q_periods.end_prior_qtr, prior_qtr.prior_qtr
,prior_qtr.prior_qtr_year, curr_q_periods.begin_curr_qtr
,curr_q_periods.end_curr_qtr
FROM curr_period
,prior_period
,prior_qtr
,prior_q_periods
,curr_q_periods)
,loc_details AS
(SELECT cd.rollup_uw_abbv_cd
,CASE
WHEN cd.cust_loc_nm IS NOT NULL
AND cd.dba_nm_from_loc_nm_ind = 1
THEN cd.cust_loc_nm
WHEN cd.cust_doing_bus_as_nm IS NOT NULL
THEN cd.cust_doing_bus_as_nm
ELSE cd.cust_bus_nm
END cust_loc_nm
,cd.loc_city_nm
, cd.loc_rep_f_nm
|| ' '
|| cd.loc_rep_mid_int_nm
|| ' '
|| cd.loc_rep_l_nmAS loc_rep_nm
, (SELECT NVL (con.first_nm, '')
|| ' '
|| NVL (con.mid_int_nm, '')
|| ' '
|| NVL (con.last_nm, '')
|| ' '
|| NVL (con.sufx_nm, '')
FROM td_contact_mv con
WHERE con.loc_sys_id = cd.loc_sys_id
AND UPPER (con.position_type_cd) = 'PRINCIPAL'
AND ROWNUM = 1) principal_nm
,cd.clup_sys_id
FROM td_clup_detail_mv cd
JOIN td_row_level_security_mv rl
ON cd.clup_sys_id = rl.clup_sys_id
JOIN td_individual_mv i
ON rl.user_sys_id = i.indiv_sys_id
WHERE cd.doc_type_cd IN ('AGENCY', 'FNAS-LNR')
AND cd.cust_sys_id = 5922
AND i.user_login_id = 'TraxReporting')
SELECT
DISTINCT rollup_uw_abbv_cd, cust_loc_nm, loc_city_nm, loc_rep_nm
,principal_nm, NVL (SUM (curr_ytd_net), 0) curr_ytd_net
,acct_month_year AS curr_yr_period, curr_qtr
,NVL (SUM (prior_ytd_net), 0) prior_ytd_net, prior_yr_period
,prior_qtr, prior_qtr_year, begin_prior_qtr, end_prior_qtr
,NVL (SUM (prior_q_net_prm.prior_q_net), 0) prior_q_net
,begin_curr_qtr, end_curr_qtr
,NVL (SUM (curr_q_net_prm.curr_q_net), 0) curr_q_net
FROM
time_slices
,loc_details
,tw_dim_clup clup
, (SELECT NVL(SUM (fcm.net_prm_tot_ytd_eom_amt),0) curr_ytd_net
,fcm.time_wh_sys_id, fcm.clup_wh_sys_id
FROM tw_fact_clup_monthly fcm
JOIN time_slices ts
ON fcm.time_wh_sys_id = ts.time_wh_sys_id
GROUP BY fcm.time_wh_sys_id, fcm.clup_wh_sys_id)
curr_ytd_net_prm
, (SELECT NVL(SUM (fcm.net_prm_tot_ytd_eom_amt),0) prior_ytd_net
,fcm.time_wh_sys_id, fcm.clup_wh_sys_id
FROM tw_fact_clup_monthly fcm
JOIN time_slices ts
ON fcm.time_wh_sys_id = ts.prior_yr_time_sys_id
GROUP BY fcm.time_wh_sys_id, fcm.clup_wh_sys_id)

AND prior_ytd_net_prm
, (SELECT NVL (SUM (fcm.net_prm_tot_eom_amt), 0) prior_q_net
,fcm.clup_wh_sys_id
FROM tw_fact_clup_monthly fcm
JOIN tw_dim_time t5
ON fcm.time_wh_sys_id = t5.time_wh_sys_id
JOIN prior_q_periods pq
ON t5.acct_month_year BETWEEN pq.begin_prior_qtr AND pq.end_prior_qtr
GROUP BY fcm.clup_wh_sys_id)
prior_q_net_prm
, (SELECT NVL (SUM (fcm.net_prm_tot_eom_amt), 0) curr_q_net
,fcm.clup_wh_sys_id
FROM tw_fact_clup_monthly fcm
JOIN tw_dim_time t6
ON fcm.time_wh_sys_id = t6.time_wh_sys_id
JOIN curr_q_periods cq
ON t6.acct_month_year BETWEEN cq.begin_curr_qtr AND cq.end_curr_qtr
GROUP BY fcm.clup_wh_sys_id)
curr_q_net_prm
WHERE
loc_details.clup_sys_id = clup.clup_sys_id
AND clup.clup_wh_sys_id = curr_ytd_net_prm.clup_wh_sys_id(+)
AND clup.clup_wh_sys_id = prior_ytd_net_prm.clup_wh_sys_id(+)
AND clup.clup_wh_sys_id = prior_q_net_prm.clup_wh_sys_id(+)
AND clup.clup_wh_sys_id = curr_q_net_prm.clup_wh_sys_id(+)
GROUP BY rollup_uw_abbv_cd,cust_loc_nm,loc_city_nm ,loc_rep_nm,principal_nm,acct_month_year,curr_qtr,prior_yr_period,
prior_qtr,prior_qtr_year,begin_prior_qtr,end_prior_qtr,begin_curr_qtr,end_curr_qtr;

Yeuh.rlght.
WITH /* k2orig */
curr_period AS
(SELECT t3.time_wh_sys_id, t3.acct_period_dt, t3.acct_month_year
,t3.acct_year
,CASE
WHEN t3.acct_month IN ('1', '2', '3')
THEN '1'
WHEN t3.acct_month IN ('4', '5', '6')
THEN '2'
WHEN t3.acct_month IN ('7', '8', '9')
THEN '3'
WHEN t3.acct_month IN ('10', '11', '12')
THEN '4'
END curr_qtr
FROM tw_dim_time t3
, (SELECT MAX (time_wh_sys_id) time_wh_sys_id
FROM tw_dim_time
WHERE acct_month_year <= '200912'
AND is_acct_end_of_month = '1'
AND actual_date < SYSDATE) t
WHERE t3.time_wh_sys_id = t.time_wh_sys_id)
,curr_q_periods AS
(SELECT CASE curr_period.curr_qtr
WHEN '4'
THEN (SELECT t.acct_month_year
FROM tw_dim_time t
WHERE t.acct_month IN ('10')
AND t.acct_year = curr_period.acct_year
AND t.is_acct_end_of_month = '1')
WHEN '1'
THEN (SELECT t.acct_month_year
FROM tw_dim_time t
WHERE t.acct_month IN ('1')
AND t.acct_year = curr_period.acct_year
AND t.is_acct_end_of_month = '1')
WHEN '2'
THEN (SELECT t.acct_month_year
FROM tw_dim_time t
WHERE t.acct_month IN ('4')
AND t.acct_year = curr_period.acct_year
AND t.is_acct_end_of_month = '1')
WHEN '3'
. . . and so on
,time_slices AS
(SELECT curr_period.time_wh_sys_id
,curr_period.acct_month_year
,curr_period.curr_qtr
,prior_period.prior_yr_time_sys_id
,prior_period.prior_yr_period
,prior_q_periods.begin_prior_qtr
,prior_q_periods.end_prior_qtr
,prior_qtr.prior_qtr
,prior_qtr.prior_qtr_year
,curr_q_periods.begin_curr_qtr
,curr_q_periods.end_curr_qtr
FROM curr_period
,prior_period
,prior_qtr
,prior_q_periods
,curr_q_periods)
FROM
time_slices
,loc_details
,tw_dim_clup clup
, (SELECT NVL(SUM (fcm.net_prm_tot_ytd_eom_amt),0) curr_ytd_net
,fcm.time_wh_sys_id, fcm.clup_wh_sys_id
FROM tw_fact_clup_monthly fcm
JOIN time_slices ts
ON fcm.time_wh_sys_id = ts.time_wh_sys_id
GROUP BY fcm.time_wh_sys_id, fcm.clup_wh_sys_id)
curr_ytd_net_prm
, (SELECT NVL(SUM (fcm.net_prm_tot_ytd_eom_amt),0) prior_ytd_net
,fcm.time_wh_sys_id, fcm.clup_wh_sys_id
FROM tw_fact_clup_monthly fcm
JOIN time_slices ts
ON fcm.time_wh_sys_id = ts.prior_yr_time_sys_id
GROUP BY fcm.time_wh_sys_id, fcm.clup_wh_sys_id)
prior_ytd_net_prm
Eow bud ls lt?
!"#$%&' KLM NLM
4 mln 20 sec 293,000 291,000
ans as
(SELECT dtl.clup_sys_id,
dt.acct_year,
to_char(dt.acct_period_dt,'Q') acct_qtr,
SUM(NVL (fcm.net_prm_tot_eom_amt, 0)) net_prm
FROM clups dtl
,tw_dim_clup clup
,tw_fact_clup_monthly fcm
,tw_dim_time dt
WHERE dtl.clup_sys_id = clup.clup_sys_id
AND clup.clup_wh_sys_id = fcm.clup_wh_sys_id
AND fcm.time_wh_sys_id = dt.time_wh_sys_id
AND dt.acct_month_year
BETWEEN '200901'
AND '201012'
AND dt.is_acct_end_of_month = '1'
GROUP BY dtl.clup_sys_id,
ROLLUP ( dt.acct_year, to_char(dt.acct_period_dt,'Q') ))
Rewrlte
!"#$%&' KLM NLM
8efore 4 mln 20 sec 293,000 291,000
Aer 7.3 sec 1833 1348
P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N










P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N










P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N










P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N

PERFORM
ANCE ANTIPATTERN PERFORM
ANCE ANTIPATTERN PERFORM
ANCE ANTIPATTERN PERFORM
ANCE ANTIPATTERN
'ust
followlng
rocedure
Comute un
uveruge # duys
between orders

-- Show the list of order dates for customer 102

SQL> select customer_id, order_date
2 from orders
3 where customer_id = 102 ;

CUSTOMER_ID ORDER_DATE
--------------- -------------------------------
102 19-NOV-07 03.41.54.696211 PM
102 14-SEP-07 08.53.40.223345 AM
102 29-MAR-07 01.22.40.536996 PM
102 14-SEP-06 06.03.04.763452 AM
-- Determine the order_date prior to the
-- current row's order_date

SQL> select customer_id, order_date,
2 lag(order_date,1,order_date)
3 over (partition by customer_id order by order_date)
4 as prev_order_date
5 from orders
6 where customer_id = 102;

CUSTOMER_ID ORDER_DATE PREV_ORDER_DATE
----------- ---------------------- ----------------------
102 14-SEP-06 06.03.04 AM 14-SEP-06 06.03.04 AM
102 29-MAR-07 01.22.40 PM 14-SEP-06 06.03.04 AM
102 14-SEP-07 08.53.40 AM 29-MAR-07 01.22.40 PM
102 19-NOV-07 03.41.54 PM 14-SEP-07 08.53.40 AM
-- Determine the days between each order

SQL> select trunc(order_date) - trunc(prev_order_date) days_btwn
2 from
3 (
4 select customer_id, order_date,
5 lag(order_date,1,order_date)
6 over (partition by customer_id order by order_date)
7 as prev_order_date
8 from orders
9 where customer_id = 102
10 );

DAYS_BETWEEN
---------------
0
196
169
66
-- Put it together with an AVG function to get the final answer

SQL> select avg(trunc(order_date) - trunc(prev_order_date))
2 from
3 (
4 select customer_id, order_date,
5 lag(order_date,1,order_date)
6 over (partition by customer_id order by order_date)
7 as prev_order_date
8 from orders
9 where customer_id = 102
10 );

AVG_DAYS_BETWEEN
----------------
107.75
SQL> select (max(trunc(order_date))
min(trunc(order_date))) / count(*)
as avg_days_between
2 from orders
3 where customer_id = 102 ;

AVG_DAYS_BETWEEN
----------------
107.75
!"#$%&' KLM NLM
8efore 6.39 sec 979 634
Aer 0.01 sec 18 0
Rows uccessed = z
P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N










P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N










P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N










P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N

PERFORM
ANCE ANTIPATTERN PERFORM
ANCE ANTIPATTERN PERFORM
ANCE ANTIPATTERN PERFORM
ANCE ANTIPATTERN
l wunt lt
ALL
SLLLC1 *
vs
SLLLC1 <columnllst>

SQL_ID 8qf110gcy0zf6, child number 0
-------------------------------------
select /* km_all */ * from my_objects
order by owner, object_name

Plan hash value: 3173709044

------------------------------------------------------------------------
| Id | Operation | Name |A-Rows | A-Time | Buffers |
------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 434K|00:00:04.41 | 5986 |
| 1 | SORT ORDER BY | | 434K|00:00:04.41 | 5986 |
| 2 | TABLE ACCESS FULL| MY_OBJECTS | 434K|00:00:02.61 | 5986 |
------------------------------------------------------------------------

------------------------------------------------------------------------
| Id | Operation | Name |Reads | OMem |1Mem |Used-Mem |
------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5983 | | | |
| 1 | SORT ORDER BY | | 5983 | 57M |2653K| 51M (0)|
| 2 | TABLE ACCESS FULL| MY_OBJECTS | 5983 | | | |
------------------------------------------------------------------------
SQL_ID 09rv44ga24u2u, child number 0
-------------------------------------
select /* km_only */ owner, object_name from my_objects
order by owner, object_name

Plan hash value: 3173709044

------------------------------------------------------------------------
| Id | Operation | Name |A-Rows | A-Time | Buffers |
------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 434K|00:00:03.38 | 5986 |
| 1 | SORT ORDER BY | | 434K|00:00:03.38 | 5986 |
| 2 | TABLE ACCESS FULL| MY_OBJECTS | 434K|00:00:01.94 | 5986 |
------------------------------------------------------------------------

-----------------------------------------------------------------------
| Id | Operation | Name |Reads |OMem |1Mem |Used-Mem |
-----------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5978 | | | |
| 1 | SORT ORDER BY | | 5978 | 18M|1608K| 16M (0)|
| 2 | TABLE ACCESS FULL| MY_OBJECTS | 5978 | | | |
-----------------------------------------------------------------------

UPLA1L
thut sets
=
z
update redo_t
set c2 = 2
where c1 = 1;
SQL> @ds
Table Owner : hr
Table Name : redo_t
Column List : c1,c2
Where Clause :
Page Size[30]:

Table blocks below hwm Table rows
(B) (R)
---------------------- ----------------
16,256 1,000,000

C1 C2 (pb = b/B) (b) (pr = r/R) (r)
---- ----- ---------- ------- ---------- --------
1 2 96.11% 15,624 99.99% 999,900
1 1 0.01% 2 0.01% 100

pb = Block selectivity
b = Block count
pr = Row selectivity
r = Row count
Check redo size => 784 bytes

Execute UPDATE => 1,000,000 rows updated

Check redo size => 294,319,144 bytes
---------------------------------------------------------------------
| Id | Operation | Name | A-Rows | A-Time | Buffers |
---------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 0 |00:00:44.12 | 1444K|
| 1 | UPDATE | REDO_T | 0 |00:00:44.12 | 1444K|
|* 2 | TABLE ACCESS FULL| REDO_T | 1000K|00:00:04.54 | 400K|
---------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - filter("C1"=1)
update redo_t
set c2 = 2
where c1 = 1
and c2 != 2;
Check redo size => 784 bytes

Execute UPDATE => 100 rows updated

Check redo size => 784 bytes
--------------------------------------------------------------------
| Id | Operation | Name |A-Rows | A-Time | Buffers |
--------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 0 |00:00:00.11 | 15853 |
| 1 | UPDATE | REDO_T | 0 |00:00:00.11 | 15853 |
|* 2 | TABLE ACCESS FULL| REDO_T | 100 |00:00:00.11 | 15849 |
--------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - filter(("C2"<>2 AND "C1"=1))
!"#$%&' KLM
8efore 44.12 sec 1,444k
Aer 0.11 sec 13,833
llnul row flters
ulled ufter ull
row dutu retrleved

SELECT /* ktstorig */ ot.*
FROM vs_order_track ot
WHERE ot.conf_sent_dte IS NULL
AND ot.appt_dte IS NOT NULL
AND (ot.appt_dte < systimestamp-.1666666
OR ot.hc_sent_dte IS NOT NULL
OR ot.appt_conf_dte IS NOT NULL)
AND EXISTS
( SELECT NULL
FROM vs_edi_log e
WHERE e.order_cde = ot.order_cde)
AND EXISTS
( SELECT NULL
FROM vs_order o
WHERE o.company_cde = ot.company_cde
AND o.order_cde = ot.order_cde
AND o.appr_conf_insp_flg='Y');
------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | A-Rows | A-Time | Buffers | Reads |
------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 249 |00:00:23.17 | 183K| 96557 |
| 1 | NESTED LOOPS SEMI | | 1 | 249 |00:00:23.17 | 183K| 96557 |
|* 2 | HASH JOIN RIGHT SEMI| | 1 | 251 |00:00:23.17 | 183K| 96557 |
|* 3 | INDEX RANGE SCAN | IDX_VS_ORDER_019 | 1 | 255K|00:00:00.01 | 675 | 0 |
|* 4 | TABLE ACCESS FULL | VS_ORDER_TRACK | 1 | 1046K|00:00:20.98 | 182K| 96557 |
|* 5 | INDEX RANGE SCAN | IDX_VS_EDI_LOG_002 | 250 | 248 |00:00:00.01 | 518 | 0 |
------------------------------------------------------------------------------------------------------
Original plan
SELECT /* ktstfix */ ot.*
FROM (SELECT /*+ no_merge */ ot.rowid rid
FROM vs_order_track ot
WHERE ot.conf_sent_dte IS NULL
AND ot.appt_dte IS NOT NULL
AND (ot.appt_dte < systimestamp-.1666666
OR ot.hc_sent_dte IS NOT NULL
OR ot.appt_conf_dte IS NOT NULL)
AND EXISTS
( SELECT NULL
FROM vs_edi_log e
WHERE e.order_cde = ot.order_cde)
AND EXISTS
( SELECT NULL
FROM vs_order o
WHERE o.order_cde = ot.order_cde
AND o.appr_conf_insp_flg='Y') ) main,
vs_order_track ot
WHERE main.rid = ot.rowid ;
-------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | A-Rows | A-Time | Buffers |
-------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 249 |00:00:05.71 | 67265 |
| 1 | NESTED LOOPS | | 1 | 249 |00:00:05.71 | 67265 |
| 2 | VIEW | | 1 | 249 |00:00:05.71 | 67016 |
|* 3 | HASH JOIN SEMI | | 1 | 249 |00:00:05.71 | 67016 |
|* 4 | HASH JOIN RIGHT SEMI | | 1 | 251 |00:00:02.86 | 52108 |
|* 5 | INDEX RANGE SCAN | IDX_VS_ORDER_019 | 1 | 255K|00:00:00.01 | 675 |
|* 6 | INDEX FAST FULL SCAN | IDX_VS_ORDER_TRACK_005 | 1 | 1046K|00:00:01.05 | 51433 |
| 7 | INDEX FAST FULL SCAN | IDX_VS_EDI_LOG_002 | 1 | 3100K|00:00:00.01 | 14908 |
| 8 | TABLE ACCESS BY USER ROWID| VS_ORDER_TRACK | 249 | 249 |00:00:00.01 | 249 |
-------------------------------------------------------------------------------------------------------
Rewritten plan
-------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | A-Rows | A-Time | Buffers |
-------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 249 |00:00:05.71 | 67265 |
| 1 | NESTED LOOPS | | 1 | 249 |00:00:05.71 | 67265 |
| 2 | VIEW | | 1 | 249 |00:00:05.71 | 67016 |
|* 3 | HASH JOIN SEMI | | 1 | 249 |00:00:05.71 | 67016 |
|* 4 | HASH JOIN RIGHT SEMI | | 1 | 251 |00:00:02.86 | 52108 |
|* 5 | INDEX RANGE SCAN | IDX_VS_ORDER_019 | 1 | 255K|00:00:00.01 | 675 |
|* 6 | INDEX FAST FULL SCAN | IDX_VS_ORDER_TRACK_005 | 1 | 1046K|00:00:01.05 | 51433 |
| 7 | INDEX FAST FULL SCAN | IDX_VS_EDI_LOG_002 | 1 | 3100K|00:00:00.01 | 14908 |
| 8 | TABLE ACCESS BY USER ROWID| VS_ORDER_TRACK | 249 | 249 |00:00:00.01 | 249 |
-------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | A-Rows | A-Time | Buffers | Reads |
------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 249 |00:00:23.17 | 183K| 96557 |
| 1 | NESTED LOOPS SEMI | | 1 | 249 |00:00:23.17 | 183K| 96557 |
|* 2 | HASH JOIN RIGHT SEMI| | 1 | 251 |00:00:23.17 | 183K| 96557 |
|* 3 | INDEX RANGE SCAN | IDX_VS_ORDER_019 | 1 | 255K|00:00:00.01 | 675 | 0 |
|* 4 | TABLE ACCESS FULL | VS_ORDER_TRACK | 1 | 1046K|00:00:20.98 | 182K| 96557 |
|* 5 | INDEX RANGE SCAN | IDX_VS_EDI_LOG_002 | 250 | 248 |00:00:00.01 | 518 | 0 |
------------------------------------------------------------------------------------------------------
Original
Rewrite
!"#$%&' KLM
8efore 23.17 sec 183k
Aer 3.71 sec 67,263
P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N










P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N










P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N










P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N

PERFORM
ANCE ANTIPATTERN PERFORM
ANCE ANTIPATTERN PERFORM
ANCE ANTIPATTERN PERFORM
ANCE ANTIPATTERN
Slow by Slow
Row by row ls slow by slow.

1om lyte
Rowbyrow
LML

Row by row rocesslng
Requlrement to lNSLR1jUPLA1LjLLLL1L
muny rows
Luch row hus some lntermedlute rocesslng
requlred
DECLARE
num INTEGER := 1000000 ;
BEGIN
FOR indx IN 1..num LOOP
INSERT INTO products
VALUES (num, 'Product ' ||
TO_CHAR(num));
END LOOP;
END;
/
Eow bud ls lt?
Profle by subroutlne cull.
/&%$01%& 23&
4%&501'%6
7#""
230.19 87.3 Cu servlce
27.63 10.3 unaccounLed-for
3.09 1.9 log buer space
0.11 0.0 all oLher
;?>=@; 8@@=@A B0.#" ,&%$01%& 23&
ApproxlmaLely 3,800 rows per second
DECLARE
TYPE NumTab IS TABLE OF products.prodnum%TYPE
INDEX BY BINARY_INTEGER;
TYPE NameTab IS TABLE OF products.prodname%TYPE
INDEX BY BINARY_INTEGER;
pnums NumTab;
pnames NameTab;
num INTEGER := 1000000;
BEGIN
FOR indx IN 1..num LOOP
pnums(indx) := indx;
pnames(indx) := 'Product ' || TO_CHAR(indx);
END LOOP;

FORALL indx IN pnums.FIRST .. pnums.LAST
INSERT INTO products
VALUES (pnums(indx), pnames(indx));
END;
/
Profle by subroutlne cull.
/&%$01%& 23&
4%&501'%6
7#""
21.79 63.3 unaccounLed-for
10.48 31.3 Cu servlce
0.47 1.4 log le swlLch compleuon
0.30 1.6 all oLher
>>=;< 8@@=@A B0.#" ,&%$01%& 23&
ApproxlmaLely 30,000 rows per second
8eforeufter comurlson.
)&E0,&
4%&56
FG&,
4%&56
H#IJ1-% 7#""
230.19 10.48 93.4 Cu servlce
27.63 21.79 21.2 unaccounLed-for
3.20 0.97 81.3 all oLher
;?>=@; >>=;< DO=<A B0.#" ,&%$01%& 23&
~30,000
rows/sec
~3,800
rows/sec
Uslng PLjSQL
to do the job
of u slngle SQL
stutement
z
declare
v_ct number := 0 ;
cursor emp_cur is
select emp_id, salary
from wal_emps
where status = 'ACTIVE';
begin
for rec in emp_cur loop
begin
select count(emp_id)
into v_ct
from annual_bonus
where emp_id = rec.emp_id;
if v_ct > 0 then
update annual_bonus
set bonus_amt = rec.salary * .03
where emp_id = rec.emp_id ;
else
insert into annual_bonus
values (rec.emp_id, rec.salary * .03);
end if;
exception
when others then
dbms_output.put_line (sqlerrm) ;
end ;
end loop ;
end ;
Resonse tlme rofle
c,ccc rows
,., seconds
SQL> MERGE INTO annual_bonus B
2 USING (
3 SELECT emp_id, salary
4 FROM wal_emps
5 WHERE status = 'ACTIVE') E
6 ON (B.emp_id = E.emp_id)
7 WHEN MATCHED THEN
8 UPDATE SET B.bonus_amt = E.salary * 0.03
9 WHEN NOT MATCHED THEN
10 INSERT (B.emp_id, B.bonus_amt)
11 VALUES (E.emp_id, E.salary * 0.03)
12 /

10000 rows merged.
Resonse tlme rofle
c,ccc rows
.6, seconds
SQL> create table annual_bonus_2011 as
2 select emp_id, salary * .03 as bonus_amt
3 from wal_emps
4 where status = 'ACTIVE';

Table created.
Resonse tlme rofle
c,ccc rows
.z seconds
P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N










P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N










P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N










P
E
R
F
O
R
M
A
N
C
E

A
N
T
I
P
A
T
T
E
R
N

PERFORM
ANCE ANTIPATTERN PERFORM
ANCE ANTIPATTERN PERFORM
ANCE ANTIPATTERN PERFORM
ANCE ANTIPATTERN
Cther
Common
Antlutterns
Cther Common Antlutterns
1oo much urslng (llteruls vs blnds)
CRCUPlng on too muny columns
Puttern mutchlng LllL for leudlng wlldcurds
Monster query
C1Ls ln vlew (bug)
Cne slze fts ull vlews
vruU
Lon't get stuck ln u rut
1here ure muny wuys to do most everythlng!
Look for common utterns (untlutterns)
Avold reeuted or unnecessury work fow
1est us muny otlons us osslble
Sometlmes even the untluttern muy work best
ln your seclfc context
Arouch every roblem by belng oen to
"out of the box" thlnklng
1hunk
You!
kurenmorton.blogsot.com
kuren.mortonQenkltec.com
kuren_morton

You might also like