Static SQL and Access Path Review

advertisement
Static SQL and Access Path Review
Tips and Tricks
Paul Walters
Sallie Mae Inc.
Paul.A.Walters@Salliemae.com
Session Code: E05
May 12, 2010 • 08:30 a.m. – 9:30a.m.
Platform: DB2 zOS
Agenda
• Managing Change
• Data to Review





•
•
•
•
Plan Tables
Objects
Statistics
SQL Statements
Key Indicators
Statistics and System Changes
Application Changes
Best Practices
Plan Stability DB2 V9
Brief History
• How did we get here?
Managing Change – Types of Changes &
Preserving Performance
•
•
•
•
•
DB2 Changes
ZPARM Changes
Statistics Changes
DDL Changes
Application Changes
Plan Tables to the Rescue
E
Basic Explain
DSNWFQB##
DSNBFQB##
DSNVT##/V9
QUERYNO
O
Explain Information by Object
Explain Information by Object
A
Explain information by Access
SELECT *
FROM SYSIBM.SYSDUMMY1
WHERE 1 = 2
Explain information by Access
A Complete Picture
Program Execution
Function
Catalog Statistic
PT
Plan Tables (Most familiar)
• PLAN_TABLE
DB2 V9 adds
PARENT_PLANNO
 Contains most of the access path selection information that was
gathered when the package was bound with EXPLAIN(YES).
• DSN_STATEMNT_TABLE
DB2 V9 adds a
TOTAL_COST
 Contains COST_CATEGORY, REASON AND costing information
PROCSU, PROCMS. The costing numbers are ESTIMATED and
can very widely with changes to DB2.
Plan Tables (Continued)
• DSN_FILTER_TABLE
 Contains information on what stage the predicate is processed
(MATCHING, SCREENING, STAGE1 and STAGE2).
• DSN_PREDICAT_TABLE
 Contains FILTERFACTOR, BOOLEAN_TERM indicator and the
actual predicate text.
• DSN_DETCOST_TABLE
 Contains detailed cost information (COMPCOST) at each step of
the access path (mini plan), an estimate on the number of rows
that will be returned after the local predicates are applied
(ONECOMPROW) and an estimate of rows returned from DM and
Q
RDS (DMROWS,RDSROW).
DSN_FILTER_TABLE/DSN_PREDICAT_TABLE
DSN_FILTER_TABLE/DSN_PREDICAT_TABLE
DSN_PREDICAT_TABLE
• DSN_PREDICAT_TABLE and SYSCOLUMNS and
SYSKEYS provide information helpful for index review
DSN_DETCOST_TABLE
DSN_DETCOST_TABLE
OT
Plan Tables (Continued)
• DSN_VIRTUAL_INDEXES
 This table allows for the creation or deletion of indexes virtually.
This enables a query to be explained with the virtual change.
• 10 other EXPLAIN Tables
 The additional tables support Explain statements from the
dynamic statement cache, sort operations or other Explain
details.
SQL Statements and Source Code
Objects
Object Structure and Buffer Pool Assignments
Statistics
DB2 Statistics and Real Time Statistics
Package Execution/Function
Managing Change:
Statistics and System Changes
• DB2 V9 Enhancements that require rebinds:
 Puffing of the runtime structures – especially with
RELEASE(COMMIT)
 Required to reestablish SPROCs (with no rebind a 0-10%
performance penalty )
 Virtual Storage Constraint Relief
 Global Query Optimization
 Sort Avoidance with Distinct and
Group By
You bought it might as well drive it
Managing Change:
Statistics and System Changes
• Impacts on Access Path Selection
Release Guide
Hold Data
• Identification
 Model a Control set of structures
Off Production
 Copy Production DBRMS
 Bind Before and After Maintenance
 Review Changes
