1 1
SQL Performance and Tuning
SQL Performance and Tuning
DB2 Relational Database
DB2 Relational Database
2 2
Course Overview
Course Overview
The DB2 Optimizer
The DB2 Optimizer
SQL Coding Strategies and Guidelines
SQL Coding Strategies and Guidelines
DB2 Catalog
DB2 Catalog
Filter Factors for Predicates
Filter Factors for Predicates
Runstats and Reorg Utilities
Runstats and Reorg Utilities
DB2 Explain
DB2 Explain
DB2 Insight
DB2 Insight
3 3
The DB2 Optimizer
The DB2 Optimizer
Determines database navigation
Determines database navigation
Parses
Parses
SQL statements
SQL statements
for tables and
for tables and
columns which must be accessed
columns which must be accessed
Queries
Queries
statistics
statistics
from DB2 Catalog
from DB2 Catalog
(populated by RUNSTATS utility)
(populated by RUNSTATS utility)
Determines least expensive
Determines least expensive
access
access
path
path
Since it is a
Since it is a
Cost
Cost
-
-
Based Optimizer
Based Optimizer
-
-
it
it
chooses
chooses
the lease expensive access
the lease expensive access
path
path
4 4
The DB2 Optimizer
The DB2 Optimizer
SQL
Optimized
Access
Path
DB2 Optimizer
Cost - Based
Query
Cost
Formulas
DB2
Catalog
5 5
Optimizer Access Path Selection
Optimizer Access Path Selection
1. Gets the current statistics from
1. Gets the current statistics from
DB2
DB2
catalog
catalog
for the columns and tables
for the columns and tables
identified in the SQL statements. These
identified in the SQL statements. These
statistics are populated by the
statistics are populated by the
Runstats
Runstats
utility.
utility.
2. Computes the estimated percentage of
2. Computes the estimated percentage of
qualified rows for each predicate
qualified rows for each predicate
-
-
which
which
becomes the
becomes the
filter factor
filter factor
for the predicate.
for the predicate.
6 6
Optimizer Access Path Selection
Optimizer Access Path Selection
3. Chooses a
3. Chooses a
set
set
of reasonable
of reasonable
access
access
paths
paths
.
.
4. Computes each potential access path
4. Computes each potential access path
s
s
estimated cost
estimated cost
based on:
based on:
CPU Cost
CPU Cost
I/O Cost
I/O Cost
7 7
Access Path Cost Based On:
Access Path Cost Based On:
CPU Cost
CPU Cost
Applying predicates (Stage 1 or Stage 2) Applying predicates (Stage 1 or Stage 2)
Traversing pages (index and tablespace) Traversing pages (index and tablespace)
Sorting Sorting
I/O Cost
I/O Cost
DB2 Catalog statistics DB2 Catalog statistics
Size of the bufferpools Size of the bufferpools
Cost of work files used (sorts, intermediate results, Cost of work files used (sorts, intermediate results,
and so on) and so on)
8 8
Will a Scan or an Index Be
Will a Scan or an Index Be
Used?
Used?
A tablespace Scan sequentially reads
A tablespace Scan sequentially reads
all
all
of the
of the
tablespace pages for the table being
tablespace pages for the table being
accessed.
accessed.
Most of the time, the fastest way to access DB2
Most of the time, the fastest way to access DB2
data is with an Index. For DB2 to consider
data is with an Index. For DB2 to consider
using an index
using an index
-
-
the following criteria must be
the following criteria must be
met:
met:
At least one of the predicates for the SQL
At least one of the predicates for the SQL
statement must be indexable.
statement must be indexable.
One of the columns (in any indexable
One of the columns (in any indexable
predicate) must exist as a column in an
predicate) must exist as a column in an
available index.
available index.
9 9
Will a Scan or an Index Be
Will a Scan or an Index Be
Used?
Used?
An index will
An index will
not
not
be used in these
be used in these
circumstances:
circumstances:
When no indexes exist for the table and
When no indexes exist for the table and
columns being accessed
columns being accessed
When the optimizer determines that the query
When the optimizer determines that the query
can be executed more efficiently without
can be executed more efficiently without
using an index
using an index
-
-
the table has a small number of rows or
the table has a small number of rows or
using the existing indexes might require
using the existing indexes might require
additional I/O
additional I/O
-
-
based on the cardinality of
based on the cardinality of
the index and the cluster ratio of the index.
the index and the cluster ratio of the index.
10 10
Types of Indexed Access
Types of Indexed Access
Direct Index Lookup
Direct Index Lookup
values must be provided for each column in the index values must be provided for each column in the index
Matching Index Scan (absolute positioning)
Matching Index Scan (absolute positioning)
can be used if the high order column (first column) of an index can be used if the high order column (first column) of an index
key is provided key is provided
Nonmatching Index Scan (relative
Nonmatching Index Scan (relative
positioning)
positioning)
can be used if the first column of the index is not provided can be used if the first column of the index is not provided
can be used for non can be used for non- -clustered indexes clustered indexes
can be used to maintain data in a particular order to satisfy th can be used to maintain data in a particular order to satisfy the e
ORDER BY or GROUP BY ORDER BY or GROUP BY
Index Only Access
Index Only Access
can be used with if a value is supplied for all index columns can be used with if a value is supplied for all index columns - -
avoids reading data pages completely avoids reading data pages completely
11 11
Sequential Prefetch
Sequential Prefetch
A read
A read
-
-
ahead mechanism invoked to prefill
ahead mechanism invoked to prefill
DB2
DB2
s buffers so that data is already in
s buffers so that data is already in
memory before it is requested. Can be
memory before it is requested. Can be
requested by DB2 under any of these
requested by DB2 under any of these
circumstances:
circumstances:
A tablespace scan of more than one page
A tablespace scan of more than one page
An index scan in which the data is
An index scan in which the data is
clustered and DB2 determines that eight or
clustered and DB2 determines that eight or
more pages must be accessed.
more pages must be accessed.
An index
An index
-
-
only scan in which DB2 estimates
only scan in which DB2 estimates
that eight or more leaf pages must be
that eight or more leaf pages must be
accessed
accessed
12 12
Database Services Address
Database Services Address
Space
Space
The DBAS, or Database Services Address
The DBAS, or Database Services Address
Space, provides the facility for the
Space, provides the facility for the
manipulation of DB2 data structures. The
manipulation of DB2 data structures. The
DBAS consists of three components:
DBAS consists of three components:
Relational Data System (RDS)
Relational Data System (RDS)
Set
Set
-
-
Level Orientation
Level Orientation
Stage 2 predicates
Stage 2 predicates
SQL statement checking
SQL statement checking
Sorting
Sorting
Optimizer
Optimizer
13 13
Database Services Address
Database Services Address
Space
Space
Data Manager (DM)
Data Manager (DM)
Row
Row
-
-
Level Orientation
Level Orientation
Stage 1 predicates
Stage 1 predicates
Indexable predicates
Indexable predicates
Locking
Locking
Various data manipulations
Various data manipulations
Buffer Manager (BM)
Buffer Manager (BM)
Physical Data Access
Physical Data Access
Data movement to and from DASD ,
Data movement to and from DASD ,
Bufferpools
Bufferpools
14 14
Database Services Address
Database Services Address
Space
Space
Relational
Data Manager
Data
Manager
Buffer
Manager
SQL
Optimized
SQL
Read Buffer
or
Request data
Results
Apply stage 2
predicates
and sort data
Apply stage 1
predicates
Data
15 15
Database Services Address
Database Services Address
Space
Space
When an SQL statement requesting a set of columns When an SQL statement requesting a set of columns
and rows is passed to the RDS, the RDS determines and rows is passed to the RDS, the RDS determines
the best mechanism for satisfying the request. The the best mechanism for satisfying the request. The
RDS can parse an SQL statement and determine its RDS can parse an SQL statement and determine its
needs. needs.
When the RDS receives an SQL statement, it When the RDS receives an SQL statement, it
performs these steps: performs these steps:
1. Checks authorization 1. Checks authorization
2. Resolves data element names into internal 2. Resolves data element names into internal
identifiers identifiers
3. Checks the syntax of the SQL statement 3. Checks the syntax of the SQL statement
4. Optimizes the SQL statement and generates an 4. Optimizes the SQL statement and generates an
access path access path
16 16
Database Services Address
Database Services Address
Space
Space
The RDS then passes the optimized SQL statement The RDS then passes the optimized SQL statement
to the Data Manager for further processing. to the Data Manager for further processing.
The function of the DM is to lower the level of data The function of the DM is to lower the level of data
that is being operated on. The DM analyzes the that is being operated on. The DM analyzes the
request for table rows or index rows of data and then request for table rows or index rows of data and then
calls the Buffer Manager to satisfy the request. calls the Buffer Manager to satisfy the request.
The Buffer Manager accesses data for other DB2 The Buffer Manager accesses data for other DB2
components. It uses pools of memory set aside for components. It uses pools of memory set aside for
the storage of frequently accessed data to create an the storage of frequently accessed data to create an
efficient data access environment. efficient data access environment.
17 17
Database Services Address
Database Services Address
Space
Space
The BM determines if the data is in the
The BM determines if the data is in the
bufferpool already. If so
bufferpool already. If so
-
-
the BM accesses
the BM accesses
the data and send it to the DM. If not
the data and send it to the DM. If not
-
-
it calls
it calls
the VSAM Media Manager to read and send
the VSAM Media Manager to read and send
back the data to the BM, so it can be sent to
back the data to the BM, so it can be sent to
the DM.
the DM.
The DM receives the data and applies as
The DM receives the data and applies as
many predicates as possible to reduce the
many predicates as possible to reduce the
answer set. Only Stage 1 predicates are
answer set. Only Stage 1 predicates are
applied in the DM.
applied in the DM.
18 18
Database Services Address
Database Services Address
Space
Space
Finally, the RDS receives the data from the
Finally, the RDS receives the data from the
DM. All Stage 2 predicates are applied, the
DM. All Stage 2 predicates are applied, the
necessary sorting is performed, and the
necessary sorting is performed, and the
results are returned to the requestor.
results are returned to the requestor.
Considering these steps, realize
Considering these steps, realize
that Stage 1
that Stage 1
predicates are more efficient
predicates are more efficient
because they
because they
are evaluated earlier in the process, by the
are evaluated earlier in the process, by the
DM instead of the RDS, and thereby reduce
DM instead of the RDS, and thereby reduce
overhead during the processing steps.
overhead during the processing steps.
19 19
SQL Coding Strategies and
SQL Coding Strategies and
Guidelines
Guidelines
Understand Stage 1 and Stage 2 Predicates
Understand Stage 1 and Stage 2 Predicates
Tune the queries that are executed more
Tune the queries that are executed more
frequently first!
frequently first!
It Depends!
It Depends!
Know Your Data!
Know Your Data!
Static vs. Dynamic SQL
Static vs. Dynamic SQL
Batch vs. Interactive (CICS vs. web)
Batch vs. Interactive (CICS vs. web)
20 20
Unnecessary SQL
Unnecessary SQL
Avoid unnecessary execution of SQL
Avoid unnecessary execution of SQL
Consider accomplishing as much as
Consider accomplishing as much as
possible with a single call, rather than
possible with a single call, rather than
multiple calls
multiple calls
21 21
Rows Returned
Rows Returned
Minimize the number of rows searched
Minimize the number of rows searched
and/or returned
and/or returned
Code predicates to limit the result to only the
Code predicates to limit the result to only the
rows needed
rows needed
Avoid generic queries that do not have a
Avoid generic queries that do not have a
WHERE clause
WHERE clause
22 22
Column Selection
Column Selection
Minimize the number of columns
Minimize the number of columns
retrieved and/or updated
retrieved and/or updated
Specify only the columns needed
Specify only the columns needed
Avoid SELECT *
Avoid SELECT *
Extra columns increases row size of
Extra columns increases row size of
the result set
the result set
Retrieving very few columns can
Retrieving very few columns can
encourage index
encourage index
-
-
only access
only access
23 23
Singleton SELECT vs. Cursor
Singleton SELECT vs. Cursor
If a
If a
single row
single row
is returned
is returned
Singleton SELECT .. INTO
Singleton SELECT .. INTO
outperforms a Cursor
outperforms a Cursor
error when more than 1 row is returned
error when more than 1 row is returned
If
If
multiple rows
multiple rows
are returned
are returned
Cursor
Cursor
requires overhead of OPEN, FETCH, and
requires overhead of OPEN, FETCH, and
CLOSE
CLOSE
What is an example of a singleton select and a
What is an example of a singleton select and a
select requiring a cursor?
select requiring a cursor?
24 24
Singleton SELECT vs. Cursor
Singleton SELECT vs. Cursor
For Row Update:
For Row Update:
When the selected row must be retrieved first:
When the selected row must be retrieved first:
Use
Use
FOR UPDATE OF
FOR UPDATE OF
clause with a CURSOR
clause with a CURSOR
Using a Singleton SELECT
Using a Singleton SELECT
the row can be updated by another program
the row can be updated by another program
after the singleton SELECT but before the
after the singleton SELECT but before the
subsequent UPDATE, causing a possible data
subsequent UPDATE, causing a possible data
integrity issue
integrity issue
25 25
Use For Fetch Only
Use For Fetch Only
When a SELECT statement is used only for
When a SELECT statement is used only for
data retrieval
data retrieval
-
-
use FOR FETCH ONLY
use FOR FETCH ONLY
FOR READ ONLY clause provides the
FOR READ ONLY clause provides the
same function
same function
-
-
and is ODBC compliant
and is ODBC compliant
Enables DB2 to use
Enables DB2 to use
block fetch
block fetch
Monitor the performance to decide which is
Monitor the performance to decide which is
best for each situation
best for each situation
26 26
Avoid Sorting
Avoid Sorting
DISTINCT
DISTINCT
-
-
always results in a sort
always results in a sort
UNION
UNION
-
-
always results in a sort
always results in a sort
UNION ALL
UNION ALL
-
-
does not sort, but retains any
does not sort, but retains any
duplicates
duplicates
27 27
Avoid Sorting
Avoid Sorting
ORDER BY
ORDER BY
may be faster if columns are indexed
may be faster if columns are indexed
use it to guarantee the sequence of the
use it to guarantee the sequence of the
data
data
GROUP BY
GROUP BY
specify only columns that need to be
specify only columns that need to be
grouped
grouped
may be faster if the columns are indexed
may be faster if the columns are indexed
do not include extra columns in SELECT
do not include extra columns in SELECT
list or GROUP BY because DB2 must sort
list or GROUP BY because DB2 must sort
the rows
the rows
28 28
Subselects
Subselects
DB2 processes the subselect (inner select)
DB2 processes the subselect (inner select)
first before the outer select
first before the outer select
You may be able to improve performance of
You may be able to improve performance of
complex queries by coding a complex
complex queries by coding a complex
predicate in a subselect
predicate in a subselect
Applying the predicate in the subselect may
Applying the predicate in the subselect may
reduce the number of rows returned
reduce the number of rows returned
29 29
Use Inline Views
Use Inline Views
Inline views allow the FROM clause of a
Inline views allow the FROM clause of a
SELECT statement to contain another
SELECT statement to contain another
SELECT statement
SELECT statement
May enhance performance of the outer
May enhance performance of the outer
select by applying predicates in the
select by applying predicates in the
inner select
inner select
Useful when detail and aggregated data
Useful when detail and aggregated data
must be returned in a single query
must be returned in a single query
30 30
Indexes
Indexes
Create indexes for columns you frequently:
Create indexes for columns you frequently:
ORDER BY
ORDER BY
GROUP BY (better than a DISTINCT)
GROUP BY (better than a DISTINCT)
SELECT DISTINCT
SELECT DISTINCT
J OIN
J OIN
Several factors determine whether the index
Several factors determine whether the index
will be used
will be used
31 31
Avoid Data Conversion
Avoid Data Conversion
When comparing column values to host
When comparing column values to host
variables
variables
-
-
use the same
use the same
Data Type
Data Type
Length
Length
When DB2 must convert data, available
When DB2 must convert data, available
indexes are sometimes
indexes are sometimes
not used
not used
32 32
J oin Predicates
J oin Predicates
Response time
Response time
-
-
> determined mostly by the
> determined mostly by the
number of rows participating in the join
number of rows participating in the join
Provide accurate join predicates
Provide accurate join predicates
Never use a J OIN without a predicate
Never use a J OIN without a predicate
J oin ON indexed columns
J oin ON indexed columns
Use J oins over subqueries
Use J oins over subqueries
33 33
J oin Predicates (cont.)
J oin Predicates (cont.)
When the results of a join must be sorted
When the results of a join must be sorted
-
-
limiting the ORDER BY to columns of a single
limiting the ORDER BY to columns of a single
table can avoid a sort
table can avoid a sort
specifying columns from multiple tables causes
specifying columns from multiple tables causes
a sort
a sort
Favor coding explicit INNER and LEFT OUT
Favor coding explicit INNER and LEFT OUT
joins over RIGHT OUTER joins
joins over RIGHT OUTER joins
EXPLAIN converts RIGHT to LEFT join
EXPLAIN converts RIGHT to LEFT join
34 34
Example: Outer J oin With A
Example: Outer J oin With A
Local Predicate
Local Predicate
SELECT emp.empno, emp.lastname,
SELECT emp.empno, emp.lastname,
dept.deptname
dept.deptname
FROM emp LEFT OUTER J OIN dept
FROM emp LEFT OUTER J OIN dept
ON emp.workdept = dept.deptno
ON emp.workdept = dept.deptno
WHERE emp.salary > 50000.00;
WHERE emp.salary > 50000.00;
Works correctly but
Works correctly but
the outer join is performed
the outer join is performed
first, before any rows are filtered out.
first, before any rows are filtered out.
35 35
Example: Outer J oin Using An
Example: Outer J oin Using An
Inline View
Inline View
SELECT emp.empno, emp.lastname,
SELECT emp.empno, emp.lastname,
dept.deptname
dept.deptname
FROM (SELECT empno, lastname
FROM (SELECT empno, lastname
FROM emp WHERE salary > 50000.00) as e
FROM emp WHERE salary > 50000.00) as e
LEFT OUTER J OIN dept
LEFT OUTER J OIN dept
ON emp.workdept = dept.deptno
ON emp.workdept = dept.deptno
Works better
Works better
applies the inner join predicates first,
applies the inner join predicates first,
reducing number of rows to be joined
reducing number of rows to be joined
36 36
OR vs. UNION
OR vs. UNION
OR requires Stage 2 processing
OR requires Stage 2 processing
Consider rewriting the query as the union of
Consider rewriting the query as the union of
2 SELECTs, making index access possible
2 SELECTs, making index access possible
UNION ALL avoids the sort, but duplicates
UNION ALL avoids the sort, but duplicates
are included
are included
Monitor and EXPLAIN the query to decide
Monitor and EXPLAIN the query to decide
which is best
which is best
37 37
Use BETWEEN
Use BETWEEN
BETWEEN is usually more efficient than
BETWEEN is usually more efficient than
<= predicate and the >= predicate
<= predicate and the >= predicate
Except when comparing a host variable
Except when comparing a host variable
to 2 columns
to 2 columns
Stage 2 : WHERE
Stage 2 : WHERE
:hostvar BETWEEN col1 and col2
:hostvar BETWEEN col1 and col2
Stage 1: WHERE
Stage 1: WHERE
Col1 <= :hostvar AND col2 >=
Col1 <= :hostvar AND col2 >=
:hostvar
:hostvar
38 38
Use IN Instead of Like
Use IN Instead of Like
If you know that only a certain number of
If you know that only a certain number of
values exist and can be put in a list
values exist and can be put in a list
Use IN or BETWEEN
Use IN or BETWEEN
IN ( IN ( Value1 Value1 , , Value2 Value2 , , Value3 Value3 ) )
BETWEEN :valuelow AND :valuehigh BETWEEN :valuelow AND :valuehigh
Rather than:
Rather than:
LIKE LIKE Value_ Value_
39 39
Use LIKE With Care
Use LIKE With Care
Avoid the % or the _ at the beginning
Avoid the % or the _ at the beginning
because it prevents DB2 from using a
because it prevents DB2 from using a
matching index and may cause a scan
matching index and may cause a scan
Use the % or the _ at the end to encourage
Use the % or the _ at the end to encourage
index usage
index usage
40 40
Avoid NOT
Avoid NOT
Predicates formed using NOT are Stage 1
Predicates formed using NOT are Stage 1
But they are not indexable
But they are not indexable
For Subquery
For Subquery
-
-
when using negation logic:
when using negation logic:
Use NOT Exists
Use NOT Exists
DB2 tests non DB2 tests non- -existence existence
Instead of NOT IN
Instead of NOT IN
DB2 must materialize the complete result set DB2 must materialize the complete result set
41 41
Use EXISTS
Use EXISTS
Use EXISTS to test for a condition and get a
Use EXISTS to test for a condition and get a
True or False returned by DB2 and not
True or False returned by DB2 and not
return any rows to the query:
return any rows to the query:
SELECT col1 FROM table1
SELECT col1 FROM table1
WHERE EXISTS
WHERE EXISTS
(SELECT 1 FROM table2
(SELECT 1 FROM table2
WHERE table2.col2 = table1.col1)
WHERE table2.col2 = table1.col1)
42 42
Code the Most Restrictive
Code the Most Restrictive
Predicate First
Predicate First
After the indexes, place the predicate that
After the indexes, place the predicate that
will eliminate the greatest number of rows
will eliminate the greatest number of rows
first
first
Know your data
Know your data
Race, Gender, Type of Student, Year, Term
Race, Gender, Type of Student, Year, Term
43 43
Avoid Arithmetic in Predicates
Avoid Arithmetic in Predicates
An index is not used for a column when the
An index is not used for a column when the
column is in an arithmetic expression.
column is in an arithmetic expression.
Stage 1 but not indexable
Stage 1 but not indexable
SELECT col1
SELECT col1
FROM table1
FROM table1
WHERE col2 = :hostvariable + 10
WHERE col2 = :hostvariable + 10
44 44
Limit Scalar Function Usage
Limit Scalar Function Usage
Scalar functions are not indexable
Scalar functions are not indexable
But you can use scalar functions to offload
But you can use scalar functions to offload
work from the application program
work from the application program
Examples:
Examples:
DATE functions
DATE functions
SUBSTR
SUBSTR
CHAR
CHAR
etc.
etc.
45 45
Other Cautions
Other Cautions
Predicates that contain concatenated
Predicates that contain concatenated
columns are not indexable
columns are not indexable
SELECT Count(*) can be expensive
SELECT Count(*) can be expensive
CASE Statement
CASE Statement
-
-
powerful but can be
powerful but can be
expensive
expensive
46 46
With OPTIMIZE for n ROWS
With OPTIMIZE for n ROWS
For online applications, use
For online applications, use
With OPTIMIZE
With OPTIMIZE
for n ROWS
for n ROWS
to attempt to influence the
to attempt to influence the
access path DB2 chooses
access path DB2 chooses
Without this clause, DB2 chooses the best
Without this clause, DB2 chooses the best
access path for
access path for
batch processing
batch processing
With this clause, DB2 optimizes for quicker
With this clause, DB2 optimizes for quicker
response for online processing
response for online processing
Try Optimize for 1, for 10, for 100
Try Optimize for 1, for 10, for 100
47 47
Review DB2 Optimizer
Review DB2 Optimizer
DB2 is a Cost
DB2 is a Cost
-
-
based optimizer
based optimizer
RUNSTATS populates the DB2 Catalog
RUNSTATS populates the DB2 Catalog
DB2 Catalog used to determine access path
DB2 Catalog used to determine access path
Create Indexes for columns you frequently
Create Indexes for columns you frequently
select and sort
select and sort
Avoid Unnecessary Sorts in SQL
Avoid Unnecessary Sorts in SQL
Code the SQL predicates thoughtfully
Code the SQL predicates thoughtfully
48 48
DB2 Catalog
DB2 Catalog
SYSTABLES
SYSTABLES
SYSTABLESPACE
SYSTABLESPACE
SYSINDEXES
SYSINDEXES
FIRSTKEYCARDF FIRSTKEYCARDF
SYSCOLUMNS
SYSCOLUMNS
HIGH2KEY HIGH2KEY
LOW2KEY LOW2KEY
SYSCOLDIST
SYSCOLDIST
SYSCOLDISTSTATS
SYSCOLDISTSTATS
49 49
Filter Factors for Predicates
Filter Factors for Predicates
Filter factor is based on the
Filter factor is based on the
number of
number of
rows
rows
that will be filtered out by the
that will be filtered out by the
predicate
predicate
A ratio that estimates I/O costs
A ratio that estimates I/O costs
The lower the filter factor, the lower the
The lower the filter factor, the lower the
cost, and in general, the more efficient
cost, and in general, the more efficient
the query
the query
Review the handout as we discuss this
Review the handout as we discuss this
topic
topic
50 50
Filter Factors for DB2 Predicates
Filter Factors for DB2 Predicates
Filter Factor Formulas Filter Factor Formulas - - use FIRSTKEYCARDF use FIRSTKEYCARDF
column from the SYSINDEXES table of the Catalog column from the SYSINDEXES table of the Catalog
If there are no statistics for the indexes, the If there are no statistics for the indexes, the default default
filter factors filter factors are used are used
The lowest default filter factor is .01 : The lowest default filter factor is .01 :
Column BETWEEN Value1 AND Value2 Column BETWEEN Value1 AND Value2
Column LIKE Column LIKE char% char%
Equality predicates have a default filter factor of .04 : Equality predicates have a default filter factor of .04 :
Column = value Column = value
Column = :hostvalue Column = :hostvalue
ColumnA = ColumnB (of different tables) ColumnA = ColumnB (of different tables)
Column IS NULL Column IS NULL
51 51
Filter Factors for DB2 Predicates
Filter Factors for DB2 Predicates
Comparative Operators have a default filter factor of Comparative Operators have a default filter factor of
.33 .33
Column <, <=, >, >= value Column <, <=, >, >= value
IN List predicates have a filter factor of .04 * (list size) IN List predicates have a filter factor of .04 * (list size)
Column IN (list of values) Column IN (list of values)
Not Equal predicates have a default filter factor of .96 : Not Equal predicates have a default filter factor of .96 :
Column <> value Column <> value
Column <> :hostvalue Column <> :hostvalue
ColumnA <> ColumnB (of different tables) ColumnA <> ColumnB (of different tables)
52 52
Filter Factors for DB2 Predicates
Filter Factors for DB2 Predicates
Not List predicates have a filter factor of Not List predicates have a filter factor of
1 1 - - (.04 * (list size)) (.04 * (list size))
Column NOT IN (list of values) Column NOT IN (list of values)
Other Not Predicates that have a default filter factor of Other Not Predicates that have a default filter factor of
.90 .90
Column NOT BETWEEN Value1 and Value2 Column NOT BETWEEN Value1 and Value2
Column NOT IN (non Column NOT IN (non- -correlated subquery) correlated subquery)
Column <> ALL (non Column <> ALL (non- -correlated subquery) correlated subquery)
53 53
Column Matching
Column Matching
With a composite index, the column matching stops at With a composite index, the column matching stops at
one predicate past the last equality predicate one predicate past the last equality predicate. .
See Example in the handout that uses a 4 column See Example in the handout that uses a 4 column
index. index.
(C1 = :hostvar1 AND C2 = :hostvar2 AND C3 = (non (C1 = :hostvar1 AND C2 = :hostvar2 AND C3 = (non
column expression) AND C4 > :hostvar4) column expression) AND C4 > :hostvar4)
Stage 1 Stage 1 - - Indexable with 4 matching columns Indexable with 4 matching columns
(C1 = :hostvar1 AND C2 BETWEEN :hostvar2 AND (C1 = :hostvar1 AND C2 BETWEEN :hostvar2 AND
:hostvar3 AND C3 = :hostvar4) :hostvar3 AND C3 = :hostvar4)
Stage 1 Stage 1 - - Indexable with 2 matching columns Indexable with 2 matching columns
54 54
Column Matching
Column Matching
(C1 > value1 AND C2 = :hostvar2 AND C2 IN (value1, (C1 > value1 AND C2 = :hostvar2 AND C2 IN (value1,
value2, value3, value4)) value2, value3, value4))
Stage 1 Stage 1 - - Indexable with 1 matching column Indexable with 1 matching column
(C1 = :hostvar1 AND C2 LIKE (C1 = :hostvar1 AND C2 LIKE ab%xyz_1 ab%xyz_1 AND C3 AND C3
NOT BETWEEN :hostvar3 AND :hostvar4 AND C4 = NOT BETWEEN :hostvar3 AND :hostvar4 AND C4 =
value1) value1)
Indexable with C1 = :hostvar1 AND C2 LIKE Indexable with C1 = :hostvar1 AND C2 LIKE ab%xyz_1 ab%xyz_1
Stage 1 Stage 1 - - LIKE LIKE ab%xyz_1 ab%xyz_1 AND C3 NOT BETWEEN :hostvar3 AND C3 NOT BETWEEN :hostvar3
AND :hostvar4 AND C4 = value1 AND :hostvar4 AND C4 = value1
55 55
Column Matching
Column Matching
-
-
2 Indexes
2 Indexes
With two indexes: C1.C2 and C3.C4 With two indexes: C1.C2 and C3.C4
(C1 = :hostvar1 AND C2 LIKE :hostvar2) OR (C1 = :hostvar1 AND C2 LIKE :hostvar2) OR
(C3 = (non column expression) AND C4 > :hostvar4) (C3 = (non column expression) AND C4 > :hostvar4)
Multiple Index Access Multiple Index Access
1 column matching of first index 1 column matching of first index
2 columns matching on second index 2 columns matching on second index
LIKE will be Stage 2 LIKE will be Stage 2
56 56
Order of Predicate Evaluation
Order of Predicate Evaluation
1. Indexed predicates 1. Indexed predicates
2. Non 2. Non- -indexed predicates indexed predicates - -
Stage 1 then Stage 2
Stage 1 then Stage 2
Within each of the groups above, predicates are Within each of the groups above, predicates are
evaluated in this sequence: evaluated in this sequence:
1. Equality predicates, including single element IN list 1. Equality predicates, including single element IN list
predicates predicates
2. Range and NOT NULL predicates 2. Range and NOT NULL predicates
3. All other predicates 3. All other predicates
If multiple predicates are of the exact same type, they If multiple predicates are of the exact same type, they
are evaluated in the order in which they are coded in are evaluated in the order in which they are coded in
the predicate. the predicate.
57 57
Review Filter Factors for
Review Filter Factors for
Predicates
Predicates
DB2 Catalog
DB2 Catalog
Filter Factors
Filter Factors
Column Matching
Column Matching
Order of Predicate Evaluation
Order of Predicate Evaluation
58 58
Runstats and Reorg
Runstats and Reorg
Runstats Utility
Runstats Utility
updates the catalog tables with information about the tables updates the catalog tables with information about the tables
in your system in your system
used by the Optimizer for determining the best access path used by the Optimizer for determining the best access path
for a SQL statement for a SQL statement
Reorg Utility
Reorg Utility
reorganizes the data in your tables reorganizes the data in your tables
good to run the RUNSTATS after a table has been reorg good to run the RUNSTATS after a table has been reorg d d
Use Workbench to review the statistics
Use Workbench to review the statistics
in both Test and Production databases
in both Test and Production databases
59 59
Runstats and Reorg (DBA Tools)
Runstats and Reorg (DBA Tools)
Development Databases
Development Databases
you can use Workbench to run RUNSTATS and you can use Workbench to run RUNSTATS and
REORGs REORGs
Test Databases
Test Databases
use TSO MASTER Clist to copy production statistics to use TSO MASTER Clist to copy production statistics to
the Test region the Test region
DBA has set this up for each project DBA has set this up for each project
Production Databases
Production Databases
DBA runs the REORG and RUNSTATS utilities on a DBA runs the REORG and RUNSTATS utilities on a
scheduled basis for production tables scheduled basis for production tables
60 60
DB2 Explain
DB2 Explain
Valuable monitoring tool that
Valuable monitoring tool that
can help you
can help you
improve
improve
the efficiency of your DB2
the efficiency of your DB2
applications
applications
Parses your SQL statements and reports the
Parses your SQL statements and reports the
access path
access path
DB2 plans to use
DB2 plans to use
Uses a
Uses a
Plan Table
Plan Table
to contain the information
to contain the information
about each SQL statement. Each
about each SQL statement. Each
project
project
has
has
their own plan table.
their own plan table.
61 61
DB2 Explain
DB2 Explain
Required and reviewed by DBA
Required and reviewed by DBA
when a DB2
when a DB2
program is moved to production
program is moved to production
Recognizes the
Recognizes the
? Parameter Marker
? Parameter Marker
-
-
assumes same data type and length as you
assumes same data type and length as you
will define in your program
will define in your program
Know your data
Know your data
, your
, your
table design
table design
, your
, your
indexes
indexes
to maximize performance
to maximize performance
62 62
DB2 Explain Example
DB2 Explain Example
-
-
1 Table
1 Table
-- --SET THE CURRENT SQLID TO YOUR AREA: SET THE CURRENT SQLID TO YOUR AREA:
SET CURRENT SQLID SET CURRENT SQLID='FSUDBA'; ='FSUDBA';
-- -- SET THE QUERYNO TO YOUR USERID NUMBER, OR SOMETHING SET THE QUERYNO TO YOUR USERID NUMBER, OR SOMETHING
UNIQUE UNIQUE
-- -- IN YOUR GROUP. IN THIS EXAMPLE, CHANGE 587 TO YOUR USERID. IN YOUR GROUP. IN THIS EXAMPLE, CHANGE 587 TO YOUR USERID.
-- --THIS QUERY SELECTS COLUMNS FROM 1 TABLE. THIS QUERY SELECTS COLUMNS FROM 1 TABLE.
-- --NOTICE THE ? PARAMETER MARKERS IN THE WHERE CLAUSE. NOTICE THE ? PARAMETER MARKERS IN THE WHERE CLAUSE.
EXPLAIN PLAN EXPLAIN PLAN SET QUERYNO=587 SET QUERYNO=587 FOR FOR
SELECT NAME, SSN, YEAR, TERM SELECT NAME, SSN, YEAR, TERM
FROM FSDWH.DATA_SHARE FROM FSDWH.DATA_SHARE
WHERE SUBSTR(YEAR,3,2) = ? AND TERM = ?; WHERE SUBSTR(YEAR,3,2) = ? AND TERM = ?;
63 63
DB2 Explain Example
DB2 Explain Example
-
-
1 Table
1 Table
- -GENERATE THE EXPLAIN REPORT FROM THE PLAN_TABLE OF YOUR GENERATE THE EXPLAIN REPORT FROM THE PLAN_TABLE OF YOUR
AREA: AREA:
SELECT SELECT
SUBSTR(DIGITS(QUERYNO),6,5) AS QUERY, SUBSTR(DIGITS(QUERYNO),6,5) AS QUERY,
SUBSTR(DIGITS(QBLOCKNO),4,2) AS BLOCK, SUBSTR(DIGITS(QBLOCKNO),4,2) AS BLOCK,
SUBSTR(DIGITS(PLANNO),4,2) AS PLAN, SUBSTR(DIGITS(PLANNO),4,2) AS PLAN,
SUBSTR(DIGITS(METHOD),4,2) AS METH, SUBSTR(DIGITS(METHOD),4,2) AS METH,
TNAME, SUBSTR(DIGITS(TABNO),4,2) AS TABNO, TNAME, SUBSTR(DIGITS(TABNO),4,2) AS TABNO,
ACCESSTYPE AS TYPE, SUBSTR(DIGITS(MATCHCOLS),4,2) AS MC, ACCESSTYPE AS TYPE, SUBSTR(DIGITS(MATCHCOLS),4,2) AS MC,
ACCESSNAME AS ANAME, INDEXONLY AS IO, ACCESSNAME AS ANAME, INDEXONLY AS IO,
SORTN_UNIQ AS SNU, SORTN_J OIN AS SNJ , SORTN_ORDERBY AS SNO, SORTN_UNIQ AS SNU, SORTN_J OIN AS SNJ , SORTN_ORDERBY AS SNO,
SORTN_GROUPBY AS SNG, SORTC_UNIQ AS SCU, SORTC_J OIN AS SCJ , SORTN_GROUPBY AS SNG, SORTC_UNIQ AS SCU, SORTC_J OIN AS SCJ ,
SORTC_ORDERBY AS SCO, SORTC_GROUPBY AS SCG, PREFETCH AS SORTC_ORDERBY AS SCO, SORTC_GROUPBY AS SCG, PREFETCH AS
PF PF
FROM FSUDBA. FROM FSUDBA.PLAN_TABLE PLAN_TABLE
WHERE QUERYNO = 587 WHERE QUERYNO = 587 ORDER BY 1, 2, 3; ORDER BY 1, 2, 3;
- -DELETE THE ROWS YOU ADDED DURING THIS EXPLAIN PROCESS: DELETE THE ROWS YOU ADDED DURING THIS EXPLAIN PROCESS:
DELETE FROM FSUDBA. DELETE FROM FSUDBA.PLAN_TABLE PLAN_TABLE WHERE QUERYNO = 587; WHERE QUERYNO = 587;
64 64
DB2 Explain Example
DB2 Explain Example
-
-
1 Table
1 Table
--------- ---------+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +---- ----
QUERY BLOCK PLAN METH TNAME TABNO TYPE MC A QUERY BLOCK PLAN METH TNAME TABNO TYPE MC ANAME NAME
--------- ---------+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +---- ----
00587 01 01 00 DATA_SHARE 01 00587 01 01 00 DATA_SHARE 01 I 00 I 00
IXDSH01 IXDSH01
-- --+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +------- -------
IO SNU SNJ SNO SNG SCU SCJ SCO SCG PF IO SNU SNJ SNO SNG SCU SCJ SCO SCG PF
-- --+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +------- -------
N N N N N N N N N N N N N N N N N S N S
65 65
DB2 Explain Columns
DB2 Explain Columns
QUERY Number QUERY Number - - Identifies the SQL statement in the Identifies the SQL statement in the
PLAN_TABLE (any number you assign PLAN_TABLE (any number you assign - - the example uses the the example uses the
numeric part of the userid) numeric part of the userid)
BLOCK BLOCK - - query block within the query number, where 1 is the top query block within the query number, where 1 is the top
level SELECT. Subselects, unions, materialized views, and nested level SELECT. Subselects, unions, materialized views, and nested
table expressions will show multiple query blocks. Each QBLOCK table expressions will show multiple query blocks. Each QBLOCK
has it's own access path. has it's own access path.
PLAN PLAN - - indicates the order in which the tables will be accessed indicates the order in which the tables will be accessed
66 66
DB2 Explain Columns
DB2 Explain Columns
METHOD METHOD - - shows which J OIN technique was used: shows which J OIN technique was used:
00 00- - First table accessed, continuation of previous table accessed, First table accessed, continuation of previous table accessed, or not used. or not used.
01 01- - Nested Loop J oin. For each row of the present composite table, Nested Loop J oin. For each row of the present composite table, matching rows of a matching rows of a
new table are found and joined new table are found and joined
02 02- - Merge Scan J oin. The present composite table and the new table Merge Scan J oin. The present composite table and the new table are scanned in the are scanned in the
order of the join columns, and matching rows are joined. order of the join columns, and matching rows are joined.
03 03- - Sorts needed by ORDER BY, GROUP BY, SELECT DISTINCT, UNION, a q Sorts needed by ORDER BY, GROUP BY, SELECT DISTINCT, UNION, a quantified uantified
predicate, or an IN predicate. This step does not access a new t predicate, or an IN predicate. This step does not access a new table. able.
04 04- - Hybrid J oin. The current composite table is scanned in the orde Hybrid J oin. The current composite table is scanned in the order of the join r of the join- -column column
rows of the new table. The new table accessed using list prefet rows of the new table. The new table accessed using list prefetch. ch.
TNAME TNAME - - name of the table whose access this row refers to. Either a tab name of the table whose access this row refers to. Either a table in the le in the
FROM clause, or a materialized VIEW name. FROM clause, or a materialized VIEW name.
TABNO TABNO - - the original position of the table name in the FROM clause the original position of the table name in the FROM clause
67 67
DB2 Explain Columns
DB2 Explain Columns
TYPE (ACCESS TYPE) TYPE (ACCESS TYPE) - - indicates whether an index was chosen: indicates whether an index was chosen:
I I = INDEX = INDEX
R R= TABLESPACE SCAN (reads every data page of the table once) = TABLESPACE SCAN (reads every data page of the table once)
I1 I1= ONE = ONE- -FETCH INDEX SCAN FETCH INDEX SCAN
N N= INDEX USING IN LIST = INDEX USING IN LIST
M M=MULTIPLE INDEX SCAN =MULTIPLE INDEX SCAN
MX MX =NAMES ONE OF INDEXES USED =NAMES ONE OF INDEXES USED
MI MI =INTERSECT MULT. INDEXES =INTERSECT MULT. INDEXES
MU MU = UNION MULT. INDEXES = UNION MULT. INDEXES
68 68
DB2 Explain Columns
DB2 Explain Columns
MC (MATCHCOLS) MC (MATCHCOLS) - - number of columns of matching index scan number of columns of matching index scan
ANAME (ACCESS NAME) ANAME (ACCESS NAME) - - name of index name of index
IO (INDEX ONLY) IO (INDEX ONLY) - - Y = index alone satisfies data request Y = index alone satisfies data request
N = table must be accessed also N = table must be accessed also
8 Sort Groups: Each 8 Sort Groups: Each sort group sort group has four indicators indicating why the sort is has four indicators indicating why the sort is
necessary. Usually, a sort will cause the statement to run longe necessary. Usually, a sort will cause the statement to run longer. r.
UNIQ UNIQ - - DISTINCT option or UNION was part of the query or IN list for DISTINCT option or UNION was part of the query or IN list for
subselect subselect
J OIN J OIN - - sort for J oin sort for J oin
ORDERBY ORDERBY - - order by option was part of the query order by option was part of the query
GROUPBY GROUPBY - - group by option was part of the query group by option was part of the query
69 69
DB2 Explain Columns
DB2 Explain Columns
Sort flags for 'new' (inner) tables: Sort flags for 'new' (inner) tables:
SNU SNU - - SORTN_UNIQ SORTN_UNIQ - - Y = remove duplicates, N = no sort Y = remove duplicates, N = no sort
SNJ SNJ - - SORTN_J OIN SORTN_J OIN - - Y = sort table for join, N = no sort Y = sort table for join, N = no sort
SNO SNO - - SORTN_ORDERBY SORTN_ORDERBY - - Y = sort for order by, N = no sort Y = sort for order by, N = no sort
SNG SNG - - SORTN_GROUPBY SORTN_GROUPBY - - Y = sort for group by, N = no sort Y = sort for group by, N = no sort
70 70
DB2 Explain Columns
DB2 Explain Columns
Sort flags for 'composite' (outer) tables: Sort flags for 'composite' (outer) tables:
SCU SCU - - SORTC_UNIQ SORTC_UNIQ - - Y = remove duplicates, N = no sort Y = remove duplicates, N = no sort
SCJ SCJ - - SORTC_J OIN SORTC_J OIN - - Y = sort table for join, N = no sort Y = sort table for join, N = no sort
SCO SCO - - SORTC_ORDERBY SORTC_ORDERBY - - Y = sort for order by, N = no sort Y = sort for order by, N = no sort
SCG SCG - - SORTC_GROUPBY SORTC_GROUPBY - - Y = sort for group by, N = no sort Y = sort for group by, N = no sort
PF PF - - PREFETCH PREFETCH - - Indicates whether data pages were read in advance by Indicates whether data pages were read in advance by
prefetch. prefetch.
S = pure sequential PREFETCH S = pure sequential PREFETCH
L = PREFETCH through a RID list L = PREFETCH through a RID list
Blank = unknown, or not applicable Blank = unknown, or not applicable
71 71
DB2 Explain Analysis
DB2 Explain Analysis
Guidelines: Guidelines:
You want to avoid tablespace scans (TYPE = R) or You want to avoid tablespace scans (TYPE = R) or
at least be able to explain why. Tablespace scans at least be able to explain why. Tablespace scans
are acceptable for small tables. are acceptable for small tables.
Nested Loop J oin is usually the most efficient join Nested Loop J oin is usually the most efficient join
method. method.
Index only access is desirable (but usually not Index only access is desirable (but usually not
possible) possible)
You should strive for Index access with the matching You should strive for Index access with the matching
columns being the same as the number of columns columns being the same as the number of columns
in the index. in the index.
72 72
DB2 Explain Analysis
DB2 Explain Analysis
Try to answer the following questions: Try to answer the following questions:
Is Access through an Index? (TYPE is I, I1, N or Is Access through an Index? (TYPE is I, I1, N or
MX) MX)
Is Access through More than one Index (TYPE is M, Is Access through More than one Index (TYPE is M,
MX, MI or MU) MX, MI or MU)
How many columns of the index are used in How many columns of the index are used in
matching (TYPE is I, I1, N or MX and MC contains matching (TYPE is I, I1, N or MX and MC contains
number of matching columns ) number of matching columns )
Is the query satisfied using only the index? (IO = Y) Is the query satisfied using only the index? (IO = Y)
73 73
DB2 Explain Analysis
DB2 Explain Analysis
Is a view materialized into a work file? (TNAME Is a view materialized into a work file? (TNAME
names a view) names a view)
What Kind of Prefetching is done? (PF is L for List, What Kind of Prefetching is done? (PF is L for List,
S for sequential or blank) S for sequential or blank)
Are Sorts Performed? Are Sorts Performed?
(SNU,SNJ ,SNO,SNG,SCU,SCJ ,SCO or SCG = Y) (SNU,SNJ ,SNO,SNG,SCU,SCJ ,SCO or SCG = Y)
Is a subquery transformed into a join? (BLOCK Is a subquery transformed into a join? (BLOCK
Value) Value)
74 74
DB2 Explain Example
DB2 Explain Example
-
-
5 tables
5 tables
This example uses the training database tables: This example uses the training database tables:
-- --SET THE CURRENT SQLID TO YOUR AREA: SET THE CURRENT SQLID TO YOUR AREA:
SET CURRENT SQLID SET CURRENT SQLID='FSUTRN'; ='FSUTRN';
-- -- SET THE QUERYNO TO YOUR USERID NUMBER, OR SET THE QUERYNO TO YOUR USERID NUMBER, OR
SOMETHING UNIQUE IN YOUR GROUP. IN THIS EXAMPLE, SOMETHING UNIQUE IN YOUR GROUP. IN THIS EXAMPLE,
CHANGE 587 TO YOUR USERID. CHANGE 587 TO YOUR USERID.
-- --THIS QUERY SELECTS COLUMNS FROM 5 TABLES. THIS QUERY SELECTS COLUMNS FROM 5 TABLES.
-- --NOTICE THE ? PARAMETER MARKERS IN THE WHERE CLAUSE. NOTICE THE ? PARAMETER MARKERS IN THE WHERE CLAUSE.
EXPLAIN PLAN EXPLAIN PLAN SET QUERYNO=587 SET QUERYNO=587 FOR FOR
75 75
DB2 Explain Example
DB2 Explain Example
-
-
5 tables
5 tables
SELECT C.COURSE_NUMBER, C.COURSE_IND, SELECT C.COURSE_NUMBER, C.COURSE_IND,
C.YEAR, C.TERM, C.SECTION_NUMBER, C.YEAR, C.TERM, C.SECTION_NUMBER,
C.SUMMER_SESSION_IND, C.FACULTY_ID, C.SUMMER_SESSION_IND, C.FACULTY_ID,
E.COURSE_DEPT_NUMBER, E.COURSE_DEPT_NUMBER,
D.LAST_NAME AS FACULTY_LAST_NAME, D.LAST_NAME AS FACULTY_LAST_NAME,
D.FIRST_NAME AS FACULTY_FIRST_NAME, D.FIRST_NAME AS FACULTY_FIRST_NAME,
D.MIDDLE_NAME AS FACULTY_MID_NAME, D.MIDDLE_NAME AS FACULTY_MID_NAME,
A.STUDENT_ID, A.HOURS, A.STUDENT_ID, A.HOURS,
B.LAST_NAME AS STUDENT_LAST_NAME, B.LAST_NAME AS STUDENT_LAST_NAME,
B.FIRST_NAME AS STUDENT_FIRST_NAME, B.FIRST_NAME AS STUDENT_FIRST_NAME,
B.MIDDLE_NAME AS STUDENT_MID_NAME, B.MIDDLE_NAME AS STUDENT_MID_NAME,
B.CURR_CLASS, B.CURR_DIV, B.CURR_MAJ OR, B.RACE, B.CURR_CLASS, B.CURR_DIV, B.CURR_MAJ OR, B.RACE,
B.GENDER B.GENDER
76 76
DB2 Explain Example
DB2 Explain Example
-
-
5 tables
5 tables
FROM FSDBA.COURSE_MASTER AS E, FROM FSDBA.COURSE_MASTER AS E,
FSDBA.CURRENT_COURSES AS C, FSDBA.CURRENT_COURSES AS C,
FSDBA.TEACHER_MASTER AS D, FSDBA.TEACHER_MASTER AS D,
FSDBA.STUDENT_COURSE AS A, FSDBA.STUDENT_COURSE AS A,
FSDBA.STUDENT_MASTER AS B FSDBA.STUDENT_MASTER AS B
WHERE WHERE
C.COURSE_NUMBER = E.COURSE_NUMBER AND C.COURSE_NUMBER = E.COURSE_NUMBER AND
C.COURSE_IND = E.COURSE_IND AND C.COURSE_IND = E.COURSE_IND AND
C.FACULTY_ID = D.FACULTY_ID AND C.FACULTY_ID = D.FACULTY_ID AND
C.YEAR = A.YEAR AND C.TERM = A.TERM AND C.YEAR = A.YEAR AND C.TERM = A.TERM AND
C.COURSE_NUMBER = A.COURSE_NUMBER AND C.COURSE_NUMBER = A.COURSE_NUMBER AND
C.COURSE_IND = A.COURSE_IND AND C.COURSE_IND = A.COURSE_IND AND
C.SECTION_NUMBER = A.SECTION_NUMBER AND C.SECTION_NUMBER = A.SECTION_NUMBER AND
A.STUDENT_ID = B.STUDENT_ID AND A.STUDENT_ID = B.STUDENT_ID AND
77 77
DB2 Explain Example
DB2 Explain Example
-
-
5 tables
5 tables
C.YEAR = '1998' AND C.TERM = '9' AND C.YEAR = '1998' AND C.TERM = '9' AND
STATUS NOT IN ('13', '14', '15', '20', '21') AND STATUS NOT IN ('13', '14', '15', '20', '21') AND
-- -- FIRST CODE A POSSIBLE DEPT: FIRST CODE A POSSIBLE DEPT:
(E.COURSE_DEPT_NUMBER = '1105' (E.COURSE_DEPT_NUMBER = '1105'
OR OR
-- -- THEN CODE THE POSSIBLE COURSE NUMBERS: THEN CODE THE POSSIBLE COURSE NUMBERS:
SUBSTR(C.COURSE_NUMBER,1,7) = 'BCH4054' SUBSTR(C.COURSE_NUMBER,1,7) = 'BCH4054'
OR OR
-- -- THEN CODE THE POSSIBLE PREFIXES: THEN CODE THE POSSIBLE PREFIXES:
SUBSTR(C.COURSE_NUMBER,1,3) = 'CEG' SUBSTR(C.COURSE_NUMBER,1,3) = 'CEG'
OR OR
78 78
DB2 Explain Example
DB2 Explain Example
-
-
5 tables
5 tables
-- -- THEN CODE THE POSSIBLE SECTIONS: THEN CODE THE POSSIBLE SECTIONS:
( SUBSTR(C.COURSE_NUMBER,1,7) ( SUBSTR(C.COURSE_NUMBER,1,7)
LIKE 'STA4502' AND LIKE 'STA4502' AND
SUBSTR(C.SECTION_NUMBER,1,2) LIKE '01' ) SUBSTR(C.SECTION_NUMBER,1,2) LIKE '01' )
OR ( SUBSTR(C.COURSE_NUMBER,1,7) OR ( SUBSTR(C.COURSE_NUMBER,1,7)
LIKE 'GEB6904' AND LIKE 'GEB6904' AND
SUBSTR(C.SECTION_NUMBER,1,2) LIKE '04' ) SUBSTR(C.SECTION_NUMBER,1,2) LIKE '04' )
OR ( SUBSTR(C.COURSE_NUMBER,1,7) OR ( SUBSTR(C.COURSE_NUMBER,1,7)
LIKE 'SYO5376' AND LIKE 'SYO5376' AND
SUBSTR(C.SECTION_NUMBER,1,2) LIKE '85' ) SUBSTR(C.SECTION_NUMBER,1,2) LIKE '85' )
) )
79 79
DB2 Explain Example
DB2 Explain Example
-
-
5 tables
5 tables
ORDER,BY C.COURSE_NUMBER, C.COURSE_IND, ORDER,BY C.COURSE_NUMBER, C.COURSE_IND,
C.SECTION_NUMBER, C.SECTION_NUMBER,
STUDENT_LAST_NAME, STUDENT_LAST_NAME,
STUDENT_FIRST_NAME, STUDENT_FIRST_NAME,
STUDENT_MID_NAME STUDENT_MID_NAME
FOR FETCH ONLY FOR FETCH ONLY
OPTIMIZE FOR 15 ROWS; OPTIMIZE FOR 15 ROWS;
80 80
DB2 Explain Example
DB2 Explain Example
-
-
5 tables
5 tables
--------- ---------+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +----------------------------------------- -----------------------------------------
QUERY BLOCK PLAN METH TNAME TABNO QUERY BLOCK PLAN METH TNAME TABNO TYPE MC ANAME TYPE MC ANAME
--------- ---------+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +------------------------------------------ ------------------------------------------
00587 01 01 00 CURRENT_COURSES 00587 01 01 00 CURRENT_COURSES 02 R 00 02 R 00
00587 01 02 04 COURSE_MASTER 00587 01 02 04 COURSE_MASTER 01 I 02 01 I 02
IXCRM01 IXCRM01
00587 01 03 04 STUDENT_COURSE 00587 01 03 04 STUDENT_COURSE 04 I 03 04 I 03
IXSTC02 IXSTC02
00587 01 04 01 TEACHER_MASTER 00587 01 04 01 TEACHER_MASTER 03 I 01 03 I 01
IXTCM01 IXTCM01
00587 01 05 01 STUDENT_MASTER 00587 01 05 01 STUDENT_MASTER 05 I 01 05 I 01
IXSTM01 IXSTM01
00587 01 06 03 00587 01 06 03 00 00 00 00
81 81
DB2 Explain Example
DB2 Explain Example
-
-
5 tables
5 tables
------- -------+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +--------------- ---------------
IO SNU SNJ SNO SNG SCU SCJ SCO SCG PF IO SNU SNJ SNO SNG SCU SCJ SCO SCG PF
------- -------+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +--------- ---------+ +--------------- ---------------
N N N N N N N N N N N N N N N N N N S S
N N N N N N N N N N N N N N N N N N L L
N N Y N N N N N N N N Y N N N N N N L L
N N N N N N N N N N N N N N N N N N
N N N N N N N N N N N N N N N N N N
N N N N N N N Y N N N N N N N N Y N
82 82
Example: SAMAS Query1
Example: SAMAS Query1
SET SET CURRENT CURRENT SQLID SQLID= ='FSUDBA' 'FSUDBA'; ;
EXPLAIN EXPLAIN PLAN PLAN SET SET QUERYNO QUERYNO= =587 587 FOR FOR
SELECT MON, SUM(AMOUNT) SELECT MON, SUM(AMOUNT)
FROM FROM
(SELECT (SELECT
MACH_DATE, MONTH(MACH_DATE) AS MON, SUM MACH_DATE, MONTH(MACH_DATE) AS MON, SUM
(AMOUNT) AS AMOUNT (AMOUNT) AS AMOUNT
FROM FROM
FSUDWH.SAMAS_TRANSACTIONS SAM, FSUDWH.SAMAS_TRANSACTIONS SAM,
FSUDWH.FUND_CODES FND, FSUDWH.FUND_CODES FND,
FSUDWH.OBJ ECT_CODES OBJ , FSUDWH.OBJ ECT_CODES OBJ ,
FSUDWH.APPRO_CATEGORY_CDS CAT FSUDWH.APPRO_CATEGORY_CDS CAT
83 83
Example: SAMAS Query1
Example: SAMAS Query1
WHERE ( CAT.APPRO_CATEGORY= WHERE ( CAT.APPRO_CATEGORY=
SAM.APPRO_CATEGORY ) AND SAM.APPRO_CATEGORY ) AND
( OBJ .OBJ ECT_CODE= SAM.CHARGE_OBJ ECT ) ( OBJ .OBJ ECT_CODE= SAM.CHARGE_OBJ ECT )
AND ( SAM.STATE_FUND= FND.STATE_FUND AND ( SAM.STATE_FUND= FND.STATE_FUND
AND AND
SAM.FUND_ID= FND.FUND_CODE ) SAM.FUND_ID= FND.FUND_CODE )
AND ( ( SAM.RECORD_TYPE = 'I' ) AND ( ( SAM.RECORD_TYPE = 'I' )
AND SAM.CHARGE_ORG LIKE '021000000 AND SAM.CHARGE_ORG LIKE '021000000
AND SAM.MACH_DATE BETWEEN '2000 AND SAM.MACH_DATE BETWEEN '2000- -07 07- -01' 01'
AND '2001 AND '2001- -06 06- -30 30 AND ( SAM.B_D_E_R = 'D AND ( SAM.B_D_E_R = 'D AND AND
SAM.TRANS_TYPE <> '80 SAM.TRANS_TYPE <> '80 AND AND
SAM.RECORD_TYPE = 'I' ) ) SAM.RECORD_TYPE = 'I' ) )
GROUP BY SAM.MACH_DATE ) AS QRY1 GROUP BY SAM.MACH_DATE ) AS QRY1
GROUP BY MON ; GROUP BY MON ;
84 84
Example: SAMAS Query1
Example: SAMAS Query1
SELECT SELECT SUBSTR SUBSTR( (DIGITS DIGITS( (QUERYNO QUERYNO), ),6 6, ,5 5) ) AS AS QUERY QUERY, ,
SUBSTR SUBSTR( (DIGITS DIGITS( (QBLOCKNO QBLOCKNO), ),4 4, ,2 2) ) AS AS BLOCK BLOCK, ,
SUBSTR SUBSTR( (DIGITS DIGITS( (PLANNO PLANNO), ),4 4, ,2 2) ) AS AS PLAN PLAN, ,
SUBSTR SUBSTR( (DIGITS DIGITS( (METHOD METHOD), ),4 4, ,2 2) ) AS AS METH METH, ,
TNAME TNAME, , SUBSTR SUBSTR( (DIGITS DIGITS( (TABNO TABNO), ),4 4, ,2 2) ) AS AS TABNO TABNO, ,
ACCESSTYPE ACCESSTYPE AS AS TYPE TYPE, ,
SUBSTR SUBSTR( (DIGITS DIGITS( (MATCHCOLS MATCHCOLS), ),4 4, ,2 2) ) AS AS MC MC, ,
ACCESSNAME ACCESSNAME AS AS ANAME ANAME, , INDEXONLY INDEXONLY AS AS IO IO, ,
SORTN_UNIQ SORTN_UNIQ AS AS SNU SNU, , SORTN_J OIN SORTN_J OIN AS AS SNJ SNJ , ,
SORTN_ORDERBY SORTN_ORDERBY AS AS SNO SNO, ,
SORTN_GROUPBY SORTN_GROUPBY AS AS SNG SNG, , SORTC_UNIQ SORTC_UNIQ AS AS SCU SCU, ,
SORTC_J OIN SORTC_J OIN AS AS SCJ SCJ , ,
SORTC_ORDERBY SORTC_ORDERBY AS AS SCO SCO, , SORTC_GROUPBY SORTC_GROUPBY AS AS SCG SCG, ,
PREFETCH PREFETCH AS AS PF PF
FROM FROM FSUDBA FSUDBA. .PLAN_TABLE PLAN_TABLE
WHERE WHERE QUERYNO QUERYNO = =587 587 ORDER ORDER BY BY 1 1, , 2 2, , 3 3; ;
delete delete from from fsudba fsudba. .plan_table plan_table where where queryno queryno = =587 587; ;
85 85
Example: SAMAS Query1
Example: SAMAS Query1
QUERY BLOCK PLAN METH TNAME TABNO TYPE MC ANAME QUERY BLOCK PLAN METH TNAME TABNO TYPE MC ANAME
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
00587 01 01 00 QRY1 01 R 00 00587 01 01 00 QRY1 01 R 00
00587 01 02 03 00 00 00587 01 02 03 00 00
00587 02 01 00 SAMAS_TRANSACTI ONS 02 I 01 I XSTR08 00587 02 01 00 SAMAS_TRANSACTI ONS 02 I 01 I XSTR08
00587 02 02 01 FUND_CODES 03 I 02 I XFUN01 00587 02 02 01 FUND_CODES 03 I 02 I XFUN01
00587 02 03 01 OBJ ECT_CODES 04 I 01 I XOBJ 01 00587 02 03 01 OBJ ECT_CODES 04 I 01 I XOBJ 01
00587 02 04 01 APPRO_CATEGORY_CDS 05 I 01 I XACC01 00587 02 04 01 APPRO_CATEGORY_CDS 05 I 01 I XACC01
00587 02 05 03 00 00 00587 02 05 03 00 00
86 86
Example: SAMAS Query1
Example: SAMAS Query1
I O SNU SNJ SNO SNG SCU SCJ SCO SCG PF I O SNU SNJ SNO SNG SCU SCJ SCO SCG PF
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
N N N N N N N N N S N N N N N N N N N S
N N N N N N N N Y N N N N N N N N Y
N N N N N N N N N S N N N N N N N N N S
Y N N N N N N N N Y N N N N N N N N
Y N N N N N N N N Y N N N N N N N N
Y N N N N N N N N Y N N N N N N N N
N N N N N N N N Y N N N N N N N N Y
87 87
Example: SAMAS Query2
Example: SAMAS Query2
SET
SET
CURRENT
CURRENT
SQLID
SQLID
=
=
'FSUDBA'
'FSUDBA'
;
;
EXPLAIN
EXPLAIN
PLAN
PLAN
SET
SET
QUERYNO
QUERYNO
=
=
1
1
FOR
FOR
SELECT
SELECT
MACH_DATE
MACH_DATE
,
,
FISCAL_YEAR
FISCAL_YEAR
,
,
CHARGE_ORG
CHARGE_ORG
,
,
PRIMARY_DOC_NUM
PRIMARY_DOC_NUM
,
,
AMOUNT
AMOUNT
FROM
FROM
FSDBA
FSDBA
.
.
SAMAS_TRANSACTIONS
SAMAS_TRANSACTIONS
WHERE
WHERE
MACH_DATE
MACH_DATE
>=
>=
'2001
'2001
-
-
07
07
-
-
01'
01'
AND
AND
MACH_DATE
MACH_DATE
<=
<=
'2002
'2002
-
-
06
06
-
-
30'
30'
AND
AND
FISCAL_YEAR
FISCAL_YEAR
IN
IN
(
(
'20012002'
'20012002'
,
,
'20012002'
'20012002'
)
)
AND
AND
BUDGET_ENTITY
BUDGET_ENTITY
=
=
'48900100'
'48900100'
88 88
Example: SAMAS Query2
Example: SAMAS Query2
AND
AND
APPRO_CATEGORY
APPRO_CATEGORY
=
=
'010000'
'010000'
AND
AND
CERTIFY_FORWARD
CERTIFY_FORWARD
=
=
' '
' '
AND
AND
GL
GL
LIKE
LIKE
'7%'
'7%'
AND
AND
(
(
SUBSTR
SUBSTR
(
(
DATE_TAG
DATE_TAG
,
,
1
1
,
,
2
2
))
))
=
=
' '
' '
AND
AND
(
(
SUBSTR
SUBSTR
(
(
DATE_TAG
DATE_TAG
,
,
1
1
,
,
2
2
))
))
IN
IN
(
(
'01'
'01'
,
,
'02'
'02'
,
,
'03'
'03'
,
,
'04'
'04'
,
,
'05'
'05'
,
,
'06'
'06'
,
,
'07'
'07'
,
,
'08'
'08'
,
,
'09'
'09'
,
,
'10'
'10'
,
,
'11'
'11'
,
,
'12'
'12'
)
)
AND
AND
PRIMARY_DOC_NUM
PRIMARY_DOC_NUM
LIKE
LIKE
'_OT%'
'_OT%'
ORDER
ORDER
BY
BY
MACH_DATE
MACH_DATE
,
,
FISCAL_YEAR
FISCAL_YEAR
FOR
FOR
FETCH
FETCH
ONLY
ONLY
;
;
89 89
Example: SAMAS Query2
Example: SAMAS Query2
SELECT SELECT SUBSTR SUBSTR( (DIGITS DIGITS( (QUERYNO QUERYNO), ),6 6, ,5 5) ) AS AS QUERY QUERY, ,
SUBSTR SUBSTR( (DIGITS DIGITS( (QBLOCKNO QBLOCKNO), ),4 4, ,2 2) ) AS AS BLOCK BLOCK, ,
SUBSTR SUBSTR( (DIGITS DIGITS( (PLANNO PLANNO), ),4 4, ,2 2) ) AS AS PLAN PLAN, ,
SUBSTR SUBSTR( (DIGITS DIGITS( (METHOD METHOD), ),4 4, ,2 2) ) AS AS METH METH, ,
TNAME TNAME, , SUBSTR SUBSTR( (DIGITS DIGITS( (TABNO TABNO), ),4 4, ,2 2) ) AS AS TABNO TABNO, ,
ACCESSTYPE ACCESSTYPE AS AS TYPE TYPE, , SUBSTR SUBSTR( (DIGITS DIGITS( (MATCHCOLS MATCHCOLS), ),4 4, ,2 2) ) AS AS
MC MC, , ACCESSNAME ACCESSNAME AS AS ANAME ANAME, , INDEXONLY INDEXONLY AS AS IO IO, ,
SORTN_UNIQ SORTN_UNIQ AS AS SNU SNU, , SORTN_J OIN SORTN_J OIN AS AS SNJ SNJ , , SORTN_ORDERBY SORTN_ORDERBY
AS AS SNO SNO, ,
SORTN_GROUPBY SORTN_GROUPBY AS AS SNG SNG, , SORTC_UNIQ SORTC_UNIQ AS AS SCU SCU, , SORTC_J OIN SORTC_J OIN
AS AS SCJ SCJ , , SORTC_ORDERBY SORTC_ORDERBY AS AS SCO SCO, , SORTC_GROUPBY SORTC_GROUPBY AS AS SCG SCG, ,
PREFETCH PREFETCH AS AS PF PF
FROM FROM FSUDBA FSUDBA. .PLAN_TABLE PLAN_TABLE
WHERE WHERE QUERYNO QUERYNO = =1 1 ORDER ORDER BY BY 1 1, , 2 2, , 3 3; ;
DELETE DELETE FROM FROM FSUDBA FSUDBA. .PLAN_TABLE PLAN_TABLE WHERE WHERE QUERYNO QUERYNO = =1 1; ;
90 90
Example: SAMAS Query2
Example: SAMAS Query2
QUERY BLOCK PLAN METH TNAME TABNO TYPE MC ANAME QUERY BLOCK PLAN METH TNAME TABNO TYPE MC ANAME
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
00001 01 01 00 SAMAS_TRANSACTI ONS 01 R 00 00001 01 01 00 SAMAS_TRANSACTI ONS 01 R 00
00001 01 02 03 00 00 00001 01 02 03 00 00
I O SNU SNJ SNO SNG SCU SCJ SCO SCG PF I O SNU SNJ SNO SNG SCU SCJ SCO SCG PF
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
N N N N N N N N N S N N N N N N N N N S
N N N N N N N Y N N N N N N N N Y N
91 91
DB2 Insight
DB2 Insight
Use DB2 Insight to determine how much
Use DB2 Insight to determine how much
CPU is used by your query
CPU is used by your query
You can look at information during and after
You can look at information during and after
your query executes
your query executes
Demo
Demo
Goal
Goal
--
--
> REDUCE the COST !!!
> REDUCE the COST !!!
92 92
Review Performance Tuning
Review Performance Tuning
Write your SQL to maximize use of Indexes
Write your SQL to maximize use of Indexes
and Stage 1 Predicates
and Stage 1 Predicates
Use an EXPLAIN Report to understand how
Use an EXPLAIN Report to understand how
DB2 plans to access the data
DB2 plans to access the data
Run REORGs and RUNSTATs as needed
Run REORGs and RUNSTATs as needed
Use Insight for obtaining actual CPU costs
Use Insight for obtaining actual CPU costs