Tuning Queries Like A DB2 Developer
Tuning Queries Like A DB2 Developer
Tuning Queries Like A DB2 Developer
Jase Alpers
IBM Silicon Valley Lab
1
Disclaimer
Copyright IBM Corporation 2011. All rights reserved.
U.S. Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule
Contract with IBM Corp.
THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR INFORMATIONAL PURPOSES
ONLY. WHILE EFFORTS WERE MADE TO VERIFY THE COMPLETENESS AND ACCURACY OF THE
INFORMATION CONTAINED IN THIS PRESENTATION, IT IS PROVIDED AS IS WITHOUT WARRANTY OF
ANY KIND, EXPRESS OR IMPLIED. IN ADDITION, THIS INFORMATION IS BASED ON IBMS CURRENT
PRODUCT PLANS AND STRATEGY, WHICH ARE SUBJECT TO CHANGE BY IBM WITHOUT NOTICE. IBM
SHALL NOT BE RESPONSIBLE FOR ANY DAMAGES ARISING OUT OF THE USE OF, OR OTHERWISE
RELATED TO, THIS PRESENTATION OR ANY OTHER DOCUMENTATION. NOTHING CONTAINED IN THIS
PRESENTATION IS INTENDED TO, NOR SHALL HAVE THE EFFECT OF, CREATING ANY WARRANTIES OR
REPRESENTATIONS FROM IBM (OR ITS SUPPLIERS OR LICENSORS), OR ALTERING THE TERMS AND
CONDITIONS OF ANY AGREEMENT OR LICENSE GOVERNING THE USE OF IBM PRODUCTS AND/OR
SOFTWARE.
IBM, the IBM logo, ibm.com, and DB2 are trademarks or registered trademarks of International Business Machines Corporation in the
United States, other countries, or both. If these and other IBM trademarked terms are marked on their first occurrence in this information
with a trademark symbol ( or ), these symbols indicate U.S. registered or common law trademarks owned by IBM at the time this
information was published. Such trademarks may also be registered or common law trademarks in other countries. A current list of IBM
trademarks is available on the Web at Copyright and trademark information at www.ibm.com/legal/copytrade.shtml
Other company, product, or service names may be trademarks or service marks of others.
Ultimate goal:
Agenda
Automation available
Unformatted SQL,
where to start?
8
Separate sections
EXPLAIN PLAN SET QUERYNO = 1 FOR
SELECTDISTINCT ITEM.ITEM_NBR AS ITEM_NBR, ITEM.PRDT_ID,
STOREITEM.WK_STRT_DT AS WK_STRT_DT ,STOREITEM.DC_ID AS
DC_ID
FROM PROD.TIPA004_STITM_PROJ AS STOREITEM ,
PROD.TITM001_ITEM AS ITEM
WHERE ITEM.BUS_UNIT_ID = GS AND ITEM.BUS_UNIT_ID =
STOREITEM.BUS_UNIT_ID AND
ITEM.MJR_CATG_ID = '00754 AND
ITEM.INTMD_CATG_ID = '00043 AND ITEM.ITEM_NBR =
STOREITEM.ITEM_NBR AND ITEM.MJR_CATG_ID =
STOREITEM.MJR_CATG_ID AND ITEM.INTMD_CATG_ID =
STOREITEM.INTMD_CATG_ID AND STOREITEM.RTL_DEPT_NBR = 1
AND AD_ITEM_FLG = 'Y AND WK_STRT_DT = '2011-02-08';
Separate sections
EXPLAIN PLAN SET QUERYNO = 1 FOR
SELECT DISTINCT ITEM.ITEM_NBR AS ITEM_NBR, ITEM.PRDT_ID,
STOREITEM.WK_STRT_DT AS WK_STRT_DT ,STOREITEM.DC_ID AS
DC_ID
FROM PROD.TIPA004_STITM_PROJ AS STOREITEM
1 line per table,
,PROD.TITM001_ITEM AS ITEM
Lead with comma
WHERE ITEM.BUS_UNIT_ID = GS
AND
ITEM.BUS_UNIT_ID = STOREITEM.BUS_UNIT_ID
AND
ITEM.MJR_CATG_ID = '00754
AND
ITEM.INTMD_CATG_ID = '00043
AND
ITEM.ITEM_NBR = STOREITEM.ITEM_NBR
AND
STOREITEM.AD_ITEM_FLG = 'Y
1 line per predicate,
AND
ITEM.MJR_CATG_ID = STOREITEM.MJR_CATG_IDLead with AND
AND
ITEM.INTMD_CATG_ID = STOREITEM.INTMD_CATG_ID
AND
RTL_DEPT_NBR = 1
AND
WK_STRT_DT = '2011-02-08';
10
11
12
13
Table information
COLCARDF
LOW2KEY and HIGH2KEY
Frequency/histogram statistics
Observe where the filtering is
14
NPAGES
CARDF
15
Range predicates
SUBSTR(C1,1,1)='A'
Default FF of 1/25
16
18
Automation
Data Studio
Query formatting
19
Agenda
20
OR
What doesnt the optimizer know???
Before
Best performing
600 X slower
Optimizer Estimate
105
100
100
101
99
95
90
85
80
Before
Migration
Access Path 1
22
100
After Migration
Access Path 2
The problem?
After Rebind
Access path 2 cost improved from 101 to 99 msec
23
Frequency statistics
Correlation statistics
Histogram statistics
24
DATE(TIMESTAMP_COL) = '2011-02-01'
C1+C2 < 5
2012 IBM Corporation
Agenda
25
Query breakdown
SELECT
FROM
SETL_TRANS S
,BRANCH CUST
,BRANCH_ADDR A
WHERE S.ADV_ABA_R = ?
AND
S.PROCESS_DT < '9999-12-31
AND
S.TYPE_CD IN ('A', C, X)
AND
S.CLR_CYCLE_CD IN ('EOD', 'IMD, OPN)
AND
S.STLMT_DT = ?
AND
S.ACCT_NUM = CUST.ACCT_NUM
AND
CUST.CUST_EFCT_DT <= ?
AND
CUST.CUST_INACTV_DT > ?
AND
A.ACCT_NUM = CUST.ACCT_NUM
AND
A.CUST_EFCT_DT <= ?
AND
A.CUST_INACTV_DT > ?
AND
A.ADDR_TYP_CD = ' '
SELECT
FROM
SETL_TRANS S
,BRANCH CUST
,BRANCH_ADDR A
WHERE S.ADV_ABA_R = ?
AND
S.PROCESS_DT < 9999-12-31
AND
S.TYPE_CD IN ('A', 'C', X, Z)
AND
S.CLR_CYCLE_CD IN ('EOD', 'IMD, OPN)
AND
S.STLMT_DT = ?
AND
S.ACCT_NUM = CUST.ACCT_NUM
AND
CUST.CUST_EFCT_DT <= ?
AND
CUST.CUST_INACTV_DT > ?
AND
A.ACCT_NUM = CUST.ACCT_NUM
AND
A.CUST_EFCT_DT <= ?
AND
A.CUST_INACTV_DT > ?
AND
A.ADDR_TYP_CD = '
27
MAX DATE
MAX DATE
COL = blank
CUST.CUST_EFCT_DT <= ?
CUST.CUST_INACTV_DT > ?
AND
AND
A.CUST_EFCT_DT <= ?
A.CUST_INACTV_DT > ?
28
Embed statistics
SELECT
FROM
SETL_TRANS S
CARDF 1,600,254
NPAGES 21,627
,BRANCH CUST
CARDF 31,696
NPAGES 1132
,BRANCH_ADDR A
CARDF 58,627
NPAGES 2791
WHERE
S.ADV_ABA_R = ?
COLCARDF 19,712
AND S.PROCESS_DT < 9999-12-31
COLCARDF 11
LOW2KEY 2004-03-24
HIGH2KEY 2004-04-05
AND S.TYPE_CD IN ('A', 'C', X, Z)
COLCARDF 4
AND S.CLR_CYCLE_CD IN ('EOD', 'IMD', OPN')
COLCARDF 3
AND S.STLMT_DT = ?
COLCARDF 13
AND S.ACCT_NUM = CUST.ACCT_NUM
COLCARDF 15360 / 26,527
AND CUST.CUST_EFCT_DT <= ?
COLCARDF 2,496
LOW2KEY 1994-09-02
HIGH2KEY 2004-04-06
AND CUST.CUST_INACTV_DT > ?
COLCARDF 279
LOW2KEY 2004-03-04
HIGH2KEY 2004-04-07
AND A.ACCT_NUM = CUST.ACCT_NUM
COLCARDF 26,527 / 26,527
AND A.CUST_EFCT_DT <= ?
COLCARDF 2,496
LOW2KEY 1994-09-02
HIGH2KEY 2004-04-06
AND A.CUST_INACTV_DT > ?
COLCARDF 274
LOW2KEY 2004-03-04
HIGH2KEY 2004-04-07
AND A.ADDR_TYP_CD =
COLCARDF 5
29
SETL_TRANS S
CARDF 1,600,254
NPAGES 21,627
,BRANCH CUST
CARDF 31,696
NPAGES 1132
,BRANCH_ADDR A
CARDF 58,627
NPAGES 2791
WHERE
S.ADV_ABA_R = ?
COLCARDF 19,712
AND S.PROCESS_DT < 9999-12-31
COLCARDF 11
LOW2KEY 2004-03-24
HIGH2KEY 2004-04-05
AND S.TYPE_CD IN ('A', 'C', X, Z)
COLCARDF 4
AND S.CLR_CYCLE_CD IN ('EOD', 'IMD', OPN')
COLCARDF 3
AND S.STLMT_DT = ?
COLCARDF 13
AND S.ACCT_NUM = CUST.ACCT_NUM
COLCARDF 15360 / 26,527
AND CUST.CUST_EFCT_DT <= ?
COLCARDF 2,496
LOW2KEY 1994-09-02
HIGH2KEY 2004-04-06
AND CUST.CUST_INACTV_DT > ?
COLCARDF 279
LOW2KEY 2004-03-04
HIGH2KEY 2004-04-07
AND A.ACCT_NUM = CUST.ACCT_NUM
COLCARDF 26,527 / 26,527
AND A.CUST_EFCT_DT <= ?
COLCARDF 2,496
LOW2KEY 1994-09-02
HIGH2KEY 2004-04-06
AND A.CUST_INACTV_DT > ?
COLCARDF 274
LOW2KEY 2004-03-04
HIGH2KEY 2004-04-07
AND A.ADDR_TYP_CD =
COLCARDF 5
30
SETL_TRANS S
,BRANCH CUST
,BRANCH_ADDR A
WHERE
S.ADV_ABA_R = ?
AND S.PROCESS_DT < 9999-12-31
LOW2KEY 2004-03-24
CARDF 1,600,254
CARDF 31,696
CARDF 58,627
COLCARDF 19,712
COLCARDF 11
HIGH2KEY 2004-04-05
31
NPAGES 21,627
NPAGES 1132
NPAGES 2791
COLCARDF 4
COLCARDF 3
COLCARDF 13
COLCARDF 15360 / 26,527
COLCARDF 2,496
HIGH2KEY 2004-04-06
COLCARDF 279
HIGH2KEY 2004-04-07
COLCARDF 26,527 / 26,527
COLCARDF 2,496
HIGH2KEY 2004-04-06
COLCARDF 274
HIGH2KEY 2004-04-07
COLCARDF 5
SETL_TRANS S
CARDF 1,600,254
NPAGES 21,627
,BRANCH CUST
CARDF 31,696
NPAGES 1132
,BRANCH_ADDR A
CARDF 58,627
NPAGES 2791
WHERE
S.ADV_ABA_R = ?
COLCARDF 19,712
AND S.PROCESS_DT < 9999-12-31
COLCARDF 11
LOW2KEY 2004-03-24
HIGH2KEY 2004-04-05
AND S.TYPE_CD IN ('A', 'C', X, Z)
COLCARDF 4
AND S.CLR_CYCLE_CD IN ('EOD', 'IMD', OPN')
COLCARDF 3
AND S.STLMT_DT = ?
COLCARDF 13
AND S.ACCT_NUM = CUST.ACCT_NUM
COLCARDF 15360 / 26,527
AND CUST.CUST_EFCT_DT <= ?
COLCARDF 2,496
LOW2KEY 1994-09-02
HIGH2KEY 2004-04-06
AND CUST.CUST_INACTV_DT > ?
COLCARDF 279
LOW2KEY 2004-03-04
HIGH2KEY 2004-04-07
AND A.ACCT_NUM = CUST.ACCT_NUM
COLCARDF 26,527 / 26,527
AND A.CUST_EFCT_DT <= ?
COLCARDF 2,496
LOW2KEY 1994-09-02
HIGH2KEY 2004-04-06
AND A.CUST_INACTV_DT > ?
COLCARDF 274
LOW2KEY 2004-03-04
HIGH2KEY 2004-04-07
AND A.ADDR_TYP_CD =
COLCARDF 5
32
SETL_TRANS S
CARDF 1,600,254
NPAGES 21,627
,BRANCH CUST
CARDF 31,696
NPAGES 1132
,BRANCH_ADDR A
CARDF 58,627
NPAGES 2791
WHERE
S.ADV_ABA_R = ?
COLCARDF 19,712
AND S.PROCESS_DT < 9999-12-31
COLCARDF 11
LOW2KEY 2004-03-24
HIGH2KEY 2004-04-05
AND S.TYPE_CD IN ('A', 'C', X, Z)
COLCARDF 4
AND S.CLR_CYCLE_CD IN ('EOD', 'IMD', OPN')
COLCARDF 3
AND S.STLMT_DT = ?
COLCARDF 13
AND S.ACCT_NUM = CUST.ACCT_NUM
COLCARDF 15360 / 26,527
AND CUST.CUST_EFCT_DT <= ?
LOW2KEY 1994-09-02
AND CUST.CUST_INACTV_DT > ?
LOW2KEY 2004-03-04
AND A.ACCT_NUM = CUST.ACCT_NUM
AND A.CUST_EFCT_DT <= ?
LOW2KEY 1994-09-02
AND A.CUST_INACTV_DT > ?
LOW2KEY 2004-03-04
AND A.ADDR_TYP_CD =
33
COLCARDF 2,496
HIGH2KEY 2004-04-06
COLCARDF 279
HIGH2KEY 2004-04-07
COLCARDF 26,527 / 26,527
COLCARDF 2,496
HIGH2KEY 2004-04-06
COLCARDF 274
HIGH2KEY 2004-04-07
COLCARDF 5
>= 100,000,000
1 / 10,000
3 / 100,000
>= 10,000,000
1 / 3,000
1 / 10,000
>= 1,000,000
1 / 1,000
3 / 10,000
>= 100,000
1 / 300
1 / 1,000
>= 10,000
1 / 100
3 / 1,000
>= 1,000
1 / 30
1 / 100
>= 100
1 / 10
3 / 100
>= 2
1/3
1 / 10
1/3
1 / 10
=1
>= 0
COLCARDF 2,496
4) AND
CUST.CUST_INACTV_DT > ?
LOW2KEY 2004-03-04
HIGH2KEY 2004-04-07
ESTIMATED FF WITH LITERAL:
= 99%
ESTIMATE WITH MARKER:
1/10
= 10%
COLCARDF 279
5) AND
A.CUST_EFCT_DT <= ?
LOW2KEY 1994-09-02
HIGH2KEY 2004-04-06
ESTIMATED FF WITH LITERAL:
= 100%
ESTIMATE WITH MARKER:
1/30
= 3%
COLCARDF 2,496
6) AND
A.CUST_INACTV_DT
LOW2KEY 2004-03-04
ESTIMATED FF WITH LITERAL:
ESTIMATE WITH MARKER:
COLCARDF 274
35
> ?
HIGH2KEY 2004-04-07
= 99%
1/10
= 10%
( 97% error )
( 89% error )
( 97% error )
( 89% error )
36
WHERE
S.ADV_ABA_R = ?
COLCARDF 19,712
(Very selective predicate)
AND S.PROCESS_DT < 9999-12-31
COLCARDF 11
(This predicate doesnt filter anything, known from suspicious predicate analysis)
AND S.TYPE_CD IN ('A', 'C', X', Z')
COLCARDF 4
(In-list looking for 4 values, COLCARDF 4 not filtering)
AND S.CLR_CYCLE_CD IN ('EOD', 'IMD', OPN')
COLCARDF 3
(In-list looking for 3 values, COLCARDF 3 not filtering)
AND S.STLMT_DT = ?
COLCARDF 13
(COL = LIT, COLCARDF 13 somewhat filtering, but not great selectivity)
AND S.ACCT_NUM = CUST.ACCT_NUM
COLCARDF 15360 / 26,527
(For the range predicates, we know that optimizer PERCIEVES them to be selective but
In reality, they are not. This was determined during suspicious predicate analysis)
AND CUST.CUST_EFCT_DT <= ?
COLCARDF 2,496
AND CUST.CUST_INACTV_DT > ?
COLCARDF 279
AND A.ACCT_NUM = CUST.ACCT_NUM
COLCARDF 26,527 / 26,527
AND A.CUST_EFCT_DT <= ?
COLCARDF 2,496
AND A.CUST_INACTV_DT > ?
COLCARDF 274
AND A.ADDR_TYP_CD =
COLCARDF 5
(COL = blank. Probably this column is skewed on blank. COLCARDF 5, not typically
Very filtering)
37
t
ec
el
ts
os
M
SETL_TRANS S
CARDF 1,600,254
NPAGES 21,627
,BRANCH CUST
CARDF 31,696
NPAGES 1132
,BRANCH_ADDR A
CARDF 58,627
NPAGES 2791
WHERE
S.ADV_ABA_R = ?
COLCARDF 19,712
AND S.PROCESS_DT < 9999-12-31
COLCARDF 11
LOW2KEY 2004-03-24
HIGH2KEY 2004-04-05
AND S.TYPE_CD IN ('A', 'C', X', Z')
COLCARDF 4
AND S.CLR_CYCLE_CD IN ('EOD', 'IMD', OPN')
COLCARDF 3
AND S.STLMT_DT = ?
COLCARDF 13
AND S.ACCT_NUM = CUST.ACCT_NUM
COLCARDF 15360 / 26,527
AND CUST.CUST_EFCT_DT <= ?
COLCARDF 2,496
LOW2KEY 1994-09-02
HIGH2KEY 2004-04-06
AND CUST.CUST_INACTV_DT > ?
COLCARDF 279
LOW2KEY 2004-03-04 HIGH2KEY 2004-04-07
AND A.ACCT_NUM = CUST.ACCT_NUM
COLCARDF 26,527 / 26,527
AND A.CUST_EFCT_DT <= ?
COLCARDF 2,496
LOW2KEY 1994-09-02
HIGH2KEY 2004-04-06
AND A.CUST_INACTV_DT > ?
COLCARDF 274
LOW2KEY 2004-03-04
HIGH2KEY 2004-04-07
AND A.ADDR_TYP_CD =
COLCARDF 5
e
iv
by
r
fa
38
Index analysis
Available indexes
What join sequence they encourage
Analysis:
39
Identify indexes
Table: SETL_TRANS
INDEX IXSTRN01
(PROCESS_DT, CLR_CYCLE_CD, ADV_ABA_R, TYPE_CD, ACCT_NUM, STLMT_DT)
TABLE: BRANCH
INDEX: IXBRNC01
(CUST_INACTV_DT, CUST_EFCT_DT)
INDEX: IXBRNC02
(ACCT_NUM, CUST_EFCT_DT)
TABLE: BRANCH_ADDR
INDEX: IXBRAD01
(CUST_INACTV_DT, CUST_EFCT_DT)
INDEX: IXBRAD02
(ACCT_NUM, ADDR_TYP_CD, CUST_EFCT_DT)
40
SETL_TRANS
local predicate index analysis
SELECT
FROM
SETL_TRANS S
WHERE
S.ADV_ABA_R = ?
AND S.PROCESS_DT < 9999-12-31
AND S.TYPE_CD IN ('A', 'C', X, Z)
AND S.CLR_CYCLE_CD IN ('EOD', 'IMD', OPN')
AND S.STLMT_DT = ?
Indexes
Table: AJT_SETL_TRANS
INDEX IXSTRN01
(PROCESS_DT,
,CLR_CYCLE_CD
,ADV_ABA_R
,TYPE_CD
, ACCT_NUM
, STLMT_DT
)
41
CARDF 1,600,254
COLCARDF 19,712
COLCARDF 11
COLCARDF 4
COLCARDF 3
COLCARDF 13
NPAGES 21,627
SETL_TRANS
join index analysis
SELECT
FROM
SETL_TRANS S
WHERE
S.ADV_ABA_R = ?
AND S.PROCESS_DT < 9999-12-31
AND S.TYPE_CD IN ('A', 'C', X, Z)
AND S.CLR_CYCLE_CD IN ('EOD', 'IMD', OPN')
AND S.STLMT_DT = ?
AND S.ACCT_NUM = CUST.ACCT_NUM
AND S.ACCT_NUM = A.ACCT_NUM
Indexes
Table: AJT_SETL_TRANS
INDEX IXSTRN01
(PROCESS_DT,
,CLR_CYCLE_CD
,ADV_ABA_R
,TYPE_CD
, ACCT_NUM
, STLMT_DT
)
42
CARDF 1,600,254
COLCARDF 19,712
COLCARDF 11
COLCARDF 4
COLCARDF 3
COLCARDF 13
COLCARDF 15,360 / 26,527
COLCARDF 15,360 / 26,527
NPAGES 21,627
BRANCH
local predicate analysis
SELECT
FROM
,BRANCH CUST
WHERE
Indexes:
INDEX: IXBRNC01
(CUST_INACTV_DT
, CUST_EFCT_DT
)
INDEX IXBRNC02
(ACCT_NUM
,CUST_EFCT_DT
)
43
BRANCH
join predicate analysis
SELECT
FROM
,BRANCH CUST
WHERE
Indexes:
INDEX: IXBRNC01
(CUST_INACTV_DT
, CUST_EFCT_DT
)
INDEX IXBRNC02
(ACCT_NUM
,CUST_EFCT_DT
)
44
BRANCH_ADDR
local predicate analysis
SELECT
FROM
,BRANCH_ADDR A
WHERE
Indexes:
INDEX: IXBRAD01
(CUST_INACTV_DT
, CUST_EFCT_DT
)
INDEX: IXBRAD02
(ACCT_NUM
, ADDR_TYP_CD
, CUST_EFCT_DT
)
45
BRANCH_ADDR
join predicate analysis
SELECT
FROM
,BRANCH_ADDR A
WHERE
CARDF 58,627
NPAGES 2791
COLCARDF 2,496
COLCARDF 274
COLCARDF 5
COLCARDF 15,360 / 26,527
COLCARDF 15,360 / 26,527
Indexes:
INDEX: IXBRAD01
(CUST_INACTV_DT
, CUST_EFCT_DT
)
No join support
High estimated filtering, poor actual filtering range predicate
High estimated filtering, poor actual filtering range predicate
INDEX: IXBRAD02
(ACCT_NUM
, ADDR_TYP_CD
, CUST_EFCT_DT
)
46
TABLE: BRANCH_ADDR
NPAGES 2791
CARDF 58,627
INDEX:
IXBRAD01
(CUST_INACTV_DT, CUST_EFCT_DT)
INDEX:
IXBRAD02
(ACCT_NUM, ADDR_TYP_CD, CUST_EFCT_DT)
Key:
RED = Range predicate, stops matching
BLUE: Join predicate
PURPLE: Local equals predicate / in-list
47
x
de
in
st n
or sca
, w st s!
le u w
ab M ro
t t s. on
es on lli
gg pti mi
Bi O 1.6
TABLE: BRANCH
CARDF 31,696
INDEX: IXBRNC02
(CUST_INACTV_DT, CUST_EFCT_DT)
INDEX: IXBRNC01
(ACCT_NUM, CUST_EFCT_DT)
SETL_TRANS
join index analysis
SELECT
FROM
SETL_TRANS S
WHERE
S.ADV_ABA_R = ?
AND S.PROCESS_DT < 9999-12-31
AND S.TYPE_CD IN ('A', 'C', X, Z)
AND S.CLR_CYCLE_CD IN ('EOD', 'IMD', OPN')
AND S.STLMT_DT = ?
AND S.ACCT_NUM = CUST.ACCT_NUM
AND S.ACCT_NUM = A.ACCT_NUM
CARDF 1,600,254
COLCARDF 19,712
COLCARDF 11
COLCARDF 4
COLCARDF 3
COLCARDF 13
COLCARDF 15,360 / 26,527
COLCARDF 15,360 / 26,527
NPAGES 21,627
Candidate indexes
Table: AJT_SETL_TRANS
INDEX opt_1
(ADV_ABA_R
, STLMT_DT
, ACCT_NUM)
48
Resolution:
49
Providing new index on SETL_TRANS should provide more stable, faster access
than ever before
REOPT, or providing literal values avoids the disaster without new index
Agenda
50
51
Running statistics
Applying maintenance
Upgrading DB2
CARDF = 137,526,126
COLCARDF = 162332
FF = 0.1%
COLCARDF = 203254
COLCARDF = 6
COLCARDF = 92
COLCARDF = 2
COLCARDF = 104832
FF = 0.1%
COLCARDF = 2
COLCARDF = 2
COLCARDF = 5
Actual filtering
What values are used for the parameter markers when the query performs
poorly?
Estimated FF
Actual FF
LEVEL_ID
0.1%
102642/137526126 = 0.07%
GROUP_CODE
0.1%
137526126/137526126 = 100%
53
Solutions
If the predicate doesn't filter any data, don't include it in the query
Provide the actual value for optimization
REOPT
Optimization hint
Query trick
54
CARDF = 941360
NPAGES = 7583
CARDF = 521876
NPAGES = 43033
COLCARDF = 521
COLCARDF = 10
L2K / H2K = 31 / 89
COLCARDF = 25
COLCARDF = 23226
Suspicious predicates
SELECT ...
FROM T02907 T07
INNER JOIN F02951 T51
WHERE T07.TMA = ?
AND T51.INIT_STATUS_CD BETWEEN '030' AND '089'
AND T51.STATUS_CD IN ('5','7')
AND T51.ORG LIKE ?
ORDER BY T07.NBR;
CARDF = 941360
NPAGES = 7583
CARDF = 521876
NPAGES = 43033
COLCARDF = 521
COLCARDF = 10
L2K / H2K = 31 / 89
COLCARDF = 25
COLCARDF = 23226
56
CARDF = 941360
NPAGES = 7583
CARDF = 521876
NPAGES = 43033
COLCARDF = 521
FF = 1/521 = 0.2%
COLCARDF = 10
L2K / H2K = 31 / 89
FF ~= 100%
COLCARDF =52
FF = 2/52 = 3%
COLCARDF = 23226
FF = 0.3%
ORDER BY T07.NBR;
57
Estimated FF
Actual FF
T07
0.2%
1885/941360 = 0.2%
T51
0.3% * 3% = 0.009%
347821/521876 = 66%
58
+--------------------------+
|
STATUS_CD |
|
+--------------------------+
1_| 7
|
398456 | 76.3%
2_| F
|
76504 | 14.7%
3_| A
|
32451 | 6.2%
4_| J
|
6872 | 1.3%
5_| L
|
2144 | 0.4%
42_| 5
|
23 | 0.004%
only top 5 of 52 shown (plus value of 5)
Estimated FF
Actual FF
INIT_STATUS_CD
~100%
521876/521876 = 100%
ORG
0.3%
421001/521876 = 80.6%
STATUS_CD
3%
(398456+23)/521876 = 76.3%
59
CARDF = 941360
NPAGES = 7583
CARDF = 521876
NPAGES = 43033
COLCARDF = 521
Estimated FF = 1/521 = 0.2%
Actual FF = 0.2%
COLCARDF = 10
L2K / H2K = 31 / 89
Estimated FF ~= 100%
Actual FF = 100%
COLCARDF =52
Estimated FF = 2/52 = 3%
Actual FF = 76.3%
COLCARDF = 23226
FF = 0.3%
Actual FF = 80.6%
ORDER BY T07.NBR;
Problems
60
Solution
Does solving the problem on column STATUS_CD provide a stable access path
without the overhead of REOPT?
61
If you dont know perform counts to find out if estimates are accurate
If you dont know how selective things are, how will you know what the best path should be?
If not, you should have better understanding of what makes other access paths competitive, tuning can be
more targeted
Skilled targeted tuning is less susceptible to regression than blind tuning (where problem is not understood)
62
Jase Alpers
IBM
alpersj@us.ibm.com
63