2014 05 20 writing sql right antipatterns
TRANSCRIPT
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
1/121
!"#$%& ()*+&",-".#/$&0
1"232/4 ()* 52463
!"#$% '(#)(%
*#+ ,$-.%/-"0 1(%230)"%)
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
2/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
3/121
>?62/7 -@3:2A& 36& 9-B>
clich magic
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
4/121
?6& $%2$6C 2: -D&"E@:&A8
F3 2.;%2&: 36&"&G: :-.&362/4.#42$#% #9-@3 $" D23H8
I@3 $" D23H 2: # :72%% 36#3$#/ 9& A&D&%-;&A8
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
5/121
J2D&"4&/3 K-/D&"4&/3
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
6/121
J2D&"4&/3
L&/&"#3&F.#42/&
MB;&"2.&/3I"#2/:3-".J&,&" N@A4.&/3
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
7/121
MD#%@#3&!"4#/2O&(&%&$3
P-$@:5&Q/&
K-/D&"4&/3
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
8/121
J2D&"4&/3 K-/D&"4&/3
(&;#"#3& 36&:& #;;"-#$6&:816&/ H-@G"& A2D&"42/4R ,-$@: -/%H -/ A2D&"42/48!/$& H-@GD& &B;%-"&A # S2A& "#/4& -, 2A:R 36&/ H-@ $#/ $-/D&"4&8
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
9/121
16H 2: 23 :-
6#"A3- 362/7
-@3:2A& 36& 9-BT
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
10/121
633;0UUSSS83&A8$-.U:;&":U:2"
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
11/121
V-S 36#3 FGD&
4-3 H-@
362/72/4W
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
12/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
13/121
P2":3
362/4:
Q":3X?62: 2: !"#$$%2.;-"3#/3Y
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
14/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
15/121
16#3 2: 23
:@;;-:&A3- A-T
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
16/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
17/121
?62/4:?- [&&;
F/ \2/A
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
18/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
19/121
V#.& H-@" ()*
SELECT/* kmtest */ FROM tab
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
20/121
U^_ 4#36&"
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
21/121
A9.:
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
22/121
[/-S H-@" A#3#8X#/A H-@" :$6&.#Y
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
23/121
d2:@#%2O&Xd2:@#% ()* ?@/2/4Y
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
24/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
25/121
1#3$6 ,-"
$-..-/ .2:3#7&:8
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
26/121
>K-%@./E%&::>
N-2/&A 3#9%&:
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
27/121
SELECT b.*FROM a, bWHERE a.col1 = b.col1AND b.col2 =
SELECT b.*
FROM bWHERE b.col2 = AND EXISTS (SELECT nullFROM a WHERE a.col1 = b.col1)
?62:
I&$-.&:
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
28/121
F.;"-;&"
-@3&" N-2/:
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
29/121
AND tab1.col1 = tab2.col1 (+)AND tab2.col2 =
AND tab1.col1 = tab2.col1AND tab2.col2 =
?62:
I&$-.&:
I&$#@:& 36& $-/A232-/ S-@%A 9& /@%% ,-" 36& -@3&" N-2/&A "-SR:- 36& ;"&A2$#3& $-@%A /&D&" 9& 3"@&8
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
30/121
5&;&A @:&
-, :#.& 3#9%&:#/A ;"&A2$#3&:
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
31/121
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_idAND roi.order_item_id = rit.order_item_idAND roi.order_id = rit.order_idAND rit.transaction_id = rite.transaction_idAND (rite.event_name >'AUTHORIZED' OR rite.event_name
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
32/121
K6&$7 D2#92%23H
-, 2/A&B&:
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
33/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
34/121
*--7 ,-"
JF(?FVK?UeVF!V3- "&.-D& A@;%2$#3&:8
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
35/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
36/121
SELECT FROM TR_CLUPWHERE CUST_SYS_ID = 6419AND LOC_SYS_ID = 37837AND UW_SYS_ID = 72AND PROP_STATE_CD= 'AL'
AND ROWNUM
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
37/121
SELECT count(*)FROM TR_CLUPWHERE CUST_SYS_ID = 6419AND LOC_SYS_ID = 37837AND UW_SYS_ID = 72AND PROP_STATE_CD= 'AL'
AND ROWNUM
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
38/121
()* b/32;#33&"/:
*"/2/4 S6#3 3- A-9H %"/2/4 S6#3
)"'3- A-
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
39/121
EANTIPATTER
N
PER
FORMANCEANTIPAT
TER
N
PER
FORM
ANCEANTIPA
EANTIPATTERNPERFORM
ANCEANTIPATTER
N PERFORMA
NCEANTIPATTERN
PERFORMAN
J2D2A&c
K-/Z@&"
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
40/121
\2/U\#B !;32.2O#32-/
f
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
41/121
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 |-------------------------------------------------------------------------------
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
42/121
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 |
-----------------------------------------------------------------------------------
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
43/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
44/121
b%% -" V-/&
g
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
45/121
SELECT /* korig */ cd.cust_sys_id, cd.clup_sys_idFROM td_clup_detail_mv cd
JOIN td_row_level_security_mvrlON cd.clup_sys_id = rl.clup_sys_id
JOIN td_individual_mviON 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'
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
46/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
47/121
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 |-------------------------------------------------------------------------
5&:3"2$3&A @:&"
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
48/121
WITH /* krewrite */ access_lvl as(
SELECT row_access_auth_cd, indiv_sys_idFROM td_individual_mvWHERE user_login_id = 'Reporting')SELECT c.cust_sys_id, c.clup_sys_idFROM td_clup_detail_mv c, access_lvl aWHERE 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 rlwhere rl.user_sys_id = a.indiv_sys_id)
UNION ALL
SELECT c.cust_sys_id, c.clup_sys_idFROM td_clup_detail_mv c, access_lvl aWHERE c.doc_type_cd IN ('AGENCY', 'FNAS-LNR')AND c.agent_stat_cd = 'ACTIVE'AND a.row_access_auth_cd = 'UNRESTRICTED'
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
49/121
---------------------------------------------------------------------------| 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 |---------------------------------------------------------------------------
5&S"233&/ 5&:3"2$3&A
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
50/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
51/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
52/121
EANTIPATTER
N
PER
FORMANCEANTIPAT
TER
N
PER
FORMANC
EANTIPA
EANTIPATTERN PER
FORMANCEANTIP
ATTERNPERFORM
ANCEANTIPATTER
N PERFORMA
N
?6&L#3%2/4
L@/
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
53/121
5&; /4
#44"&4#3&:
f
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
54/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
55/121
h-S 9#A 2: 23T
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
56/121
+"-Q%& 9H A#3#9#:& $#%%W
/&%$01%& 23&
4%&501'%67#""
6;A78=+79< 6>>+>B CD,1E F6=A9=> #(G2H
;++>B I$)G$$% -"002>+>87 >+>B JK@*D
>+>67 >+>B DLD1
89:;
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
57/121
-- 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 0PARSE 0.032 0.030 0.002 0% 0 0 0EXEC 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,5883 SORT AGGREGATE 0.761 0.0% 28,843 0 0
4 SORT AGGREGATE 96.790 0.6% 28,843 0 05 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
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
58/121
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_yrmoFROM ODS_PGRD_PROJECT_ATRTN_FACTORS
) aWHERE a.the_yrmo = a.the_max ;
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
59/121
+"-Q%& 9H A#3#9#:& $#%%W
/&%$01%& 23&
4%&501'%67#""
66+::7 :=+:B CD,1E F6=A9=> #(G2H
;+>8> 7
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
60/121
-- 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,680Between Calls 5.030 0.000 5.030 29.6% 0 0 0EXEC 0.272 0.030 0.242 1.6% 0 3 1PARSE 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,3403 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
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
61/121
I&,-"&E#,3&" $-.;#"2:-/W
)&E0,&
4%&56
FG&,
4%&56H#IJ1-% 7#""
6;A78=+79< 66+::7 6>>+>>B CD,1E F6=A9=> #(G2H
;+8> 6;+9B I$)G$$% -"002>+>87 >+>7: 6=+=B JK@*D
>+>67 >+7?7 M
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
62/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
63/121
K@""&/3 j"U+"2-" j"
d#"2#/$& 5&;-"3
f
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
64/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
65/121
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_qtrFROM tw_dim_time t3
, (SELECT MAX (time_wh_sys_id) time_wh_sys_idFROM tw_dim_timeWHERE acct_month_year
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
66/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
67/121
,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)
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
68/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
69/121
h-S 9#A 2: 23T
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
70/121
!"#$%&' KLM NLM
9 P/% 7> 2$- 7>> 7>>
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
71/121
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_idAND clup.clup_wh_sys_id = fcm.clup_wh_sys_id
AND fcm.time_wh_sys_id = dt.time_wh_sys_idAND 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') ))
5&S"23&
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
72/121
EA
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
73/121
ANTIPATTER
N
PER
FORMANCEANTIPATT
ERN
PER
FORMA
NCEANTIPA
EANTIPATTERN
PERFORMANCEAN
TIPATTERN PE
RFORMANCEANT
IPATTERN PER
FORMAN
k@:3,-%%-S2/4
;"-$&A@"&
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
74/121
K-.;@3& #/
#D&"#4& l A#H:
9&3S&&/ -"A&":
f
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
75/121
-- Show the list of order dates for customer 102
SQL> select customer_id, order_date
2 from orders3 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 AM102 29-MAR-07 01.22.40.536996 PM102 14-SEP-06 06.03.04.763452 AM
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
76/121
-- 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_date5 from orders6 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 AM102 29-MAR-07 01.22.40 PM 14-SEP-06 06.03.04 AM102 14-SEP-07 08.53.40 AM 29-MAR-07 01.22.40 PM102 19-NOV-07 03.41.54 PM 14-SEP-07 08.53.40 AM
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
77/121
-- Determine the days between each order
SQL> select trunc(order_date) - trunc(prev_order_date) days_btwn
2 from3 (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 orders9 where customer_id = 10210 );
DAYS_BETWEEN---------------
0
19616966
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
78/121
-- Put it together with an AVG function to get the final answer
SQL> select avg(trunc(order_date) - trunc(prev_order_date))
2 from3 (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 orders9 where customer_id = 10210 );
AVG_DAYS_BETWEEN----------------
107.75
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
79/121
SQL> select (max(trunc(order_date))
min(trunc(order_date))) / count(*)as avg_days_between
2 from orders3 where customer_id = 102 ;
AVG_DAYS_BETWEEN
----------------107.75
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
80/121
!"#$%&' KLM NLM
N$O(#$ :+8< 2$-
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
81/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
82/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
83/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
84/121
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 | | | |-----------------------------------------------------------------------
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
85/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
86/121
update redo_tset c2 = 2where c1 = 1;
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
87/121
SQL> @dsTable Owner : hrTable Name : redo_t
Column List : c1,c2Where 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,9001 1 0.01% 2 0.01% 100
pb = Block selectivityb = Block countpr = Row selectivityr = Row count
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
88/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
89/121
update redo_tset c2 = 2where c1 = 1and c2 != 2;
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
90/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
91/121
!"#$%&' KLM
N$O(#$ 99+67 2$- 6A999!
KQ$# >+66 2$- 6;A=;8
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
92/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
93/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
94/121
SELECT /* ktstfix */ ot.*
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
95/121
SELECT / ktstfix / ot.
FROM (SELECT /*+ no_merge */ ot.rowidrid
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 NULLFROM vs_edi_log e
WHERE e.order_cde = ot.order_cde)
AND EXISTS
( SELECT NULL
FROM vs_order oWHERE o.order_cde = ot.order_cde
AND o.appr_conf_insp_flg='Y') ) main,
vs_order_track ot
WHERE main.rid = ot.rowid ;
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
96/121
O i i l
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
97/121
-------------------------------------------------------------------------------------------------------| 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
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
98/121
EANTI
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
99/121
IPATTER
N
PER
FORMANCEANTIP
ATTER
N
PER
FORMANCE
ANTIPA
EANTIPATTER
N PERFORMA
NCEANTIPATTERN
PERFORMAN
CEANTIPATTERN
PERFORMAN
(%-S 9H (%-S
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
100/121
5-S 9H "-S 2: :%-S 9H :%-S8
r?-. [H3&
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
101/121
5-SE9HE"-S
J\*
f
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
102/121
5-S 9H "-S ;"-$&::2/4
5&Z@2"&.&/3 3- FV(M5?Ue+Jb?MUJM*M?M.#/H "-S:
M#$6 "-S 6#: :-.& 2/3&".&A2#3& ;"-$&::2/4"&Z@2"&A
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
103/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
104/121
h-S 9#A 2: 23T
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
105/121
DECLARE
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
106/121
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 LOOPpnums(indx) := indx;
pnames(indx) := 'Product ' || TO_CHAR(indx);
END LOOP;
FORALL indx IN pnums.FIRST .. pnums.LAST
INSERT INTO productsVALUES (pnums(indx), pnames(indx));
END;
/
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
107/121
+"-Q%& 9H :@9"-@32/& $#%%W
/&%$01%& 23&
4%&501'%67#""
76+?< :;+;B 3%"--(3%)$5MO(#
6>+9= 86+;B 1J4 2$#R/-$
>+9? 6+9B 0(S X0$ 2G/)-. -(PU0$Y(%
>+;> 6+:B "00 ().$#
>>=;< 8@@=@A B0.#" ,&%$01%& 23&
KUU#(V/P")$0W 8>A>>> #(G2 U$# 2$-(%5
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
108/121
I&,-"&E#,3&" $-.;#"2:-/W
)&E0,&
4%&56
FG&,
4%&56H#IJ1-% 7#""
78>+6< 6>+9=
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
109/121
e:2/4 +*U()*
3- A- 36& N-9
-, # :2/4%& ()*
:3#3&.&/3
g
declarev_ct number := 0 ;
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
110/121
;cursor emp_cur isselect emp_id, salaryfrom wal_emps
where status = 'ACTIVE';beginfor rec in emp_cur loop
beginselect count(emp_id)into v_ct
from annual_bonuswhere emp_id = rec.emp_id;if v_ct > 0 then
update annual_bonus
set bonus_amt = rec.salary * .03where emp_id = rec.emp_id ;
elseinsert into annual_bonusvalues (rec.emp_id, rec.salary * .03);
end if;exception
when others thendbms_output.put_line (sqlerrm) ;
end ;
end loop ;end ;
5 32 Q%
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
111/121
5&:;-/:& 32.& ;"-Q%&
fsRsss "-S:t8tfu :&$-/A:
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
112/121
SQL> MERGE INTO annual_bonus B
2 USING (3 SELECT emp_id, salary4 FROM wal_emps5 WHERE status = 'ACTIVE') E6 ON (B.emp_id = E.emp_id)7 WHEN MATCHED THEN8 UPDATE SET B.bonus_amt = E.salary * 0.039 WHEN NOT MATCHED THEN10 INSERT (B.emp_id, B.bonus_amt)11 VALUES (E.emp_id, E.salary * 0.03)12 /
10000 rows merged.
5 32 Q%
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
113/121
5&:;-/:& 32.& ;"-Q%&
fsRsss "-S:f8vtm :&$-/A:
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
114/121
SQL> create table annual_bonus_2011 as
2 select emp_id, salary * .03 as bonus_amt3 from wal_emps4 where status = 'ACTIVE';
Table created.
5&:;-/:& 32.& ;"-Q%&
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
115/121
5&:;-/:& 32.& ;"-Q%&
fsRsss "-S:f8fmg :&$-/A:
EANTIPA
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
116/121
ATTER
N
PERFORMANCEANTIPATTER
N
PER
FORMAN
CEANTIPA
EANTIPAT
TERNPERFORM
ANCEANTIPATTER
N PERFORMA
NCEANTIPATTERN
PERFORMAN
!36&"K-..-/
b/32;#33&"/:
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
117/121
!36&" K-..-/ b/32;#33&"/:
?-- .@$6 ;#":2/4 X%23&"#%: D: 92/A:Y L5!e+2/4 -/ 3-- .#/H $-%@./: +#33&"/ .#3$62/4 *F[M ,-" %A2/4 S2%A$#"A: \-/:3&" Z@&"H K?M: 2/ D2&S X9@4Y !/& :2O& Q3: #%% D2&S:
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
118/121
1"#;Ee;
J-/G3 4&3 :3@$7 2/ # "@3 ?6&"& #"& .#/H S#H: 3- A- .-:3 &D&"H362/4w
*--7 ,-" $-..-/ ;#33&"/: X#/32;#33&"/:Y bD-2A "&;&A -" @//&$&::#"H S-"7 x-S
?&:3 #: .#/H -;32-/: #: ;-::29%& (-.&32.&: &D&/ 36& #/32;#33&"/ .#H S-"7 9&:3
2/ H-@" :;&$2Q$ $-/3&B3 b;;"-#$6 &D&"H ;"-9%&. 9H 9&2/4 -;&/ 3-
>-@3 -, 36& 9-B> 362/72/4
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
119/121
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
120/121
?6#/7
j-@w
-
8/12/2019 2014 05 20 Writing SQL Right Antipatterns
121/121
7#"&/.-"3-/89%-4:;-38$-.
7#"&/8.-"3-/=&/723&$8$-.
7#"&/