2014 05 20 writing sql right antipatterns

Upload: olivier-bernhard

Post on 03-Jun-2018

222 views

Category:

Documents


0 download

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#"&/