PROCMS
PROCSU
Managing Change:
Statistics and System Changes
I001 No Change
W001 C<P Steps
W002 C>P Steps
W005 Change
W003 C<P Stmts
W004 C>P Stmts
W006 New Package
Managing Change:
Statistics and System Changes
• Managing Rebinds During Upgrades
 Wait until the upgrade is stabilized
 Rebind the safe and improved packages with PLANMGMT
 Execute RUNSTATS – focus on heavily used objects, watch
for changes in CLUSTERRATIOF, use “_HIST” tables
 Check Access Path Changes with new statistics
 Rebind Previously Untouched Packages
 Rebind packages bound before new statistics were
collected
P
E
R
F
O
R
M
A
N
C
E
Managing Change:
Application changes
• New/Changed Packages
 New programs Require top down review
 Changed Programs – look for new objects and/or access path
changes
I001 No Change
W001 C<P Steps
W002 C>P Steps
W003 C<P Stmts
W004 C>P Stmts
W005 Change
W006 New Package
• New/Changed Objects
Plan Stability DB2 V9
• Provides a backup of a access path that can be used for
fallback
• Enabled Globally with ZPARM PLNMGNT or at bind time
with PLNMGNT option.







Information Stored in SPT01 and SYSPACKDEP
Rebind Switch
Each Copy is Separately Invalidated
Only Current information is stored in SYSPACKAGE
Dependant versions recorded in SYSPACKDEP(DTYPE P,O)
Can only replace the entire package
How Stale is the Original Copy
• DB2 Hints are still Relevant
Other DB2 V9 Changes
•
•
•
•
•
Virtual Indexes – available via APAR in V8 (PK46687)
Unicode Plan Tables (PK85068)
New Explain Sub-Query Parent Query Block
Visual Explain is Deprecated in DB2 V9
Optimization Service Center (OSC) Deprecated in the
next Release of DB2
• IBM Data Studio is the replacement for OSC
Best Practices
• Explain(YES)
• Regular Review
• Know Your Applications
WITH STMT1(COLLID,PROGNAME,BIND_TIME) AS
(SELECT COLLID,NAME,MAX(BINDTIME)
FROM SYSIBM.SYSPACKAGE
WHERE LOCATION = ' '
AND BINDTIME > CURRENT TIMESTAMP - 84 HOURS
Identify Packages BINDTIME
AND TYPE <> 'T' AND EXPLAIN = 'Y'
with Explain Yes and
AND (COLLID LIKE 'PLSF%')
The previous BIND_TIME from
GROUP BY COLLID,NAME )
theAS
Plan_Table
,STMT2(COLLID,PROGNAME,BIND_TIME)
(SELECT S1.COLLID,S1.PROGNAME,
COALESCE(MAX(PT.BIND_TIME),'0001-01-01-00.00.00.000000')
FROM PDBA0.PLAN_TABLE AS PT, STMT1 AS S1
WHERE PT.COLLID = S1.COLLID
AND PT.PROGNAME = S1.PROGNAME
AND PT.BIND_TIME < S1.BIND_TIME
AND PT.OPTHINT = ' '
GROUP BY S1.COLLID,S1.PROGNAME)
,STMT_REV(COLLID,PROGNAME,BIND_TIME,CSCNT,CPCNT,
PSCNT,PPCNT,WARNING) AS
(SELECT COLLID,PROGNAME,BIND_TIME
,SUM(CSCNT) AS CSCNT ,SUM(CPCNT) AS CPCNT
,SUM(PSCNT) AS PSCNT ,SUM(PPCNT) AS PPCNT
,CASE WHEN SUM(PSCNT) = 0
THEN 'W006'
WHEN SUM(CSCNT) > SUM(PSCNT) THEN 'W004'
WHEN SUM(CSCNT) < SUM(PSCNT) THEN 'W003'
WHEN SUM(CPCNT) > SUM(PPCNT) THEN 'W002'
First CutWHEN SUM(CPCNT) < SUM(PPCNT) THEN 'W001'
W001ELSE
C<PNULL
Steps END AS WARNING FROM
W002 C>P Steps
W003 C<P Stmts
W004 C>P Stmts
W006 New Package
(SELECT S1.COLLID,S1.PROGNAME,S1.BIND_TIME
,COUNT(DISTINCT QUERYNO) AS CSCNT,COUNT(*) AS CPCNT
,0 AS PSCNT ,0 AS PPCNT
Total Steps and
FROM STMT1 AS S1, PDBA0.PLAN_TABLE AS PT
Statements from
WHERE PT.PROGNAME = S1.PROGNAME
AND PT.COLLID = S1.COLLID
the Current and
AND PT.BIND_TIME = S1.BIND_TIME AND PT.OPTHINT = ' '
Previous Explain
GROUP BY S1.COLLID,S1.PROGNAME,S1.BIND_TIME
output
UNION ALL
SELECT S1.COLLID,S1.PROGNAME,S1.BIND_TIME
,0 AS CSCNT ,0 AS CPCNT
,COUNT(DISTINCT QUERYNO) AS PSCNT ,COUNT(*) AS PPCNT
FROM STMT1 AS S1, STMT2 AS S2, PDBA0.PLAN_TABLE AS PT
WHERE PT.PROGNAME = S2.PROGNAME
AND PT.COLLID = S2.COLLID
AND S1.PROGNAME = S2.PROGNAME
AND S1.COLLID = S2.COLLID
AND PT.BIND_TIME = S2.BIND_TIME AND PT.OPTHINT = ' '
GROUP BY S1.COLLID,S1.PROGNAME,S1.BIND_TIME ) AS DATA
GROUP BY COLLID,PROGNAME,BIND_TIME)
,CDATA(COLLID,PROGNAME,BIND_TIME,
SEQ ,QUERYNO,QBLOCKNO,PLANNO,MIXOPSEQ,DATA) AS
(SELECT S1.COLLID,S1.PROGNAME,S1.BIND_TIME,
CSEQ.SEQ ,QUERYNO ,QBLOCKNO ,PLANNO ,MIXOPSEQ,
{COLUMN1 CONCAT COLUMN2….}
Select the
FROM STMT1 AS S1, PDBA0.PLAN_TABLE AS PT,
Current
TABLE (SELECT COUNT(*)+1 AS SEQ
Explain Data
FROM PDBA0.PLAN_TABLE AS PT1
with a New
WHERE PT.PROGNAME = PT1.PROGNAME
AND PT.COLLID = PT1.COLLID
Sequence
AND PT.BIND_TIME = PT1.BIND_TIME
Number
AND PT.OPTHINT = PT1.OPTHINT
AND DIGITS(PT.QUERYNO) CONCAT DIGITS(PT.QBLOCKNO) CONCAT
DIGITS(PT.PLANNO) CONCAT DIGITS(PT.MIXOPSEQ) >
DIGITS(PT1.QUERYNO) CONCAT DIGITS(PT1.QBLOCKNO) CONCAT
DIGITS(PT1.PLANNO) CONCAT DIGITS(PT1.MIXOPSEQ) ) AS CSEQ
WHERE PT.PROGNAME = S1.PROGNAME
AND PT.COLLID = S1.COLLID
AND PT.BIND_TIME = S1.BIND_TIME
AND PT.OPTHINT = ' ')
,PDATA(COLLID,PROGNAME,
SEQ ,QUERYNO ,QBLOCKNO ,PLANNO ,MIXOPSEQ, DATA) AS
(SELECT S2.COLLID,S2.PROGNAME,
PSEQ.SEQ ,QUERYNO ,QBLOCKNO ,PLANNO ,MIXOPSEQ ,
{COLUMN1 CONCAT COLUMN2….}
Select the
FROM STMT2 AS S2, PDBA0.PLAN_TABLE AS PT,
Previous
TABLE (SELECT COUNT(*)+1 AS SEQ
Explain Data
FROM PDBA0.PLAN_TABLE AS PT1
with a New
WHERE PT.PROGNAME = PT1.PROGNAME
AND PT.COLLID = PT1.COLLID
Sequence
AND PT.BIND_TIME = PT1.BIND_TIME
Number
AND PT.OPTHINT = PT1.OPTHINT
AND DIGITS(PT.QUERYNO) CONCAT DIGITS(PT.QBLOCKNO) CONCAT
DIGITS(PT.PLANNO) CONCAT DIGITS(PT.MIXOPSEQ) >
DIGITS(PT1.QUERYNO) CONCAT DIGITS(PT1.QBLOCKNO) CONCAT
DIGITS(PT1.PLANNO) CONCAT DIGITS(PT1.MIXOPSEQ) ) AS PSEQ
WHERE PT.PROGNAME = S2.PROGNAME
AND PT.COLLID = S2.COLLID
AND PT.BIND_TIME = S2.BIND_TIME
AND PT.OPTHINT = ' ')
SELECT CHAR(C.COLLID,10) AS COLLID ,CHAR(C.PROGNAME,10) AS PROGNAME
C.BIND_TIME,
CASE WHEN SR.WARNING IS NULL AND C.DATA <> P.DATA THEN C.SEQ
ELSE 0 END AS SEQ,
CASE WHEN SR.WARNING IS NULL AND C.DATA <> P.DATA THEN 'W005'
ELSE SR.WARNING END AS WARNING
,SR.CSCNT,SR.CPCNT, SR.PSCNT,SR.PPCNT,
CASE WHEN SR.WARNING IS NULL AND C.DATA <> P.DATA THEN C.QUERYNO
ELSE 0 END AS QUERYNO,
CASE WHEN SR.WARNING IS NULL AND C.DATA <> P.DATA THEN C.QBLOCKNO
ELSE 0 END AS QBLOCKNO,
CASE WHEN SR.WARNING IS NULL AND C.DATA <> P.DATA THEN C.PLANNO
ELSE 0 END AS PLANNO,
CASE WHEN SR.WARNING IS NULL AND C.DATA <> P.DATA THEN C.MIXOPSEQ
ELSE 0 END AS MIXOPSEQ FROM CDATA AS C
LEFT OUTER JOIN PDATA AS P ON P.COLLID = C.COLLID
AND
P.PROGNAME = C.PROGNAME AND P.SEQ
= C.SEQ
INNER JOIN STMT_REV AS SR ON SR.COLLID = C.COLLID
AND
SR.PROGNAME = C.PROGNAME AND SR.BIND_TIME = C.BIND_TIME
WHERE (C.DATA <> P.DATA OR WARNING IS NOT NULL)
UNION
SELECT CHAR(C.COLLID,10) AS COLLID ,CHAR(C.PROGNAME,10) AS PROGNAME,
C.BIND_TIME
,0 AS SEQ, 'I001' AS WARNING ,SR.CSCNT,SR.PSCNT, SR.CPCNT,SR.PPCNT
, 0 AS QUERYNO, 0 AS QBLOCKNO, 0 AS PLANNO, 0 AS MIXOPSEQ
FROM CDATA AS C
INNER JOIN STMT_REV AS SR ON
SR.COLLID = C.COLLID
AND
UNION the
SR.PROGNAME = C.PROGNAME AND
SR.BIND_TIME = C.BIND_TIME
Remainder/Un
WHERE WARNING IS NULL
changed
AND NOT EXISTS (SELECT 1
Packages
FROM PDATA AS P
WHERE P.COLLID = C.COLLID
AND
P.PROGNAME = C.PROGNAME AND
P.SEQ
= C.SEQ
AND
P.DATA
<> C.DATA)
ORDER BY 3
DESC
FOR FETCH ONLY WITH UR
Reference Material
• Redbooks
 Data Integrity with DB2 for z/OS
 DB2 9 for z/OS Performance Topics
• Manuals
 DB2 V9 Performance Monitoring and Tuning Guide
• Web
 DB2 for z/OS Exchange at IBM.COM
 WWW.IDUG.ORG
Session: E05
Static SQL and Access Path Review
Tips and Tricks
Paul Walters
Sallie Mae Inc.
Paul.A.Walters@Salliemae.com
Download