Você está na página 1de 196

Platform: z/OS Application Development

Advanced and Complex SQL Coding


Sheryl M. Larsen Sheryl M. Larsen, Inc.
2013
IDUG, World Wide

Sheryl M. Larsen, Inc.


DB2 SQL Consulting & Education
Sheryl Larsen is an internationally recognized researcher, consultant and lecturer, specializing in DB2 and is known for her extensive expertise in SQL. She co-authored a book, DB2 Answers, OsborneMcGraw-Hill, 1999. She was voted an inaugural IBM Information Champion 2009 , IDUG Speaker Hall of Fame and, a member of IBMs DB2 Gold Consultants program since 1994. Sheryl has over 20 years experience in DB2, has published articles, white papers, webtv:
WWW.IBM.DEVELOPERWORKS.COM WWW.CA.COM WWW.BMC.COM WWW.SOFTBASE.COM

Currently, she is President of the Midwest Database Users Group (mwdug.org), and owns Sheryl M. Larsen, Inc., a firm specializing in Advanced DB2 Consulting and Education.
(630) 399-3330
WWW.SMLSQL.COM

Contact: smlsql@comcast.net

Sheryl M. Larsen, Inc. 2000-2012

Table of Contents - Coding


SQL Performance DB2 Engine Components Predicate Processing Intelligence Optimizer Details SQL Performance Rules Simple to Complex Relational Division Joins Table Expressions END of Session I Outer Joins Basic Subqueries Advanced Subqueries Global Temporary Tables Created Declared Practical Uses END of Session II Recursive queries Basic syntax How does Recursion Start How does Recursion Stop CASE Basic Syntax The True Power Complex Examples END of Session III V8 SQL Enhancements Multi-row INSERT Multi-row FETCH Dynamic Scrollable Cursors GROUP BY Expression Materialized Query Tables INSERT with SELECT DB2 9 SQL Enhancements END of Session IV
Appendix A: DB2 10 SQL Enhancements Appendix B: DB2 V8 SQL Additional Enhancements Appendix C: Repositioning Cursors
Sheryl M. Larsen, Inc. 2000-2012

SQL Performance
DB2 Engine Components Predicate Processing Intelligence Optimizer Details SQL Performance Rules

DB2 EngineSQL Components Execution


Result
Work Files

SQL
Optimizer

Stage 2 z/OS Residual LUW


RID Pool

Catalog
Meta Data

Stage 1 z/OS Sargable LUW

Directory
Access Plans

Buffer Pool

Dynamic Statement Cache

Buffer Manager
Data Index
RIDs

DB2 V8 Enhancements
8K 16K 32K Pages 64 Bit Addressing

Result

SQL
Optimizer

2M Statement Length Multi-row FETCH Multi-row INSERT SELECT INTO w/ ORDER BY Common Table Expressions Recursive SQL IS NOT DISCTINCT FROM Scalar Fullselect GROUP BY Expression Dynamic Scrollable Cursors INSERT with SELECT Multiple DISTINCT Clauses Sequences

Work Files
RID Pool

Stage 2

Catalog
Meta Data
Top & Bottom NUDS

Parallel Sort
Stage 1 Unlike Data Types IS NOT NULL IS NOT DISTINCT FROM

Directory Stage 1 Dynamic Access Plans Statement More Hybrid Joins Buffer Pool Cache

Buffer Manager
Data
SMLI 2009

Forward and Backward Index DPSI Indexes

Materialized Query Tables

Index
RIDs

Index only on VARCHAR Indexes


6

DB2 9 WOW!
In Memory GLOBAL TEMP TABLES Views Table Expressions

TRUNCATE MERGE SELECT FROM UPDATE/DELETE EXCEPT, INTERSECT OLAP Expressions ORDER BY / FETCH FIRST in Subselect

Result

SQL
Histogram Statistics
Optimizer

Work Files
Sparse Indexes for more Work Files Faster Sorts for GROUP BY DISTINCT, ORDER BY

Stage 2
In Memory
RID Pool

Catalog
Meta Data

Global Optimization

Stage 1 Dynamic Statement Buffer Pool Cache

Directory
Access Plans

More Parallelism
Page Range Index Screening For Partitioned Indexes

Buffer Manager
Data Index
RIDs
Sheryl M. Larsen, Inc. 2000-2012

Index on Expression
7

4K Page Processing z/OS


Work Files

Stage 2
4K

Stage 1 Buffer Pool


Buffer Manager
Data Index
8

Sheryl M. Larsen, Inc. 2000-2012

Indexable Stage 1 Predicates


Predicate Type COL = value COL = noncol expr COL IS NULL COL op value COL op noncol expr COL BETWEEN value1 AND value2 COL BETWEEN noncol expr1 AND noncol expr2 COL LIKE 'pattern' COL IN (list) COL LIKE host variable T1.COL = T2.COL T1.COL op T2.COL COL=(non subq) COL op (non subq) COL op ANY (non subq) COL op ALL (non subq) COL IN (non subq) COL = expression (COL1,...COLn) IN (non subq) (COL1, COLn) = (value1, valuen) T1.COL = T2.colexpr COL IS NOT NULL COL IS NOT DISTINCT FROM value COL IS NOT DISTINCT FROM noncol expression COL IS NOT DISTINCT FROM col expression COL IS NOT DISTINCT FROM non subq T1.COL IS NOT DISTINCT FROM T2.COL T1.COL IS NOT DISTINCT FROM T2.col expression Indexable Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Stage 1 Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y

Stage 1 Predicates
Predicate Type COL <> value COL <> noncol expr COL NOT BETWEEN value1 AND value2 COL NOT BETWEEN noncol expr1 AND noncol expr2 COL NOT IN (list) COL NOT LIKE ' char' COL LIKE '%char' COL LIKE '_char' T1.COL <> T2.COL T1.COL1 = T1.COL2 COL <> (non subq) COL IS DISTINCT FROM
1.

Indexable N N N N N N N N N N N N

Stage 1 Y Y Y Y Y Y Y Y Y Y Y Y

Indexable = The predicate is a candidate for Matching Index access. When the optimizer chooses to use a predicate in the probe of the index, the condition is named Matching (matching the index). This is the first point that filtering is possible in DB2. Index Screening = The Stage 1 predicate is a candidate for filtering on the index leaf pages. This is the second point of filtering in DB2. Data Screening = The Stage 1 predicate is a candidate for filtering on the data pages. This is the third point of filtering in DB2. Stage 2 = The predicate is not listed as Stage 1 and will be applied on the remaining qualifying pages from Stage 1. This is the fourth and final point of filtering in DB2.

2.

3.

4.
Y

Sheryl M. Larsen, Inc. 2000-2012

Stage 2 Predicates - z/OS


DB2 9 Manual - Predicate Types and Processing by Stage

V7 may promote join Between

Predicate Type
value BETWEEN COL1 AND COL2 COL BETWEEN COL1 AND COL2 COL BETWEEN expression1 AND expression2 value NOT BETWEEN COL1 AND COL2 T1.COL1 op T1.COL2 T1.COL1 <> T1.COL2 COL = ANY (non subq) COL = ALL (non subq) COL <> ANY (non subq) COL <> ALL (non subq) COL NOT IN (non subq) COL = (cor subq)

Indexable Stage 1
N N N N N N N N N N N N

Stage 1
N N N N N N N N N N N N

Sheryl M. Larsen, Inc. 2000-2012

10

Stage 2 Predicates - z/OS


DB2 9 Manual - Predicate Types and Processing by Stage

Predicate Type
Not made Indexable, . . V7 just rewrites the query to a join
COL = (cor subq) COL = ANY (cor subq) COL = ALL (cor subq) COL op (cor subq) COL op ANY (cor subq) COL op ALL (cor subq) COL <> (cor subq) COL <> ANY (cor subq) COL <> ALL (cor subq) COL IN (cor subq) COL NOT IN (cor subq) EXISTS (subq) NOT EXISTS (subq) expression = value expression <> value expression op value expression op (subquery)
Sheryl M. Larsen, Inc. 2000-2012

Indexable Stage 1
N N N N N N N N N N N N N N N N N

Stage 1
N N N N N N N N N N N N N N N N N
11

Four Points of Filtering DB2


1. 2. 3. 4. Stage 2
WHERE C.LAST_NM LIKE ? AND C.TOKEN_NR = Indexable Stage 1 Probe B.TOKEN_NR Stage 1 Index Filtering C.ROLE_CD > ? AND CASE C.SEX WHEN X Stage 1 Data Filtering Type 2 Index THEN ? END = ABCDE

1
Non-Leaf Page O O O

C1.C2.C3 TOKEN_NR. O O O

Root Page

ROLE_CD
Non-Leaf Page O O Non-Leaf Page O O O O

2
Leaf Page o o o o o o Leaf Page o o o o o o Leaf Page o o o o o o Leaf Page o o o o o o Leaf Page o o o o o o Leaf Page o o o o o o Leaf Page o o o o o o Leaf Page o o o o o o o

SQL Performance Rules ..

Promote Stage 2s/Residuals if possible


Value BETWEEN COL1 AND COL2 is Stage 2 Rewrite to: (Value >= COL1 AND value <= COL2) COL NOT IN (K, S, T) = COL IN (known values)

SELECT only the columns needed


Disallow SELECT *

SELECT only the rows needed


Disallow program filtering

Use constants and literals if the values will not change in the next 3 years
Increase optimizer accuracy for static values
Sheryl M. Larsen, Inc. 2000-2012

13

Stage 2 Conditions
UPPER(LTRIM(RTRIM(TM.LAST_CHNG_USER_ID))) = UPPER(LTRIM(RTRIM(WU.USER_ID)))

Should be: TM.LAST_CHNG_USER_ID =

WU.USER_ID

CURRENT DATE BETWEEN GRP_DTL_EFF_DT AND GRP_DTL_TERM_DT


Should be: CURRENT DATE >= GRP_DTL_EFF_DT AND CURRENT DATE <= GRP_DTL_TERM_DT

SQL Performance Rules


Make WHERE clause data types match


Costs more to navigate indexes when not matching

Do not SELECT columns with known static values


Disallow COLn from SELECT list if COLn = value

Do not place any local filtering in the ON clause for OUTER JOINs
Disallow during join filtering, encourage before join

Sequence filtering from most restrictive to least restrictive by table, by predicate type
WHERE AND AND AND AND A.COL2 = abracadabra A.COL1 IN (:hv1, :hv2, :hv3) A.COL4 > :hvcol4 A.COL3 > :hvcol3 A.COL5 LIKE %SON
Sheryl M. Larsen, Inc. 2000-2012

Ties Matter!
15

Data Type Conversions


WHERE DATE(col_TS) BETWEEN :date1 AND :date2

WHERE col_TS BETWEEN TIMESTAMP(:date1, 00:00:00) AND TIMESTAMP(:date2, 59:59:99)

Need to leave columns alone and translate the second argument


Sheryl M. Larsen, Inc. 2000-2012

16

Host Variable Filter Factors


(DB2 Database Administration Guide- Properties of Predicates)
COLCARDF >=100,000,000 >=10,000,000 >=1,000,000 >=100,000 >=10,000 >=1,000 >=100 >=2 =1 <=0 Factor for <, <=, >, >= 1/10,000 1/3,000 1/1,000 1/300 1/100 1/30 1/10 1/3 1/1 1/3 Factor for LIKE or BETWEEN 3/100,000 1/10,000 3/10,000 1/1,000 3/1,000 1/100 3/100 1/10 1/1 1/10

COLCARD

Factor for <, <=, >, >= BETWEEN, LIKE 1/100,000,000 1/10,000,000 1/1,000,000 1/100,000 1/10,000 1/1,000 1/100 1/3
17

>=100,000,000 >=10,000,000 >=1,000,000 >=100,000 >=10,000 >=1,000 >=100 >=0

Sheryl M. Larsen, Inc. 2000-2012

SQL Review Checklist


1.
2. 3. 4. 5.

6.
7. 8.

Examine Program logic Examine FROM clause Verify Join conditions Promote Stage 2s/Residuals Prune SELECT lists Verify local filtering sequence Analyze Access Paths Tune if necessary
Sheryl M. Larsen, Inc. 2000-2012

18

SQL Portfolio- DB2 9 z/OS vs. DB2 9.5 LUW


Stage1 unlike data types, Multi-row INSERT, FETCH, Multi-row cursor UPDATE, Dynamic Scrollable Cursors, Multiple CCSIDs per statement, GET DIAGNOSTICS, Enhanced UNICODE, IS NOT DISTINCT FROM, VARBINARY, FETCH CONTINUE, MERGE

Inner and Outer Joins, Table Expressions, Subqueries, GROUP BY, Complex Correlation, Global Temporary Tables, CASE, 100+ Built-in Functions including SQL/XML, Limited Fetch, Insensitive Scrollable Cursors, UNION Everywhere, MIN/MAX Single Index Support, Self Referencing Updates with Subqueries, Sor Avoidance for ORDER BY, and Row Expressions 2M Statement Length, GROUP BY Expression, Sequences, Scalar Fullselect, Materialized Query Tables, Common Table Expressions, Recursive SQL, CURRENT PACKAGE PATH, VOLATILE Table Support, Star Join Sparse Index, Qualified Column names, Multiple DISTINCT clauses, ON COMMIT DROP, Transparent ROWID Column, call from trigger, statement isolation, FOR READ ONLY KEEP UPDATE LOCKS, SET CURRENT SCHEMA, client special registers, long SQL Object names, SELECT FROM INSERT, UPDATE, DELETE, MERGE, INSTEAD OF TRIGGER, Native SQL Procedure Language, BIGINT, file reference variables, XML, FETCH FIRST & ORDER BY IN subselect and fullselect, caseless comparisons, INTERSECT, EXCEPT, not logged tables, DECIMAL FLOAT, XQuery,TRUNCATE OLAP Functions, Session variables, OmniFind, Spatial, ROLE

GROUPING SETS, ROLLUP, CUBE, Many Built-in Functions, SET CURRENT ISOLATION , multi-site join, MERGE, ARRAY data type, global variables, Oracle syntax, XML enhancements
Sheryl M. Larsen, Inc. 2000-2012

19

DB2 10 z/OS vs. DB2 10 LUW


Multi-row INSERT, FETCH & multi-row cursor UPDATE, Dynamic Scrollable Cursors, GET DIAGNOSTICS, Enhanced UNICODE SQL, join across encoding schemes, IS NOT DISTINCT FROM, VARBINARY, FETCH CONTINUE, MERGE, SELECT from MERGE, routine versioning, timestamps w/timezone

Inner and Outer Joins, Table Expressions, Subqueries, GROUP BY, Complex Correlation, Global Temporary Tables, CASE, 100+ Built-in Functions including SQL/XML, Limited Fetch, Insensitive Scroll Cursors, UNION Everywhere, MIN/MAX Single Index, Self Referencing Updates with Subqueries, Sort Avoidance for ORDER BY, and Row Expressions, 2M Statement Length, GROUP BY Expression, Sequences, Scalar Fullselect, Materialized Query Tables, Common Table Expressions, Recursive SQL, CURRENT PACKAGE PATH, VOLATILE Tables, Star Join Sparse Index, Qualified Column names, Multiple DISTINCT clauses, ON COMMIT DROP, Transparent ROWID Column, Call from trigger, statement isolation, FOR READ ONLY KEEP UPDATE LOCKS, SET CURRENT SCHEMA, Client special registers, long SQL object names, SELECT from INSERT, UPDATE or DELETE, INSTEAD OF TRIGGER, Native SQL Procedure Language, BIGINT, file reference variables, XML, FETCH FIRST & ORDER BY in subselect & fullselect, caseless comparisons, INTERSECT, EXCEPT, not logged tables, OmniFind, spatial, range partitions, data compression, session variables, DECIMAL FLOAT, optimistic locking, ROLE, TRUNCATE, index & XML compression, created temps, inline LOB, administrative privileges, implicit cast, date/time changes, currently committed, moving sum & average, index include columns, row and column access control, time travel query, XML enhancements
Updateable UNION in Views, GROUPING SETS, ROLLUP, CUBE, more Built-in Functions, SET CURRENT ISOLATION, multi-site join, MERGE, MDC, XQuery,, additional data type (array, row, cursor), global variables, even more vendor syntax, 20 temp table compression, MODULEs

DB2 11 SQL Standard SQL support (not exhaustive, some features may be missing)
DB2 11 for z/OS and DB2 10.5 Linux, Unix & Windows

z
c o m m o n l u w

Multi-row INSERT, FETCH & multi-row cursor UPDATE, Dynamic Scrollable Cursors, GET DIAGNOSTICS, Enhanced UNICODE SQL, join across encoding schemes, IS NOT DISTINCT FROM, VARBINARY, FETCH CONTINUE, SELECT FROM MERGE, MERGE, routine versioning, transparent archive query

Inner and Outer Joins, Table Expressions, Subqueries, GROUP BY, Complex Correlation, Global Temporary Tables, CASE, 100+ Built-in Functions including SQL/XML, Limited Fetch, Insensitive Scroll Cursors, UNION Everywhere, MIN/MAX Single Index, Self Referencing Updates with Subqueries, Sort Avoidance for ORDER BY, and Row Expressions, 2M Statement Length, GROUP BY Expression, Sequences, Scalar Fullselect, Materialized Query Tables, Common Table Expressions, Recursive SQL, CURRENT PACKAGE PATH, VOLATILE Tables, Star Join Sparse Index, Qualified Column names, Multiple DISTINCT clauses, ON COMMIT DROP, Transparent ROWID Column, Call from trigger, statement isolation, FOR READ ONLY KEEP UPDATE LOCKS, SET CURRENT SCHEMA, Client special registers, long SQL object names, SELECT from INSERT, UPDATE or DELETE, INSTEAD OF TRIGGER, SQL PL in routines, BIGINT, file reference variables, XML, FETCH FIRST & ORDER BY in subselect & fullselect, caseless comparisons, INTERSECT, EXCEPT, MERGE not logged tables, OmniFind, spatial, range partitions, data compression, DECFLOAT, optimistic locking, ROLE, TRUNCATE, index & XML compression, created temps, inline LOB, administrative privileges, implicit cast, increased timestamp precision, currently committed, moving sum & average, index include columns, row and column access controls, time travel query, GROUPING SETS, ROLLUP, CUBE, global variables, Text Search functions, accelerated tables, DROP COLUMN, array data type, XML enhancements
Updateable UNION in Views, more Built-in Functions, SET CURRENT ISOLATION, multi-site join, full MERGE, MDC, XQuery, additional data type (row, cursor), even more vendor syntax, temp table compression, MODULEs

Name: __________________
Level

SQL Skill Self Assessment

Assessment = YOU CAN FULLY UNDERSTAND THE FEATURE AND PROPER USE OF:

Before:_______

0 1

You think SQL is a new energy drink Simple SELECT statements, WITH clause, ORDER BY WHERE clauses, BETWEEN, LIKE, IN(list), =, >=, >, <, <=, <>, NOT IN(list), NOT LIKE, NOT BETWEEN, DISTINCT Table joins (inner, outer, full), UNION, UNION ALL, CONCAT, static CURSORs, FOR UPDATE OF, ROW_NUMBER, EXCEPT, INTERCEPT noncorrelated and correlated subqueries, EXISTS, NOT EXISTS, FETCH FIRST x ROWS ONLY, OPTIMIZE FOR x ROWS, MERGE, TRUNCATE Indexable, Stage1 and Stage 2 predicate evaluation, multirow FETCH/INSERT, GET DIAGNOSTICS, Scalar full SELECT

Table expressions/common table expressions, GROUP BY, HAVING, IS NOT DISTINCT FROM, embedded dynamic SQL, ORDER BY/FETCH FIRST in subselect, FETCH CONTINUE
CASE expressions, Global Temporary Table (GTT), Declared Temporary Table (DTT), Dynamic Scrollable cursors, SEQUENCES/IDENTITY Queries involving > 10 tables, INSERT within (SELECT , UPDATE, DELETE, MERGE), Star Schema, GROUP BY expression MQT (Materialized Query Tables), Recursive SQL, UNION in Views, > 30 useful Built-in Functions, DENSE_RANK, RANK Codes effective and efficient SQL applying performance rules and knows when to use each SQL feature appropriately

10

After:________

Simple to Complex Relational Division


Joins Table Expression GROUP BY Expression Subqueries
23

Relational Division
Joins

UNION

Subqueries

Table

Expressions

Sheryl M. Larsen, Inc. 2000-2012

24

225 Tables in SQL Statement Limit


225 directly or indirectly identifying base table references:
SELECT .. FROM T1, T2, .T200 WHERE C1 IN (SELECT .. FROM T300 more tables) UNION ALL (SELECT FROM T400 more tables) . etc.

Sheryl M. Larsen, Inc. 2000-2012

25

Join Basics

Evaluation of Filtering Join conditions


Indexable
In order of index columns, one column past the last = condition

Stage 1/Sargable and on index (index screening)


= first, then range conditions, LIKE, noncorrelated subqueries

Stage 1/Sargable on data page rows that pass prior tests


= first, then range conditions, LIKE, noncorrelated subqueries

Stage 2 on rows that pass prior tests


= first, then range conditions, LIKE, noncorrelated subqueries, correlated subqueries
Sheryl M. Larsen, Inc. 2000-2012

26

Inner Join Produce a list of the accounts numbers, current servicing agent start date
for all active Insurance Payment Plan accounts.

SELECT

FROM
WHERE AND AND AND

T42.PLCY_ACCT_NUM ,T52.SERV_ASGN_START_DT CLIENT T42 ,AGENT T52 T42.PLCY_ID = T52.PLCY_ID T42.LOB = S T42.CLNT_PLCY_END_DT IS NULL T52.SERV_ASGN_END_DT IS NULL

List Most Restrictive Condition first within predicate type = , IN BETWEEN, >=, >,<,<= LIKE, Noncorrelated Subqueries Correlated Subqueries
Sheryl M. Larsen, Inc. 2000-2012

27

Self Join

Needed for Intra-Table Column Comparisons


WHERE A.COL2 = A.COL5 On different rows (accounts, policies, items, orders, other unique ids, etc.) What Students Have the Same Classes?
SELECT SSS.SID, SSS.CLASS_ID, SSS.TIME_ID FROM SMLU_STUDENT_SCHED SS ,SMLU_STUDENT_SCHED SSS Self Join to get same WHERE SSS.CLASS_ID = SS.CLASS_ID class/time rows AND SSS.TIME_ID = SS.TIME_ID AND SSS.SID <> SS.SID AND SSS.SID NOT IN(list challenged student IDs) AND SS.SID = :challenged-sid

Point to Different Rows

Sheryl M. Larsen, Inc. 2000-2012

Homework Challenged

28

Left/Right Outer Joins


Get

all of Client ids for single males


T40.CLNT_ID, COALESCE(T71.EML_ADDR, 'NONE AVAIL') CLIENT T40 LEFT OUTER JOIN EMAIL T71 T40.CLNT_ID = T71.CLNT_ID Client T40.MRTL_STTS = 'S' T40 T40.GNDR = 'M'

Regardless if there are any email addresses


SELECT

FROM

ON WHERE AND

Email T71
Sheryl M. Larsen, Inc. 2000-2012

29

Table Expression Basics

SELECT statements in the FROM clause

Parenthesis required AS expression_name is required Cannot include ORDER BY or FETCH FIRST n ROWS ONLY in z/OS
SELECT

Until DB2 9 Very Powerful!

IFNULL(O.ORDER_NO, Order Number not Available) , COALESCE(D.DESC, Description not Available) FROM (SELECT O.ORDER_NO FROM ORDER O WHERE O.ORDER_DATE BETWEEN 1999-01-01 AND CURRENT DATE) AS O FULL JOIN (SELECT D.DESC, D.ORDER_NO FROM DESCRIPTIONS D WHERE LENGTH(D.DESC < 40) AS D ON O.ORDER_NO = D.ORDER_NO
Sheryl M. Larsen, Inc. 2000-2012

30

Table Expression for Left Join

When the business question requires filtering on the NULL supplying table before the join
Table expression is required or else Stage 2 filtering
SELECT O.ORDER_NO , COALESCE(D.DESC, Short Description not Available) FROM ORDER O LEFT JOIN (SELECT D.DESC, D.ORDER_NO FROM DESCRIPTIONS D WHERE LENGTH(D.DESC) < 40) AS D ON O.ORDER_NO = D.ORDER_NO WHERE O.ORDER_DATE BETWEEN 1999-01-01 AND CURRENT DATE

Sheryl M. Larsen, Inc. 2000-2012

31

Table Expression Uses


To pre-filter FULL JOIN tables To pre-filter null supplying tables of LEFT/RIGHT joins

To separate GROUP BY work (GROUP BY push down) To generate or derive data To improve flexibility of queries
Using :hostvariables Reducing dependency on static views

Multi-step processing
To tune queries
Sheryl M. Larsen, Inc. 2000-2012

32

A Typical Detail/Aggregate Report


SELECT C.CUST_ID ,MIN(C.CUST_NAME) AS CUST_NAME ,MIN(C.CUST_PHONE)AS CUST_PHONE ,SUM(S.SALES) AS TOTAL_SALES FROM CUSTOMER C, SALES S WHERE C.CUST_ID = S.CUST_ID AND S.SALES_DATE BETWEEN :date-lo AND :date-hi GROUP BY C.CUST_ID FETCH FIRST 22 ROWS ONLY

Sheryl M. Larsen, Inc. 2000-2012

33

Table Expression to Separate Work


Separate

GROUP BY work

SELECT C.CUST_NAME, C.CUST_PHONE, S.TOTAL_SALES FROM CUSTOMER C , (SELECT S.CUST_ID, SUM(S.SALES) AS TOTAL_SALES FROM SALES S WHERE S.SALES_DATE BETWEEN :date-lo AND :date-hi GROUP BY S.CUST_ID) AS S WHERE C.CUST_ID = S.CUST_ID FETCH FIRST 22 ROWS ONLY

Sheryl M. Larsen, Inc. 2000-2012

34

Table Expression To Generate Anything Expression


SELECT T40.YEAR_BORN, COUNT(*) FROM (SELECT YEAR(BIRTH_DT) AS YEAR_BORN FROM KM40 ) AS T40 Allowed Here GROUP BY T40.YEAR_BORN in LUW and ORDER BY T40.YEAR_BORN z/OS V8

Expression can be anything you want to generate:


SUBSTR(COL1, 1, 5) CASE expressions Calculations involving columns and/or variables and/or special registers UDF2(:parm1, :parm2)
Sheryl M. Larsen, Inc. 2000-2012

35

GROUP BY expression
SELECT C.SUBCATEGORY, SUM(S.SALES) AS S.TOTAL_SALES FROM SALES S , (SELECT C.CUST_ID, SUBSTR(C.COLX, :hvstart, :hvlngth) AS SUBCATEGORY FROM CUSTOMER C WHERE C.CUST_REGION BETWEEN :reg-lo AND :reg-high) AS C WHERE C.CUST_ID = S.CUST_ID GROUP BY C.SUBCATEGORY

Grouping by a portion of a column


For periodic reporting Beware of frequent executions with the same variables
Portion should be its own column
Sheryl M. Larsen, Inc. 2000-2012

36

Quarterly Reports
SELECT C.SUBCATEGORY, SUM(S.SALES) AS S.TOTAL_SALES FROM CUSTOMER C , (SELECT S.CUST_ID, S.SALES,

(CASE WHEN MONTH(SALE_DT) BETWEEN 2 AND 4 THEN Q1 WHEN MONTH(SALE_DT) BETWEEN 5 AND 7 THEN Q2 WHEN MONTH(SALE_DT) BETWEEN 8 AND 10 THEN Q3 ELSE Q4 END) AS SUBCATEGORY
FROM SALES S ) AS S WHERE C.CUST_ID = S.CUST_ID AND C.CUST_REGION BETWEEN :reg-lo AND :reg-high GROUP BY C.SUBCATEGORY

Grouping by your quarters


When QUARTER(DATE_COL) does not line up with your quarters

Sheryl M. Larsen, Inc. 2000-2012

37

V8 Quarterly Report
SELECT (CASE WHEN MONTH(SALE_DT) BETWEEN 2 AND 4 THEN Q1 WHEN MONTH(SALE_DT) BETWEEN 5 AND 7 THEN Q2 WHEN MONTH(SALE_DT) BETWEEN 8 AND 10 THEN Q3 ELSE Q4 END) AS C.SUBCATEGORY , SUM(S.SALES) AS S.TOTAL_SALES
SALES C

FROM

WHERE C.CUST_REGION BETWEEN :reg-lo AND :reg-high) AS C

GROUP BY (CASE WHEN MONTH(C.SALE_DT) BETWEEN 2 AND 4 THEN Q1 WHEN MONTH(C.SALE_DT) BETWEEN 5 AND 7 THEN Q2 WHEN MONTH(C.SALE_DT) BETWEEN 8 AND 10 THEN Q3 ELSE Q4 END)

;
38

Sheryl M. Larsen, Inc. 2000-2012

Any Time Reports


SELECT S.SUBCATEGORY, SUM(S.SALES) AS S.TOTAL_SALES FROM CUSTOMER C, (SELECT C.CUST_ID, (CASE WHEN MONTH(SALE_DT) BETWEEN :hv1a AND :hv1b THEN :hv1 WHEN MONTH(SALE_DT) BETWEEN :hv2a AND :hv2b THEN :hv2 WHEN MONTH(SALE_DT) BETWEEN :hv3a AND :hv3b THEN :hv3 WHEN MONTH(SALE_DT) BETWEEN :hv4a AND :hv4b THEN :hv4 WHEN MONTH(SALE_DT) BETWEEN :hv5a AND :hv5b THEN :hv5 WHEN MONTH(SALE_DT) BETWEEN :hv6a AND :hv6b THEN :hv6 WHEN MONTH(SALE_DT) BETWEEN :hv7a AND :hv7b THEN :hv7 WHEN MONTH(SALE_DT) BETWEEN :hv8a AND :hv8b THEN :hv8 WHEN MONTH(SALE_DT) BETWEEN :hv9a AND :hv9b THEN :hv9 WHEN MONTH(SALE_DT) BETWEEN :hv10a AND :hv10b THEN :hv10 WHEN MONTH(SALE_DT) BETWEEN :hv11a AND :hv11b THEN :hv11 ELSE :hv12 END) AS SUBCATEGORY FROM SALES S ) AS S WHERE C.CUST_ID = S.CUST_ID AND C.CUST_REGION BETWEEN :reg-lo AND :reg-high GROUP BY S.SUBCATEGORY
Sheryl M. Larsen, Inc. 2000-2012

39

Any Data Reports


SELECT C.SUBCATEGORY, SUM(S.SALES) AS S.TOTAL_SALES FROM SALES S ,(SELECT C.CUST_ID ,UDFUNC2(C.ZIP_CODE, :hvparm2) AS SUBCATEGORY FROM CUSTOMER C WHERE C.CUST_REGION BETWEEN :reg-lo AND :reg-high) AS C WHER C.CUST_ID = S.CUST_ID GROUP BY C.SUBCATEGORY

Grouping by nonDB2 data


When what you want does not live or breath on local DB2

Can use generated data anywhere outside the table expression as long as you name it
Sheryl M. Larsen, Inc. 2000-2012

40

Correlated Table Expressions

Advantage over correlated subquery


access both sets of data

Performance gains
access path changes (more on LUW) Reduced processing and/or materialization

SELECT Columns from either set of data FROM table1 T1 ,TABLE(SELECT T2.STUDENT_YEAR, SUM(C8) AS SUM8, MAX(C9) AS MAX9 FROM table2 T2 WHERE T1.column = T2.column GROUP BY T2.STUDENT_YEAR) AS T2
41

Sheryl M. Larsen, Inc. 2000-2012

Correlated Table Expressions


Get

a students class load, and average & max class load of their peers

SELECT SR.NAME, SS.CLASS_LOAD, P.AVG_CLASS_LOAD, P.MAX_CLASS_LOAD FROM SMLU_STUDENT_ROSTER SR , TABLE(SELECT SR2.STUDENT_YEAR ,AVG(SR2.NUM_OF_CLASSES) AS AVG_CLASS_LOAD ,MAX(SR2.NUM_OF_CLASSES) AS MAX_CLASS_LOAD FROM SMLU_STUDENT_ROSTER SR2 WHERE SR.STUDENT_YEAR = SR2.STUDENT_YEAR GROUP BY SR2.STUDENT_YEAR) AS P , TABLE(SELECT SS.SID, COUNT(*) AS SS.CLASS_LOAD FROM SMLU_STUDENT_SCHED SS WHERE SS.SID = SR.SID GROUP BY SS.SID) as SS
Sheryl M. Larsen, Inc. 2000-2012

42

Multi-step Processing
SELECT S.KING_COUNT/S.TOTAL_CARDS AS PCT_KING , S.QUEEN_COUNT/S.TOTAL_CARDS AS PCT_QUEEN , S.TOTAL_CARDS FROM (SELECT SUM(CASE D.CARD_TYPE WHEN KING THEN 1 END) AS KING_COUNT , SUM(CASE D.CARD_TYPE WHEN QUEEN THEN 1 END) AS QUEEN_COUNT , SUM(D.CARD_TYPE_TOTAL) AS TOTAL_CARDS FROM (SELECT D.CARD_TYPE, COUNT(*) AS CARD_TYPE_TOTAL FROM DECK_OF_CARDS D GROUP BY D.CARD_TYPE) AS D) AS S)

Step 1, 2, 3
Sheryl M. Larsen, Inc. 2000-2012

43

Workshop A
Joins Table Expression GROUP BY expression

44

Workshop Tables
CUSTOMER

CUST_STOCK

STOCKS

DESCRIPTIONS

CUSTOMER Table
CUST_ID 10 12 16 20 22 23 36 CUST_NAME GINGER JONES MARTIN CLARK KELLY JADE JOHN ADAMS SHERYL LARSEN MICHAEL JORDAN MERILIN MONROE CUST_PHONE 6305305584 7736543210 8476543210 4156543210 6303993330 8472323232 5555555555

44
11

DAFFEY DUCK
LIBBY LOU

8886543210
3096543210

STOCKS Table
STOCK_ID CSWB BEAS NTAP IBM ORCL PLAT PTEC CTEC XYZ ABC STOCK_COMPANY_NAME CHARLES SCHWAB BEA SYSTEMS NETWORK APPLIANCES INTERNATIONAL BUSINESS MACHINES ORACLE CORPORATION PLATINUM TECHNOLOGY PHARMACEUTICAL TECHNOLOGY COMMUNICATION TECHNOLOGY XYLOPHONE TECHNOLOGY SESAME STREET

CUST_STOCK Table
CUST_ID 11 11 STOCK_ID BEAS CSWB STOCK_PURCH_DT 1/11/2001 2/4/2001 STOCK_QTY 111 11

11
12 12 12 16

IBM
CSWB ORCL PTEC ABC

2/14/2001
2/4/2001 1/12/2001 2/14/1999 1/16/2001

211
12 23 121 221 16 23 23 23 23 23 23 23 23 BEAS BEAS CSWB CTEC IBM NTAP NTAP ORCL PTEC PTEC XYZ 12/26/1999 1/25/2001 12/23/1999 2/24/2001 1/23/2001 1/26/2001 2/25/2001 12/24/1999 1/24/2001 2/26/2001 2/23/2001 223 123 223 23 123 123 23 223 123 23 23 ABC 12/25/1999 223

16
16 20 20 20 22 22 22 22 22 22 22

CSWB
CTEC CSWB IBM XYZ BEAS CSWB CSWB IBM NTAP ORCL PTEC

2/16/2001
2/14/1998 12/20/1999 1/20/2001 2/20/2001 1/22/2001 12/22/1999 12/22/1999 1/22/2001 2/21/2001 2/22/2001 2/22/2001

116
32 220 120 20 122 222 222 122 22 22 22

23 23 23

36
36 36

ABC
IBM XYZ

1/6/2001
12/6/1962 2/6/2001

136
236 36

DESCRIPTIONS Table
STOCK_ID STOCK_DESCRIPT

CSWB
BEAS NTAP IBM ORCL PTEC CTEC XYZ ABC

AWESOME FINANCIAL STOCK TRADE SERVI


DATABASE TRANSACTIONS BASED SOFTWAR DATABASE CACHING HARDWARE & SOFTWAR MASSIVE HARDWARE, SOFTWARE AND SERV DATABASE SOFTWARE AND APPLICATION S PHARMACEUTICAL SOFTWARE FIRM COMMUNICATION HARDWARE FIRM XYLOPHONE AMPLIFICATION HARDWARE FI CHILDRENS EDUCATION WORKSHOP

#1. Produce a list of CUST_NAMEs, STOCK_IDs, and STOCK_QTY (number of shares purchased in the transaction) for all customers that purchased less than 100 shares of that stock

CUST_NAME

STOCK_ID STOCK_QTY

SHERYL LARSEN SHERYL LARSEN

PTEC ORCL NTAP XYZ CTEC NTAP PTEC XYZ

22 22 22 23 23 23 23 36

------------------------- -------- ----------SHERYL LARSEN

LIBBY LOU MARTIN CLARK KELLY JADE KELLY JADE JOHN ADAMS

CSWB CSWB ABC CTEC XYZ

11 12 16 32 20

MICHAEL JORDAN MICHAEL JORDAN MICHAEL JORDAN MICHAEL JORDAN MERILIN MONROE

13 record(s) selected.

#2. Produce a list of unique STOCK_COMPANY_NAMEs with or without their listed STOCK_IDs from the CUST_STOCKS table. Default missing IDs to ** No ID ** if necessary

ID ---------BEAS CSWB CTEC IBM NTAP ORCL PTEC **NO ID ** ABC XYZ

STOCK_COMPANY_NAME ------------------------BEA SYSTEMS CHARLES SCHWAB COMMUNICATION TECHNOLOGY INTERNATIONAL BUSINESS MACHINES NETWORK APPLIANCES ORACLE CORPORATION PHARMACEUTICAL TECHNOLOGY PLATINUM TECHNOLOGY SESAME STREET XYLOPHONE TECHNOLOGY

10 record(s) selected.

#3. Create a report that lists CUST_NAME, CUST_PHONE, and number of trades, for all stocks purchased by a particular customer. Eliminate any customer from the report that has not bought stocks from at least 4 different companies

CUST_NAME ------------------------SHERYL LARSEN MICHAEL JORDAN

CUST_PHONE ---------6303993330 8472323232

TRADE_COUNT ----------7 12

2 record(s) selected.

#4. Create a report that lists the year stocks were purchased and number of times (trade volume) that any stock was purchased in that year

YEAR_BOUGHT ----------1962 1998 1999

TOTAL_STOCK ----------1 1 8

2001 24 4 record(s) selected.

Subquery Vertical
Vertical
Subselects

54

Noncorrelated Subquery Basics


Noncorrelated

Top query and bottom query have no dependency Executes bottom-up


SELECT columns FROM T1 WHERE T1.COLA = (SELECT SUM(T2.COLX) FROM T2 WHERE conditions)

Scalar Subquery

Sheryl M. Larsen, Inc. 2000-2012

55

Correlated Subquery Basics


Correlated

Top query and bottom query are dependent on each other Executes top-bottom-top, once for each qualifying row from top query
Result

SELECT columns FROM T1 WHERE T1.COLA = (SELECT SUM(T2.COLX) FROM T2 WHERE T2.COLY = T1.COLB)
Sheryl M. Larsen, Inc. 2000-2012

Scalar Subquery Returns 1 row

56

Subquery Comparisons

Comparisons between top and bottom query Equal, >,<,<=,<=, <> can only return one value
By using column function on one column of the bottom SELECT Or by using a unique WHERE condition in the bottom SELECT

IN, NOT IN can return multiple values


By SELECTing one column and qualifying more than one row IN can be inverted or create dynamic sparse index

EXISTS, NOT EXISTS does not return any values


Bottom SELECT list is ignored Returns True for at least one row qualified Returns False when no rows qualified Correlated can be converted to a join as of V7
Sheryl M. Larsen, Inc. 2000-2012

57

Subquery Using IN

Correlated
SELECT columns FROM T1 WHERE T1.COLA IN (SELECT T2.COLX FROM T2 WHERE T2.COLY > T1.COLB)

Builds a work file and sorts to remove duplicates, once per qualifying row in top SELECT Usually very expensive!
Sheryl M. Larsen, Inc. 2000-2012

58

Subquery Using IN

Non Correlated IN Only


SELECT columns FROM T1 WHERE T1.COLA IN (SELECT T2.COLX FROM T2 WHERE conditions)

Does T2.COLX exist in T1S COLA index?

Query Inversion
COLA Index
Inner Index
Root Page O O O Non-Leaf Page O O Non-Leaf Page O O O O

Work File
Non-Leaf Page O O O Leaf Page o o oo oo Leaf Page o o oo oo

Does T1.COLA exist in T2s COLX list?

Leaf Page o o o o oo

Leaf Page o o oo oo

Leaf Page o o oo oo

Leaf Page o o o o oo

Leaf Page o o oo oo

Leaf Page o o oo oo

Leaf Page o o o o o o

Work File
59

Sheryl M. Larsen, Inc. 2000-2012

Subquery Using EXISTS


SELECT columns FROM T1 WHERE NOT EXISTS (SELECT 1 FROM T2 WHERE conditions)

Correlated EXISTS Moves current row information to result if bottom query returns true Correlated NOT EXISTS Moves current row information to result if bottom query returns false SELECT columns FROM T1 WHERE EXISTS (SELECT 1 FROM T2 WHERE T2.COLY = T1.COLB)

Noncorrelated EXISTS Executes top query if bottom query returns true Noncorrelated NOT EXISTS Executes top query if bottom query returns false

Sheryl M. Larsen, Inc. 2000-2012

60

Workshop B

Subquery:
NonCorrelated & Correlated
5. Produce a list of CUST_NAMEs, STOCK_IDs, and STOCK_QTY for all customers that purchased at less than the average number of shares that all customers have purchased. Answer = 14 record(s) selected. 6. Produce a list of CUST_NAMEs, with the STOCK_IDs, with the STOCK_QTY, only if the customer has purchased their usual (average) amount of stock 7 record(s) selected.
CUST_NAME STOCK_ID STOCK_QTY -----------------------------------------JOHN ADAMS IBM 120 MICHAEL JORDAN IBM 123 MICHAEL JORDAN NTAP 123 MICHAEL JORDAN BEAS 123 MICHAEL JORDAN PTEC 123 MERILIN MONROE ABC 136 LIBBY LOU BEAS 111

When to use What SQL Joins over Subqueries

Needed for Intra-Table Column Comparisons


WHERE A.COL2 = A.COL5 On different rows (accounts, policies, items, orders, other unique ids, etc.) What Students Have the Same Classes as any given student?
SELECT SSS.SID, SSS.CLASS_ID, SSS.TIME_ID FROM SMLU_STUDENT_SCHED SS ,SMLU_STUDENT_SCHED SSS Self Join to get same WHERE SSS.CLASS_ID = SS.CLASS_ID class/time rows AND SSS.TIME_ID = SS.TIME_ID AND SSS.SID <> SS.SID AND SSS.SID NOT IN(list challenged student IDs) AND SS.SID = :challenged-sid
Sheryl M. Larsen, Inc. 2000-2012

Point to Different Rows

Homework Challenged

62

Subqueries over Joins

Needed for Intra-Table Column Comparisons


What Students Have at least one of the same Classes as a given student?
SELECT SS.SID FROM SMLU_STUDENT_SCHED SS WHERE SS.SID NOT IN(list challenged student IDs)

AND EXISTS

(SELECT TRUE OR FALSE FROM SMLU_STUDENT_SCHED SSS WHERE SSS.CLASS_ID = SS.CLASS_ID AND SSS.TIME_ID = SS.TIME_ID AND SSS.SID <> SS.SID AND SSS.SID = :challenged-sid)

Homework Challenged
Sheryl M. Larsen, Inc. 2000-2012

63

Inner Join over Left Join SELECT Columns


FROM TABX X LEFT JOIN TABY Y ON X.COL1 = Y.COL1 WHERE Y.COL1 IS NOT NULL
TABX Exceptions TABY Exceptions

Inner Join SELECT Columns FROM TABX X, TABY Y WHERE X.COL1 = Y.COL1
Sheryl M. Larsen, Inc. 2000-2012

64

Over Use of LEFT JOIN

Paying to get exceptions and dragging them through multiple joins


(SELECT FROM
INNER JOIN LEFT JOIN

SELECT FROM (

(SELECT FROM (
LEFT JOIN

INNER JOIN

)
UNION ALL SELECT FROM WHERE NOT EXISTS (SELECT FROM UNION ALL LEFT JOIN ))) SELECT FROM WHERE NOT EXISTS (SELECT FROM

(SELECT FROM (

Sheryl M. Larsen, Inc. 2000-2012

65

GROUP BY Review
SELECT TX.COL1 ,TX.COL2 ,TY.COL8 ,SUM(TX.COL9) ,STDEV(TY.COL10) TX ,TY TX.COL3 = TY.COL3 TY.COL7 = X TX.COL1 ,TX.COL2 ,TY.COL8 AVG(TY.COL2) > 400
Sheryl M. Larsen, Inc. 2000-2012

1. Filter detail rows

2. Join tables
3. Sort (if necessary) 4. Group/Aggregate 5. Filter summary rows
66

FROM WHERE AND GROUP BY

HAVING

Calculating Gaps Between Column Values


Intra-table column comparisons require special handling Join the table to itself or use correlated subquery Calculate days between policies
CUST_NO 1 1 1 1 1 POLICY_NO AAA BBB CCC CCC CCC BEGIN_EFEC_DT 2000-10-20 2000-01-20 2000-02-20 2000-06-20 2000-08-20 END_EFEC_DT 2001-10-20 2001-01-20 2000-04-20 2000-08-20 2000-10-20
67

Sheryl M. Larsen, Inc. 2000-2012

Calculating Gaps
CUST_NO 1 1 1 POLICY_NO CCC CCC CCC B.BEGIN_EFEC_DT 2000-02-20 2000-06-20 2000-08-20 E.END_EFEC_DT 2000-04-20 2000-08-20 2000-10-20

SELECT E.POLICY_NO AS POL_NO , DAYS(B.BEGIN_EFEC_DT) - DAYS(E.END_EFEC_DT) AS DAYS_UNSAFE , E.END_EFEC_DT AS END, B.BEGIN_EFEC_DT AS BEGIN FROM POLICY E, POLICY B WHERE E.CUST_NO = B.CUST_NO AND E.CUST_NO = 1 AND E.POLICY_NO = B.POLICY_NO AND E.END_EFEC_DT <= B.BEGIN_EFEC_DT AND B.BEGIN_EFEC_DT = POL DAYS (SELECT MIN(C.BEGIN_EFECT_DT) NO UNSAFE FROM POLICY C CCC 62 WHERE C.POLICY_NO = E.POLICY_NO CCC 0 AND C.CUST_NO = E.CUST_NO AND C.BEGIN_EFEC_DT >= E.END_EFEC_DT)
Sheryl M. Larsen, Inc. 2000-2012

68

Audit Checking of Table Summaries


Dual
DECLARE CURSOR AUDIT_CHECK FOR SELECT S.ORDER FROM SALES S, ITEM I WHERE S.ORDER = I.ORDER GROUP BY S.ORDER Keeps HAVING SUM(S.PRICE) <> (SELECT SUM(SA.PRICE) FROM SALES_AUDIT SA WHERE SA.ORDER = S.ORDER)

Sales Processing tables audit check

groups that are NOT EQUAL!

OPEN AUDIT_CHECK .. FETCH AUDIT_CHECK ROWS (IF ANY) IF SQLCODE OF FIRST FETCH = 100 THEN EVERYTHING IN SYNC
Sheryl M. Larsen, Inc. 2000-2012

69

Oscars Find All Query 2


Find the players that have played on all the registered teams
Players

Teams

Matches

Sheryl M. Larsen, Inc. 2000-2012

70

Oscars Find All Query 2


Find the students that have all same classes as one particular student
Students

Classes

Matches
Sheryl M. Larsen, Inc. 2000-2012

71

Oscars Find All Query 3


List the clients that have at least one active policy in very line of business offered by the insurance company
Clients

Lines of Business Policy Matches


Sheryl M. Larsen, Inc. 2000-2012

72

Finding the Needle in the Haystack


Get Clients 1 at a time
SELECT DISTINCT T43.CLNT_ID FROM POLICY_ROLE T43

Get Lines of Business

(SELECT 1 FROM POLICY M42 WHERE M42.LOB IN ('A', 'F','H','L')

Compare (SELECT 1 FROM POLICY_ROLE B43 Policies ,POLICY B42 WHERE B43.PLCY_ID = B42.PLCY_ID AND B42.LOB = M42.LOB AND B43.CLNT_ID = T43.CLNT_ID AND B42.CLNT_PLCY_END_DT IS NULL)
Sheryl M. Larsen, Inc. 2000-2012

73

Needle in the Haystack


SELECT DISTINCT PR1.CLNT_ID FROM POLICY_ROLE PR1 WHERE NOT EXISTS

CLNT_ID 701 801

(SELECT 1 FROM POLICY P1 WHERE P1.LOB IN ('A', 'F','H','L') AND NOT EXISTS

LOB A F H L

CLNT_ID 701 701 701 701 801

LOB A F H L H

(SELECT 1 PLCY_ID FROM POLICY_ROLE PR2 XXST825K00L ,POLICY P2 XXSTOEI00K WHERE P2.PLCY_ID = P1.PLCY_ID XXEILSIE00L AND P2.LOB = P1.LOB XXUOIEW00K AND PR2.CLNT_ID = PR1.CLNT_ID XXSLIEFI00L AND P2.CLNT_PLCY_END_DT IS NULL))
Sheryl M. Larsen, Inc. 2000-2012

74

Finding Many Needles Join Alternative


SELECT CLNT_ID FROM POLICY_ROLE A ,POLICY B WHERE A.PLCY_ID = B.PLCY_ID AND LOB IN (A, F, H, L) AND A.CLNT_PLCY_END_DT IS NULL GROUP BY CLNT_ID HAVING COUNT(DISTINCT A.LOB) = (SELECT COUNT(DISTINCT D.LOB) FROM POLICY_ROLE D)

Join all active policies to LOBs

Count unique LOB matches, eliminate groups without ALL LOBs Count total unique LOBs
75

Sheryl M. Larsen, Inc. 2000-2012

Workshop C - #7a & 7b


Subqueries

76

#7a. Generate a list of CUST_IDs that have all (every one) of the software company stocks (STOCK_DESCRIPT LIKE %SOFTWARE%)

CUST_ID ---------+---------+-----22 23

#7b. Generate the same list using a different type of relational division.

CUST_ID ---------+---------+-----22 23

Global Temporary Tables


Created & Declared

79

Global Temps Syntax Created DECLARE GLOBAL & Declared TEMPORARY TABLE
CREATE GLOBAL TEMPORARY TABLE CTT (COL1 CHAR(6) NOT NULL, COL2 INTEGER NOT NULL, COL3 CHAR(2) NOT NULL, COL4 DEC(6,2) NOT NULL) CREATE GLOBAL TEMPORARY TABLE CTT LIKE tablename
SESSION.DTT (COL1 CHAR(6) NOT NULL, COL2 INTEGER NOT NULL, COL3 CHAR(2) NOT NULL, COL4 DEC(6,2) NOT NULL)

DECLARE GLOBAL TEMPORARY TABLE DTT LIKE tablename Or AS (SELECT .)


Definition Only
80

Sheryl M. Larsen, Inc. 2000-2012

Created Vs. Declared


CREATED (CTT) Light reuse of 100% of CTT No indexes No recovery No update(only mass DELETE) DSNDB07 file Definition stored in Catalog DECLARED (DTT) Heavy reuse of subsets of DTT Can create indexes Undo records DML allowed TEMPdb segmented tablespace Definition not stored in Catalog
81

Sheryl M. Larsen, Inc. 2000-2012

Practical Uses

DB2ize nonDB2 data


Insert rows from VSAM, IMS, Files, Spreadsheets, Oracle, Sybase, Informix, Datacom, etc. Use in a relational process
join, subquery, GROUP BY

Results of stored procedures Store intermediate steps of long process


Iterative data massaging processes Recursive processes

Sheryl M. Larsen, Inc. 2000-2012

82

Misuse of GLOBAL TEMP TABLES


INSERT INTO TEMP1 SELECT FROM INSERT INTO TEMP2 SELECT FROM GROUP BY INSERT INTO TEMP3 SELECT FROM
INNER JOIN

SELECT FROM
INNER JOIN

TEMP1
INNER JOIN

(SELECT FROM TEMP2

ORDER BY

INNER JOIN

GROUP BY )
Sheryl M. Larsen, Inc. 2000-2012

ORDER BY

83

Recursive SQL Syntax- V8


WITH COMMON1 (PART, SUBPART, N) AS Available on (SELECT PART, SUBPART, 1 DB2 LUW Starting FROM LEGO since V5 WHERE PART = L1 Rows UNION ALL SELECT L.PART, L.SUBPART, N+1 Join to get FROM COMMON1 T1, LEGO L Childrens Children WHERE T1.SUBPART = L.PART AND N < 10 ) SELECT PART, SUBPART, N Part Subpart N FROM COMMON1 Starting

L1 L1 S1 S2 S2 S5

S1 S2 S7 S5 S6 S9

1 1 2 2 2 3

Rows

Sheryl M. Larsen, Inc. 2000-2012

84

Recursive Processing Code


INSERT INTO TEMP1 SELECT PART, SUBPART FROM LEGO WHERE PART = L1 INSERT INTO RESULT SELECT PART, SUBPART FROM TEMP1

Temp 1 New Rows replace Temp1


INSERT INTO TEMP2 SELECT L.PART, L.SUBPART FROM TEMP1 T1, LEGO L WHERE T1.SUBPART = L.PART

Part Subpart
L1 L1 S1 S2 S2 S5 S1 S2 S7 S5 S6 S9

Starting Rows

Base Table

Temp 2
Sheryl M. Larsen, Inc. 2000-2012

New Rows are appended


85

Emulating Recursive SQL


INSERT INTO TEMP1 SELECT PART, SUBPART FROM LEGO WHERE PART = L1; INSERT INTO RESULT SELECT PART, SUBPART FROM TEMP1;

Starting Rows Add Rows to Result

Add Rows to Result

INSERT INTO RESULT SELECT PART, SUBPART FROM TEMP2;

Clear Temp1 New Rows replace Temp1 Clear Temp2

DELETE FROM TEMP1;

Get New Rows

IF No New Rows, END

Else

INSERT INTO TEMP1 SELECT * FROM TEMP2;

INSERT INTO TEMP2 SELECT L.PART, L.SUBPART FROM TEMP1 T1, LEGO L WHERE T1.SUBPART = L.PART;
Sheryl M. Larsen, Inc. 2000-2012

DELETE FROM TEMP2;

86

Workshop D - #8
Recursion

87

Workshop D
Recursion
#8. You need to generate the following test data for 100 rows:

INT_NUM 1 2 3 4

RANDOM_NUM .023948 .004773 .257900 .023648 etc.

CASE Expressions
The True Power

89

CASE Syntax
(CASE expression WHEN expression THEN expression ELSE expression END) AS expression_name Parenthesis are optional but a good idea Can use anywhere an expression can be used
Simple syntax: (CASE COL1 ELSE NULL WHEN 3 THEN THREE Is the Default WHEN 4 THEN FOUR ELSE ? END) AS SPELLED_OUT

Sheryl M. Larsen, Inc. 2000-2012

90

The Power of CASE

CASE is for testing, translating, filtering, counting, pivoting, and calculating, using logic. CASE used in the SELECT is FREE CASE used in the WHERE is Stage 2 (only hurts if it is the only filtering) Best Savings: removal of UNION blocks, joins and whole programs
91

Sheryl M. Larsen, Inc. 2000-2012

CASE For Calculations


SELECT- CASE performs tests FROM - name all sets needed WHERE - gather all rows needed for tests
ALL_FACE_CARDS , KING_COUNT * 100./ ALL_FACE_CARDS AS KING_PCT_NON , QUEEN_COUNT * 100./ ALL_FACE_CARDS AS QUEEN_PCT_NON , JACK_COUNT * 100./ ALL_FACE_CARDS AS JACK_PCT_NON (SELECT SUM(CASE WHEN CARD = 13 THEN 1 ELSE 0 END) AS KING_COUNT ,SUM(CASE WHEN CARD = 12 THEN 1 ELSE 0 END) AS QUEEN_COUNT ,SUM(CASE WHEN CARD = 11 THEN 1 ELSE 0 END) AS JACK_COUNT ,COUNT(*) AS ALL_FACE_CARDS FROM DECK_OF_CARDS WHERE CARD >10) AS ONE_ROW_REPORT
Sheryl M. Larsen, Inc. 2000-2012

SELECT

FROM

92

CASE for All Calculations


SELECT ALL_CARDS ,ALL_NONFACE_CARDS , KING_COUNT * 100./ ALL_NONFACE_CARDS AS KING_PCT_NON , QUEEN_COUNT * 100./ ALL_NONFACE_CARDS AS QUEEN_PCT_NON , JACK_COUNT * 100./ ALL_NONFACE_CARDS AS JACK_PCT_NON , KING_COUNT * 100./ ALL_CARDS AS KING_PCT , QUEEN_COUNT * 100./ ALL_CARDS AS QUEEN_PCT Adds zero to a , JACK_COUNT * 100./ ALL_CARDS AS JACK_PCT running count , EVEN_COUNT * 100./ALL_CARDS AS EVEN_PCT FROM (SELECT SUM(CASE WHEN CARD = 13 THEN 1 ELSE 0 END) AS KING_COUNT ,SUM(CASE WHEN CARD = 12 THEN 1 ELSE 0 END) AS QUEEN_COUNT ,SUM(CASE WHEN CARD = 11 THEN 1 ELSE 0 END) AS JACK_COUNT ,SUM(CASE WHEN CARD BETWEEN1 AND 10 THEN 1 END) AS ALL_NONFACE_CARDS ,SUM(CASE WHEN CARD = 2 OR CARD = 4 OR CARD = 6 OR CARD = 8 OR CARD = 10 OR CARD = 12 THEN 1 END) AS EVEN_COUNT ,COUNT(*) AS ALL_CARDS FROM DECK_OF_CARDS) AS LONGER_ROW_REPORT
Sheryl M. Larsen, Inc. 2000-2012

93

Nested CASE for Complex Calculations

ELSE NULL is default = dangerous

SELECT SUM( (CASE WHEN D1.CARD = 13 THEN 1 ELSE 0 END) + (CASE WHEN D2.CARD = 13 THEN 1 ELSE 0 END) ) AS KING2_COUNT ,SUM( (CASE WHEN D1.CARD = 12 THEN 1 ELSE 0 END) + (CASE WHEN D2.CARD = 12 THEN 1 ELSE 0 END) ) AS QUEEN2_COUNT ,SUM( (CASE WHEN D1.CARD = 11 THEN 1 ELSE 0 END) + CASE WHEN D2.CARD = 11 THEN 1 ELSE 0 END) ) AS JACK2_COUNT FROM DECK_OF_CARDS1 D1 , DECK_OF _CARDS2 D2 ELSE WHERE D1.KEYCOL = D2.KEYCOL NULL ANDD1.CARD IN(13,12,11) ANDD2.CARD IN(13,12,11)

Sheryl M. Larsen, Inc. 2000-2012

94

CASE for All Calculations


SELECT

ELSE NULL is DEC(ACOUNT * 100./TOTAL,8,6) AS PCT_AUTO default = , DEC(FCOUNT * 100./TOTAL,8,6) AS PCT_FIRE , DEC(HCOUNT * 100./TOTAL,8,6) AS PCT_HEALTH dangerous

, DEC(SCOUNT * 100./TOTAL,8,6) AS PCT_SFPP , DEC(LCOUNT * 100./TOTAL,8,6) AS PCT_LIFE , DEC( (TOTAL-OPP_COUNT) * 100./TOTAL,8,6) AS PCT_OTHER FROM (SELECT SUM(CASE LOB WHEN 'A' THEN 1 END) AS ACOUNT , SUM(CASE LOB WHEN 'F' THEN 1 END) AS FCOUNT , SUM(CASE LOB WHEN 'H' THEN 1 END) AS HCOUNT , SUM(CASE LOB WHEN 'S' THEN 1 END) AS SCOUNT , SUM(CASE LOB WHEN 'L' THEN 1 END) AS LCOUNT , SUM(CASE WHEN LOB IN( 'A', F, H, L, S) THEN 1 END) AS OPP_COUNT , COUNT(*) AS TOTAL FROM POLICY ) AS ONE_ROW_REPORT -- 6 4 3 4 2 19 20 PCT_AUTO PCT_FIRE PCT_HEALTH PCT_SFPP PCT_LIFE PCT_OTHER ---------- --------------------------------------------30.000000 20.000000 15.000000 20.000000 10.000000 5.000000
Sheryl M. Larsen, Inc. 2000-2012

95

CASE for Identifying


MIN(CASE WHEN EMLC.DC_ADR_EML = 'H' AND EMLC.DC_STA_PD32 = 'A' THEN '1' WHEN EMLC.DC_ADR_EML = 'W' AND EMLC.DC_STA_PD32 = 'A' THEN '2' WHEN EMLC.DC_ADR_EML = 'A' AND EMLC.DC_STA_PD32 = 'A' THEN '3' END ) AS LABEL ((CASE LENGTH(NAME_PREFX) (CASE WHEN colx > 99 THEN '1' WHEN 0 THEN 0 ELSE 1 END) + WHEN colx = 14 THEN '2' (CASE LENGTH(NAME_SFX) WHEN colx = 78 THEN '3' WHEN colx = 22 THEN 4' WHEN 0 THEN 0 ELSE 1 END) + WHEN colx = 66 THEN 5' (CASE LENGTH(NAME_MID) + END ) AS CHOSEN_ONE END)) AS TOT_RANK
Sheryl M. Larsen, Inc. 2000-2012

96

Table Pivoting Quarter by LOB SELECT


QUARTER(CLNT_PLCY_START_DT) AS Quarter ,SUM(CASE LOB WHEN 'A' THEN 1 ELSE 0 END) AS "Accident" ,SUM(CASE LOB WHEN 'F' THEN 1 ELSE 0 END) AS "Fire" ,SUM(CASE LOB WHEN 'H' THEN 1 ELSE 0 END) AS "Home Owners" ,SUM(CASE LOB WHEN 'L' THEN 1 ELSE 0 END) AS "Liability" ,SUM(CASE LOB WHEN 'S' THEN 1 ELSE 0 END) AS "Special" ,SUM(CASE LOB WHEN 'X' THEN 1 ELSE 0 END) AS "Other" FROM POLICY GROUP BY QUARTER(CLNT_PLCY_START_DT) ORDER BY QUARTER(CLNT_PLCY_START_DT) ;
QUARTER Accident Fire Home Owners Liability Special ----------- ----------- ----------- ----------- ----------- ----------- ----------1 1 0 2 1 0 0 2 5 1 0 1 2 1 3 0 2 1 0 0 0 4 0 1 0 0 2 0 4 record(s) selected.
Sheryl M. Larsen, Inc. 2000-2012

Other

97

Reducing Multiple Passes Against the Data


SELECT A.STAT_CD ,B.STAT_CD ,C.STAT_CD ,D.STAT_CD ,E.STAT_CD ,F.STAT_CD ,G.STAT_CD ,H.STAT_CD ,I.STAT_CD ,J.STAT_CD ,K.STAT_CD FROM GL_STAT_LOOKUP A ,GL_STAT_LOOKUP B ,GL_STAT_LOOKUP C ,GL_STAT_LOOKUP D ,GL_STAT_LOOKUP E ,GL_STAT_LOOKUP F ,GL_STAT_LOOKUP G ,GL_STAT_LOOKUP H ,GL_STAT_LOOKUP I ,GL_STAT_LOOKUP J ,GL_STAT_LOOKUP K

Sheryl M. Larsen, Inc. 2000-2012

98

Passes Against the Data


WHERE A.LOB_CD = 'PUMBR' AND A.MSTR_CO_NBR = 5 AND A.STATE IN (99, 34) AND A.STAT_TYPE = 'BI_DED' AND '2000-05-01' BETWEEN A.STAT_EFF_DT AND A.STAT_EXP_DT -AND B.LOB_CD = 'PUMBR' AND B.MSTR_CO_NBR = 5 AND B.STATE IN (99, 34) AND B.STAT_TYPE = 'BI_SNGL_LIMIT' AND B.LIMIT_AMT1 = 1000000 AND '2000-05-01' BETWEEN B.STAT_EFF_DT AND B.STAT_EXP_DT
--

Sheryl M. Larsen, Inc. 2000-2012

99

Passes Against the Data


AND C.LOB_CD = 'PUMBR' AND C.MSTR_CO_NBR = 5 AND C.STATE IN (99, 34) AND C.STAT_TYPE = 'COV_CD' AND '2000-05-01' BETWEEN C.STAT_EFF_DT AND C.STAT_EXP_DT -AND D.LOB_CD = 'PUMBR' AND D.MSTR_CO_NBR = 5 AND D.STATE IN (99, 34) AND D.STAT_TYPE = 'LIMIT_CD' AND '2000-05-01' BETWEEN D.STAT_EFF_DT AND D.STAT_EXP_DT
-100

Sheryl M. Larsen, Inc. 2000-2012

Passes Against the Data


AND E.LOB_CD = 'PUMBR' AND E.MSTR_CO_NBR = 5 AND E.STATE IN (99, 34) AND E.STAT_TYPE = 'PD_DED' AND '2000-05-01' BETWEEN E.STAT_EFF_DT AND E.STAT_EXP_DT -- etc. -F., G., H., I., J. (for STATE_TYPEs 6 through 10) -AND K.LOB_CD = 'PUMBR' AND K.MSTR_CO_NBR = 5 AND K.STATE IN (99, 34) AND K.STAT_TYPE = 'RISK_CD' AND '2000-05-01' BETWEEN K.STAT_EFF_DT AND K.STAT_EXP_DT

Sheryl M. Larsen, Inc. 2000-2012

101

Reduction
SELECT STATE ,MIN(CASE WHEN STAT_TYPE = 'BI_DED' THEN STAT_CD END) AS BI_DED ,MIN(CASE WHEN STAT_TYPE = 'BI_SNGL_LIMIT' AND LIMIT_AMT1 = 1000000 THEN STAT_CD END) AS BI_SNGL_LIMIT ,MIN(CASE WHEN STAT_TYPE = 'COV_CD' THEN STAT_CD END) AS COV_CD ,MIN(CASE WHEN STAT_TYPE = 'LIMIT_CD' THEN STAT_CD END) AS LIMIT_CD ,MIN(CASE WHEN STAT_TYPE = 'PD_DED' THEN STAT_CD END) AS PD_DED ,MIN(CASE WHEN STAT_TYPE = 'PD_LIMIT' THEN STAT_CD END) AS PD_LIMIT
102

Sheryl M. Larsen, Inc. 2000-2012

Reduction
,MIN(CASE WHEN STAT_TYPE = 'POLICY_TYPE' THEN STAT_CD END) AS POLICY_TYPE ,MIN(CASE WHEN STAT_TYPE = 'RATE_CD' THEN STAT_CD END) AS RATE_CD ,MIN(CASE WHEN STAT_TYPE = 'RATE_DEPARTURE' THEN STAT_CD END) AS RATE_DEPARTURE ,MIN(CASE WHEN STAT_TYPE = 'RATE_MDF' THEN STAT_CD END) AS RATE_MDF ,MIN(CASE WHEN STAT_TYPE = 'RISK_CD' THEN STAT_CD END) AS RISK_CD

FROM

GL_STAT_LOOKUP

WHERE LOB_CD = 'PUMBR' AND MSTR_CO_NBR = 5 AND STATE IN (99, 34)

Sheryl M. Larsen, Inc. 2000-2012

103

Reduction
AND STAT_EFF_DT <= '2000-05-01 AND STAT_EXP_DT > '2000-05-01' AND STAT_TYPE IN ( 'BI_DED' ,'BI_SNGL_LIMIT' ,'COV_CD' ,'LIMIT_CD' ,'PD_DED' ,'PD_LIMIT' ,'POLICY_TYPE' ,'RATE_CD' ,'RATE_DEPARTURE' ,'RATE_MDF' ,'RISK_CD' ) GROUP BY STATE

Sheryl M. Larsen, Inc. 2000-2012

104

Workshop E - #9 & #10


CASE

105

#9. Translate large metro area codes to a


common name for the report as follows:
San Fran Metro = 415 OR = 510 OR = 650 Chicago Metro = 630 OR = 847 OR = 312 OR = 773 New York Metro = 212 OR = 646 OR = 718 OR = 201 Small Cities = all other area codes. Calculate the total number of customers per LOC_NAME without using a GROUP BY clause.

SAN_FRAN_METRO CHICAGO_METRO NEW_YORK_METRO SMALL_CITIES ---------+---------+---------+---------+---------+---------+---------+---1 5 3

#10. Produce a quarterly report of stocks from the year 2001 (total stocks purchased per quarter). Display the quarters horizontally instead of vertically.

Q1_AMT Q2_AMT Q3_AMT Q4_AMT YEAR_2001_TOTAL ------ ----------- ----------- ----------- --------------1804 0 0 0 1804

CASE in Other Clauses


To Emulate Dynamic SQL To Change Join Criteria To Change Sorting Sequence

108

Embedded Dynamic Syntax


Build

SELECT statement in program Store in one character string PREPARE AccessPath FROM :sqlstring DECLARE C1 CURSOR FOR AccessPath OPEN C1 FETCH C1 INTO :program-vars CLOSE C1

Sheryl M. Larsen, Inc. 2000-2012

109

Emulating With CASE


DECLARE C1 CURSOR FOR (SELECT column information FROM tables WHERE join conditions AND local conditions AND (CASE WHEN :OPT1 = Yes THEN COL7 ELSE END) BETWEEN :var1 AND :var2 AND (CASE WHEN :OPT2 = Yes THEN COL9 ELSE END) BETWEEN :var1 AND :var2
Sheryl M. Larsen, Inc. 2000-2012

110

CASE to Change Join Criteria


SELECT column information FROM tables WHERE (CASE WHEN T1.DATE_C1 <> THEN T1. DATE_C1 WHEN T1. DATE_C2 <> THEN T1. DATE_C2 WHEN T1. DATE_C3 <> THEN T1. DATE_C3 ELSE DATE(0001-01-01) END) = T2.DATE_CX AND local conditions

Sheryl M. Larsen, Inc. 2000-2012

111

CASE to Change Sort Sequence

ORDER BY (CASE T1.EMPID WHEN 2345 THEN TOTAL_COMP 100,000.00 ELSE TOTAL_COMP END);
Sheryl M. Larsen, Inc. 2000-2012

112

Version 8 SQL Extensions


50% of V8 new code CPU savings even without application rewrite More savings with exploitation of new features

113

V8 SQL Enhancements Stage1 unlike data types


2M Statement Length Multi-row FETCH Multi-row INSERT
Sequences

Became Available March 26, 2004!!

INSERT with SELECT


Parallel Sort Multiple DISTINCT Star Join Sparse Index Multiple CCSIDs per statement VOLATILE Table Support Enhanced UNICODE GET DIAGNOSTICS CURRENT PACKAGE PATH Qualified Column names ON COMMIT DROP Transparent ROWID Column

SELECT INTO w/ ORDER BY


Materialized Query Tables Common Table Expressions Recursive SQL

Forward and Backward Indexes


DPSI Indexes IS NOT DISCTINCT FROM Scalar Fullselect GROUP BY Expression Dynamic Scrollable Cursors

Sheryl M. Larsen, Inc. 2000-2012

Exclusive to DB2 on z/OS

114

Stage 1 Unlike Data Types

APAR PK12389, PK13904 for compatibility mode

All comparisons within the datatype family become compatible (numbers, character, date/time) Allows predicate to be applied during some point of index access (matching or nonmatching) HUGE Performance Boost!!!!! 0% - 70% CPU savings If you have not paid attention to data type mismatches All you need to do is REBIND! Helps languages that do not have DB2 matches C/C++ has no DECIMAL Java has no fixed length CHAR

Plus 2 new Indexable prediates:


WHERE COL IS NOT NULL WHERE COL IS NOT DISTINCT FROM
Sheryl M. Larsen, Inc. 2000-2012

115

2M Statement Length

Increased from 32K Will no longer have to break long statements up Reduces SQLCODE 101 SQL Procedure Language applications needed it most
Create a procedure using SPL CREATE PROCEDURE AS . Whole program in SQL and SPL New enhancements RETURN statement SIGNAL/RESIGNAL support Integrated debugger GET DIAGNOSTICS Sheryl M. Larsen, Inc. 2000-2012

116

Multi-row FETCH
Returns

multiple rows in one API call FETCH FROM C1 FOR :n ROWS INTO :array1, :array2, :array3

Host Language Arrays

Sheryl M. Larsen, Inc. 2000-2012

117

Multi-row Fetch Gain


FETCH FROM C1 FOR 7 ROWS INTO :name, :id, :birthdate
V7 one row

ROWSET

Tyler Jack

383 494

2000-10-14 1996-05-21

V8 two rows Saves 5% CPU

Chris Kara
Ryan Tori

209 573
104 382

1993-10-12
2003-05-21

Emma 893

1999-08-09
1998-12-07 1993-01-05

V8 ten rows Saves 40% CPU! V8 100+ rows Saves 50% CPU! 118

Sheryl M. Larsen, Inc. 2000-2012

Multi-row Fetch Application Impact

CICS Application Logic Changes


One fetch per screen Check SQLERRD(3) flag or ROW_COUNT (in GET DIAGNOSTICS) New logic to process host language array New error processing for multi-row using:
GET DIAGNOSTICS

Batch Application Logic Changes


Same . but favors high row count, low column count

Recommend commenting in new code now! Already used in:


ODBC arrays used DDF DSNTIAUL, DSNTEP4 (Much, much faster than DSNTEP2)
119

Sheryl M. Larsen, Inc. 2000-2012

Multi-row FETCH Positioning

Static, Dynamic, SCROLL, nonSCROLL

DECLARE TCUR CURSOR WITH ROWSET POSITIONING FOR SELECT C8, C9 FROM T3; Saves 25% CPU OPEN TCUR; for 10, 40% for FETCH FROM TCUR FOR :hv ROWS 100+ rows INTO :ARRAY1, :ARRAY2; UPDATE T3 SET C8 = 222 FOR CURSOR TCUR FOR ROW :hv OF ROWSET; Saves 25% CPU

DELETE FROM T3 FOR CURSOR TCUR FOR ROW :hv OF ROWSET;


Sheryl M. Larsen, Inc. 2000-2012

for 10, 35% for 100+ rows

120

Multi-row ROWSET Processing


DECLARE DCUR CURSOR WITH ROWSET POSITIONING FOR SELECT NAME , ID, BIRTH_DT FROM DEPT; OPEN DCUR;
FETCH FROM DCUR ROWSET STARTING AT ABSOLUTE 5 FOR 3 ROWS INTO :NAME-A, :ID-A , :BIRTH-A; DELETE FROM DEPT WHERE CURRENT OF DCUR; FETCH PRVIOUS ROWSET FOR 4 ROWS INTO :NAMEA, :ID-A , :BIRTH-A;

Tyler Jack
Chris

383 2000-10-14 494 1996-05-21


209 1993-10-12

Emma 893 2003-05-21


Kara Ryan Tori 573 1999-08-09 104 1998-12-07 382 1993-01-05
121

Absolute 7

Sheryl M. Larsen, Inc. 2000-2012

Multi-row Fetch Error Checking


FETCH

NEXT ROWSET FROM CS1 FOR 9 ROWS IN :hv-arrays


If SQLCODE = 0 AND SQLERRD(3) > 0
Process rows

If SQLCODE = 100 AND SQLERRD(3) > 0


Process SQLERRD(3) rows

If SQLCODE = 100 AND SQLERRD(3) = 0


CLOSE CS1

Sheryl M. Larsen, Inc. 2000-2012

122

Multi-row INSERT
Inserts

multiple rows in one API call INSERT INTO T1 FOR :n ROWS VALUES (:array1, :array2, :array3)
Commit Frequency?

Up to 30% savings

Sheryl M. Larsen, Inc. 2000-2012

123

Multi-row INSERT
Static

or Dynamic STMT2 = INSERT INTO T2 VALUES (?, ?) FOR MULTIPLE ROWS ATOMIC; PREPARE S2 FROM STMT2; EXECUTE S1 FOR :hv ROWS USING :ARRAY1, :ARRAY2;
Huge Advantage for Distributed Apps with Latency

Sheryl M. Larsen, Inc. 2000-2012

124

SELECT INTO with ORDER BY


SELECT FROM SSS.SID, COUNT(*) AS CLASS_COUNT SMLU_STUDENT_SCHED SS ,SMLU_STUDENT_SCHED SSS INTO :top-student WHERE SSS.CLASS_ID = SS.CLASS_ID AND SSS.TIME_ID = SS.TIME_ID AND SSS.SID <> SS.SID AND SS.SID = :honors-student GROUP BY SSS.ID HAVING COUNT(*) > (SELECT COUNT(*) 30% CPU FROM SMLU_STUDENT_SCHED X WHERE X.SID = :honors-student) Reduction ORDER BY CLASS_COUNT DESC FETCH FIRST 1 ROW ONLY - - PLEASE

Sheryl M. Larsen, Inc. 2000-2012

125

Materialized Query Tables


Automatic Summary Tables (ASTs) are a subset of MQTs Can be almost ANY valid SELECT statement CREATE TABLE MQT1 AS SELECT use your imagination .. ;

System-maintained
SQL REFRESH TABLE option
Deletes all rows, refills table, updates catalog

Can be fast!

User-maintained (via triggers, replication, batch updates, etc.)


REFRESH DEFERRED
Via LOAD, INSERT, UPDATE, DELETE

REFRESH IMMEDIATE LUW only


Sheryl M. Larsen, Inc. 2000-2012

126

MQTs
Use them as multi-table indexes with or without aggregates Optimizer is aware of all MQTs (for dynamically bound only for z/OS!) or direct reference for static Auto query rewrite (QRW) of base table queries to use MQTs if:

CURRENT REFRESH AGE = ANY CURRENT MAINTINED TABLE TYPES = SYSTEM, USER, ALL ENABLE QUERY OPTIMIZATION is used Referential constraints between base tables exists
Matters more than you think
Sheryl M. Larsen, Inc. 2000-2012

127

. To Build or not to Build


Generic

MQT strategies

HUGE MQT with many indexes Many small MQTs with few indexes

Optimal

MQT strategy

Most popular queries as MQTs


Common tables Common predicate sets Common data translations

Indexes on the popular ones to allow access to subset of MQT


Sheryl M. Larsen, Inc. 2000-2012

128

Popular Table Pivoting Syntax


SELECT SUM(CASE WHEN MONTH(SALES_DT) = 1 AS JAN_AMT , SUM(CASE WHEN MONTH(SALES_DT) = 2 AS FEB_AMT
THEN AMOUNT END) THEN AMOUNT END)

, SUM(CASE WHEN MONTH(SALES_DT) = 3 THEN AMOUNT END) AS MARCH_AMT , SUM(CASE WHEN MONTH(SALES_DT) = 4 THEN AMOUNT END) AS APRIL_AMT , SUM(CASE WHEN MONTH(SALES_DT) = 5 AS MAY_AMT FROM SALES WHERE CUST_ID = :hv

Generated THEN AMOUNT END) at Execution


MAY_AMT 3,838.22
129

JAN_AMT 238,50.

FEB_AMT 392.39

MARCH_AMT APRIL_AMT 8,029.39 2,380.83

Sheryl M. Larsen, Inc. 2000-2012

MQT INDEX: CUST_ID

MQT
CREATE TABLE CUST_PIVOT AS ( SELECT CUST_ID , SUM(CASE WHEN MONTH(SALES_DT) = 1 THEN AMOUNT AS JAN_AMT , SUM(CASE WHEN MONTH(SALES_DT) = 2 THEN AMOUNT AS FEB_AMT , SUM(CASE WHEN MONTH(SALES_DT) = 3 THEN AMOUNT AS MARCH_AMT , SUM(CASE WHEN MONTH(SALES_DT) = 4 THEN AMOUNT AS APRIL_AMT , SUM(CASE WHEN MONTH(SALES_DT) = 5 THEN AMOUNT AS MAY_AMT FROM SALES GROUP BY CUST_ID) DATA INITIALLY DEFERRED REFRESH DEFERRED MAINTAINED BY SYSTEM ENABLE QUERY OPTMIZATION;
Sheryl M. Larsen, Inc. 2000-2012

END)
END) END)

END)
END)

130

Query Speed Up
SELECT CUST_ID , SUM(CASE WHEN MONTH(SALES_DT) = 1 , SUM(CASE WHEN MONTH(SALES_DT) = 2 , SUM(CASE WHEN MONTH(SALES_DT) = 3 , SUM(CASE WHEN MONTH(SALES_DT) = 4 , SUM(CASE WHEN MONTH(SALES_DT) = 5 FROM SALES WHERE CUST_ID = 12 THEN AMOUNT THEN AMOUNT THEN AMOUNT THEN AMOUNT THEN AMOUNT END) AS JAN_AMT END)AS FEB_AMT END)AS MARCH_AMT END)AS APRIL_AMT END)AS MAY_AMT

SELECT * FROM CUST_PIVOT WHERE CUST_ID = 12

Accessed at Execution
MARCH_AMT APRIL_AMT 1,029.39 5,380.83 729.39 2,580.22 MAY_AMT 3,438.22 9,838.96

CUST_PIVOT
CUST_ID JAN_AMT 11 238,50. 12 298,50. FEB_AMT 342.39 352.30

13 738,50. 14 1,038,50.

362.32 372.31

8,769.39 2,029.39

7,360.33 2,387.55

538.48 3,825.00
131

Sheryl M. Larsen, Inc. 2000-2012

DPSI Indexes

DPSI versus NPSI


Clustering secondary index
But split by independent parts

Less overhead in Data Always include a filter on Sharing partitioning key or will have Cannot be UNIQUE until BIG SCAN! DB2 9! Partition by Data Partioned
Date

Can split for recovery Can cluster for access!! Be careful

Secondary Index DPSI


Type 2 Index
Root Page O O O
Non-Leaf Page O O O O

Type 2 Index
Root Page O O O

Clustered by Customer
Non-Leaf Page O O O O
Non-Leaf Page O O O

Type 2 Index
Root Page O O O

Non-Leaf Page O O O

Non-Leaf Page O O

Non-Leaf Page O O

Non-Leaf Page O O O

Non-Leaf Page O O

ge oo

Leaf Page o o o o o o

Leaf Page o o oo o o

Leaf Page o o oo oo

Leaf Page o o oo oo

Leaf Page o o oo oo

Leaf Page o o oo o o

Leaf Page o o oo o o

Leaf Page o o oo oo

Leaf Page o o o o o o

Leaf Page o o o o o o

Leaf Page o o o o o o

Leaf Page o o o o o o

Leaf Page o o o o o o

Leaf Page o o o o o o

Leaf Page o o o o o o

Leaf Page o o o o oo

Leaf Page o o o o oo

Leaf Page o o oo o o

Leaf Page o o oo o o

Leaf Page o o oo o o

Leaf Page o o oo o o

Leaf Page o o oo o o

Leaf Page o o oo o o

Le o o

Sheryl M. Larsen, Inc. 2000-2012

132

Helps Improve Page Density


V7
Customer Detail ALL years
Partition/Cluster Partition/Cluster by Date Partition/Cluster by Date Partition/Cluster by Date Partition/Cluster by Date Partition/Cluster by Date by Date

Custid = me, date between ? And ?

BP07
Custid = me, date between ? And ?

V8
Customer Detail All Years

Partition by Date Partition by Date Cluster by Custid Partition by Date Cluster by Custid Partition by Date Cluster by Custid Partition by Date Cluster by Custid Cluster by Custid
Sheryl M. Larsen, Inc. 2000-2012

133

Backward Index Scans


WHERE COL2 = :hv To avoid a sort for ORDER BY COL1 DESC DESC , COL3 DESC Just REBIND! Further assists COL1,COL2,COL3 Type 2 Index sort avoidance for Index ASC Root Page ORDER BY

O O O Non-Leaf Page O O O Non-Leaf Page O O Non-Leaf Page O O O O

Leaf Page o oo oo

Leaf Page o o oo oo

Leaf Page o o o o o o

Leaf Page o o oo oo

Leaf Page o o oo oo

Leaf Page o o o o o o

Leaf Page o o oo oo

Leaf Page o o oo oo

Le o o

Sheryl M. Larsen, Inc. 2000-2012

134

GROUP BY Expression
GROUP

BY T1.COL4/:hv * T2.COL9 Had to put calculation in a view or table expression in past releases Still may be a two step process No scalar-fullselects, LOBs, correlated values, non-deterministic or external functions. Materialized Query Tables, MQTs, can help avoid the sort by pre-calculating requested aggregates and subtotals
Sheryl M. Larsen, Inc. 2000-2012

135

IS NOT DISTINCT FROM

For three value logic comparisons that do not want NULL as an answer.
TRUE is preferred when comparing two NULLS

SELECT FROM WHERE

T1.*, T2.* Stage 1 Indexable T1, T2 T1.C1 IS NOT DISTINCT FROM T2.C2

When you want to join NULLs, or use TRUE in a subquery


Sheryl M. Larsen, Inc. 2000-2012

136

Scalar Fullselect

Can use anywhere an expression can be used

(CASE expression WHEN expression THEN expression ELSE a good place for a scalar fullselect END) AS expression_name

Parenthesis are optional but a good idea


SELECT (CASE COL1 WHEN 3 THEN THREE WHEN 4 THEN FOUR ELSE (SELECT MIN(LISTING) FROM T1) END) AS SPELLED_OUT FROM T4 WHERE COL5 > 99
Sheryl M. Larsen, Inc. 2000-2012

137

Dynamic Scrollable Cursors


A scrollable cursor that does not create a workflile in TEMPDB Can feel the updates by other users because access is to the base table Defaults to single row fetch but can be multi-row Supported with stored procedures

DECLARE SDC1 SENSITIVE DYNAMIC SCROLL CURSOR FOR SELECT C6, C7 FROM T4;
138

Sheryl M. Larsen, Inc. 2000-2012

INSERT with SELECT


SELECT * FROM INSERT (C7,C8) INTO T1 VALUES (X, CURRENT TIMESTAMP);

SELECT from the INSERTed row Lets you see:

This is now a one step process Eliminates the need to execute: IDENTITY_VAL_LOCAL()

Identity column value Defaults Expression results After Trigger values Special Register values
CURRENT TIMESTAMP

ROWIDs SEQUENCEs
139

Sheryl M. Larsen, Inc. 2000-2012

INSERT with SELECT


DECLARE FCSR FOR SELECT C8 FROM FINAL TABLE (INSERT (C7,C8,) INTO T1 VALUES (X, CURRENT DATE));
OPEN FCSR; 2003-04-29 FETCH C8 INTO :MY-DT; UPDATE T1 SET C8 = C8 + 1 DAY; 2003-04-29 FETCH FCSR INTO :MY-DT;
Sheryl M. Larsen, Inc. 2000-2012

140

DB2 9 SQL Enhancements


CPU savings even without application rewrite More savings with exploitation of new features

141

DB2 9 SQL Enhancements


TRUNCATE
MERGE SELECT

FROM UPDATE/DELETE EXCEPT, INTERSECT OLAP Expressions ORDER BY / FETCH FIRST in Subselect

Sheryl M. Larsen, Inc. 2000-2012

142

TRUNCATE and Triggers


TRUNCATE TABLE SML_TABLE tells DB2 to empty allocated storage REUSE STORAGE but keep it allocated IGNORE DELETE TRIGGERS IMMEDIATE; TRUNCATE TABLE SML_TABLE DROP STORAGE RESTRICT DELETE TRIGGERS which will return an error IMMEDIATE;

if there are any delete triggers defined on the table.

Sheryl M. Larsen, Inc. 2000-2012

143

MERGE INTO TAB2 N USING (VALUES ('0000001601' ,2,5, 'C, '07/29/2004') FOR 1 ROWS AS X (CLNT_ID , NAME_ID ,NAME_TYPE,NAME_MID ,NAME_START_DT) ON N.CLNT_ID = X.CLNT_ID AND N.NAME_ID = X.NAME_ID WHEN MATCHED THEN UPDATE SET N.NAME_TYPE = X.NAME_TYPE ,N.NAME_MID = X.NAME_MID ,N.NAME_START_DT = X.NAME_START_DT not WHEN NOT MATCHED THEN INSERT (CLNT_ID,NAME_ID,NAME_TYPE,NAME_START_DT) VALUES (X.CLNT_ID,X.NAME_ID,X.NAME_TYPE,X.NAME_START_DT) ;

MERGE

If row does exist then

Sheryl M. Larsen, Inc. 2000-2012

144

MERGE INTO KM45 N USING (VALUES (:CLNT_ID,:NAME_ID,:NAME_TYPE,:NAME_MID,:NAME_START_DT) FOR :ARRAY_LENGTH ROWS AS X (CLNT_ID , NAME_ID ,NAME_TYPE,NAME_MID ,NAME_START_DT) Host Size of ON N.CLNT_ID = X.CLNT_ID AND Arrays N.NAME_ID = X.NAME_ID WHEN MATCHED THEN UPDATE SET N.NAME_TYPE = X.NAME_TYPE ,N.NAME_MID = X.NAME_MID ,N.NAME_START_DT = X.NAME_START_DT WHEN NOT MATCHED THEN INSERT (CLNT_ID,NAME_ID,NAME_TYPE,NAME_START_DT) VALUES (X.CLNT_ID,X.NAME_ID,X.NAME_TYPE,X.NAME_START_DT) ;

MERGE Example

Arrays

Variable

Sheryl M. Larsen, Inc. 2000-2012

145

SELECT FROM UPDATE/INSERT/DELETE


FINAL FINAL OLD OLD FINAL TABLE TABLE (searched DELETE statement) (MERGE statement) TABLE TABLE (INSERT statement) (searched UPDATE statement) correlation-clause

SELECT UPDATED_TIMESTAMP FROM FINAL TABLE (UPDATE KM45 N SET N.NAME_TYPE = 5 ,N.NAME_MID = 'C' ,N.NAME_START_DT = '07/29/2004' WHERE N.CLNT_ID = '0000001601' AND N.NAME_ID = 2) AS XYZ;
Sheryl M. Larsen, Inc. 2000-2012

146

EXCEPT, INTERSECT
NAME

V9
SELECT AS R1 INTERSECT SELECT . . AS R2
NAME Able

Able

R1

Able Baker Baker


NAME

SELECT AS R1 UNION SELECT . . AS R2


NAME Able

R2

Able Able Charlie Charlie

SELECT AS R1 UNION ALL SELECT . . AS R2


NAME Able Able Baker Baker Able Able Charlie

SELECT AS R1 EXCEPT SELECT . . AS R2


NAME Baker

SELECT AS R1 EXCEPT ALL SELECT . . AS R2


NAME Baker Baker

SELECT AS R1 INTERSECT ALL SELECT . . AS R2


NAME Able Able Able Able

Baker Baker Able Able Able Able Charlie Charlie

Baker Charlie

Charlie Sheryl M. Larsen, Inc. 2000-2012

147

Needles Alternative
List the clients that have at least one active policy in very line of business offered by State Farm.
SELECT DISTINCT PR1.CLNT_ID FROM POLICY_ROLE PR1 WHERE NOT EXISTS (SELECT DISTINCT P1. LOB FROM POLICY P1 ) EXCEPT (SELECT DISTINCT PR2.LOB FROM POLICY_ROLE PR2 WHERE PR2.CLNT_ID = PR1.CLNT_ID AND PR2.CLNT_PLCY_END_DT IS NULL ) All A F H L

All A F H L

True A F L

False

-=
A F H L 701

-=

801

Sheryl M. Larsen, Inc. 2000-2012

148

EXCEPT Example
If the employee works on every project located in Denver, then list the employees social security number and name.
SELECT NAME, SSN FROM EMPLOYEE E WHERE NOT EXISTS ((SELECT PROJECT.PNUMBER FROM PROJECT WHERE PLOCATION = DENVER') EXCEPT (SELECT W.PNUMBER FROM WORKSON WHERE E.SSN = W.SSN)); Test one SSN at a time If their list matches They win!
149

All P11 P26 P84 P99

Sheryl M. Larsen, Inc. 2000-2012

OLAP Expressions
window-order-clause

,
NULLS LAST ASC ORDER BY sort-key-expression ASC NULLS FIRST NULLS LAST DESC DESC NULLS FIRST

Sheryl M. Larsen, Inc. 2000-2012

150

BRIDGE PAIR SCORE 620 620 -50 170 170 140 650 620

OLAP Examples
SELECT PAIR ,SCORE ,RANK() OVER(ORDER BY SCORE DESC) AS RANK ,DENSE_RANK() OVER(ORDER BY SCORE DESC) AS DRANK ,ROW_NUMBER() OVER(ORDER BY SCORE DESC) AS ROWNUM FROM BRIDGE -- FETCH FIRST 5 -ROWS ONLY PAIR SCORE RANK DRANK ROWNUM ---- ----- ---- ----- ------- ORDER BY PAIR F 650 1 1 1 A 620 2 2 2 C 620 2 2 3 H 620 2 2 4 Rows will not G 170 5 3 5 come back in B 170 5 3 6 ROWNUM D 140 7 4 7 sequence E -50 8 5 8 8 record(s) selected
Sheryl M. Larsen, Inc. 2000-2012

A C E G B D F H

151

ORDER BY / FETCH FIRST in SubSelect for Ranking


Query: SELECT C.NAME, C.ADDRESS, C.PHONE,
CM.SCORE_SEQ, CM.RISK_RANK FROM CUSTOMER C , (SELECT CM.CUST_NMBR , ROW_NUMBER() OVER CUST_SCORE) AS SCORE_SEQ , CM.RISK_RANK FROM CUSTMAST CM WHERE CM.CONT LIKE :hv-cont AND CM. CREDIT LIKE :hv-credit ORDER BY CM.CUST_SCORE DESC FETCH FIRST 100 ROWS ONLY) AS CM WHERE C.CUST_NMBR = CM.CUST_NMBR ORDER BY C.RISK_RANK
Sheryl M. Larsen, Inc. 2000-2012

152

ORDER BY / FETCH FIRST in SubSelect to Limit


Query:
DECLARE C1 CURSOR WITH ROWSET POSITIONING FOR SELECT C.NAME, C.ADDRESS, C.PHONE FROM CUSTOMER C WHERE C. CUST_NMBR IN (SELECT CM.CUST_NMBR FROM CUSTMAST CM WHERE CM.CONT LIKE :hv-cont AND CM. CREDIT LIKE :hv-credit AND CM.CUSTNMBR >= :hv-last-cn ORDER BY CM.CUSTNMBR FETCH FIRST 51 ROWS ONLY) ;
Sheryl M. Larsen, Inc. 2000-2012

153

Fill the Screen Request


Client Program
DECLARE C1 CURSOR WITH ROWSET POSITIONING FOR .. Query FETCH FIRST 51 ROWS ONLY;

DB2 FOR z/OS

FETCH FROM C1 FOR 51 ROWS INTO :ARRAYS


If SQLCODE = 100 AND SQLERRD(3) > 0 Process rows If 51, set more flag If SQLCODE = 100 AND SQLERRD(3) = 0 CLOSE C1 COMMIT

Network
D DB2 D F DBM1

Return
To Handle COMMIT

Index Data
154

Sheryl M. Larsen, Inc. 2000-2012

ORDER BY / FETCH FIRST in Table Expression


Get

customers total sales, list alphabetically

SELECT C.CUST_NAME, C.CUST_PHONE, S.TOTAL_SALES FROM CUSTOMER C , (SELECT S.CUST_ID, SUM(S.SALES) AS TOTAL_SALES FROM SALES S WHERE S.SALES_DATE BETWEEN :date-lo AND :date-hi GROUP BY S.CUST_ID) AS S WHERE C.CUST_ID = S.CUST_ID FETCH FIRST 22 ROWS ONLY ORDER BY S.CUST_NAME

Sheryl M. Larsen, Inc. 2000-2012

155

Table Expression with ORDER BY


Can

do powerful ranking Get top 22 customers in total sales


SELECT C.CUST_NAME, C.CUST_PHONE, S.TOTAL_SALES FROM CUSTOMER C , (SELECT S.CUST_ID, SUM(S.SALES) AS TOTAL_SALES FROM SALES S WHERE S.SALES_DATE BETWEEN :date-lo AND :date-hi GROUP BY S.CUST_ID FETCH FIRST 22 ROWS ONLY ORDERY BY TOTAL_SALES DESC) AS S WHERE C.CUST_ID = S.CUST_ID FETCH FIRST 22 ROWS ONLY ORDERY BY S.TOTAL_SALES DESC
Sheryl M. Larsen, Inc. 2000-2012

156

New Needle in the HaystackWorkshop F


SELECT S.NAME, S.SID, S.PHONE FROM SMLU_STUDENT S WHERE S.SID NOT IN(list challenged student IDs) AND NOT EXISTS

SID 456 789

((SELECT SID, CLASS_ID, TIME_ID FROM SMLU_STUDENT_SCHED SS WHERE SS.SID = :challenged-sid) EXCEPT

CLASS TIME SID ID ID 123 MATH 08:00 123 BIO 10:00

CLASS SID ID 456 MATH 456 ENGL 456 BIO 789 BIO

TIME ID 08:00 09:00 10:00 10:00

(SELECT SID, CLASS_ID, TIME_ID FROM SMLU_STUDENT_SCHED SSS WHERE SSS.SID = S.SID ))

Sheryl M. Larsen, Inc. 2000-2004

157

DB2 SQL Trends


DB2 for LUW V8 vs. DB2 for z/OS V8
Stage1 unlike data types, Multi-row INSERT, Multi-row FETCH, Dynamic Scrollable Cursors, Multiple CCSIDs per statement, Enhanced UNICODE, and Parallel Sort

Inner and Outer Joins, Table Expressions, Subqueries, GROUP BY, Complex Correlation, Global Temporary Tables, CASE, 100+ Built-in Functions, Limited Fetch, Scrollable Cursors, UNION Everywhere, MIN/MAX Single Index Support, Self Referencing Updates with Subqueries, Sort Avoidance for ORDER BY, and Row Expressions 2M Statement Length, GROUP BY Expression, Sequences, Scalar Fullselect, Materialized Query Tables, Common Table Expressions, Recursive SQL, CURRENT PACKAGE PATH, VOLATILE Table Support, Star Join Sparse Index, Qualified Column names, Multiple DISTINCT clauses, IS NOT DISTINCT FROM, ON COMMIT DROP, Transparent ROWID Column, GET DIAGNOSTICS Updateable UNION in Views, INSERT with UPDATE/DELETE, ORDER BY/FETCH FIRST in subselects & table expressions, GROUPING SETS, ROLLUP, CUBE, INSTEAD OF TRIGGER, EXCEPT, INTERSECT, and 16 Built-in Functions
Sheryl M. Larsen, Inc. 2000-2012

158

DB2 9 z/OS vs. DB2 9.5 LUW


Stage1 unlike data types, Multi-row INSERT, FETCH, Multi-row cursor UPDATE, Dynamic Scrollable Cursors, Multiple CCSIDs per statement, GET DIAGNOSTICS, Enhanced UNICODE, IS NOT DISTINCT FROM, VARBINARY, FETCH CONTINUE, MERGE

Inner and Outer Joins, Table Expressions, Subqueries, GROUP BY, Complex Correlation, Global Temporary Tables, CASE, 100+ Built-in Functions including SQL/XML, Limited Fetch, Insensitive Scrollable Cursors, UNION Everywhere, MIN/MAX Single Index Support, Self Referencing Updates with Subqueries, Sor Avoidance for ORDER BY, and Row Expressions 2M Statement Length, GROUP BY Expression, Sequences, Scalar Fullselect, Materialized Query Tables, Common Table Expressions, Recursive SQL, CURRENT PACKAGE PATH, VOLATILE Table Support, Star Join Sparse Index, Qualified Column names, Multiple DISTINCT clauses, ON COMMIT DROP, Transparent ROWID Column, call from trigger, statement isolation, FOR READ ONLY KEEP UPDATE LOCKS, SET CURRENT SCHEMA, client special registers, long SQL Object names, SELECT FROM INSERT, UPDATE, DELETE, MERGE, INSTEAD OF TRIGGER, Native SQL Procedure Language, BIGINT, file reference variables, XML, FETCH FIRST & ORDER BY IN subselect and fullselect, caseless comparisons, INTERSECT, EXCEPT, not logged tables, DECIMAL FLOAT, XQuery,TRUNCATE OLAP Functions, Session variables, OmniFind, Spatial, ROLE GROUPING SETS, ROLLUP, CUBE, Many Built-in Functions, SET CURRENT ISOLATION , multi-site join, MERGE, ARRAY data type, global variables, Oracle syntax, XML enhancements
Sheryl M. Larsen, Inc. 2000-2012

159

DB2 10 for z/OS vs. DB2 9.7 for LUW


Multi-row INSERT, FETCH, Multi-row cursor UPDATE, Dynamic Scrollable Cursors, GET DIAGNOSTICS, Enhanced UNICODE, MERGE, SELECT FROM MERGE, IS NOT DISTINCT FROM, VARBINARY, FETCH CONTINUE temporal data, access controls Inner and Outer Joins, Table Expressions, Subqueries, GROUP BY, Complex Correlation, Global Temporary Tables, CASE, 100+ Built-in Functions including SQL/XML, Limited Fetch, Insensitive Scrollable Cursors, UNION Everywhere, MIN/MAX Single Index Support, Self Referencing Updates with Subqueries, Sort Avoidance for ORDER BY, and Row Expressions 2M Statement Length, GROUP BY Expression, Sequences, Scalar Fullselect, Materialized Query Tables, Common Table Expressions, Recursive SQL, CURRENT PACKAGE PATH, VOLATILE Table Support, Star Join Sparse Index, Qualified Column names, Multiple DISTINCT clauses, ON COMMIT DROP, Transparent ROWID Column, call from trigger, statement isolcation, FOR READ ONLY KEEP UPDATE LOCKS, SET CURRENT SCHEMA, client special registers, long SQL Object names, SELECT FROM INSERT, UPDATE, DELETE, MERGE, INSTEAD OF TRIGGER, Native SQL Procedure Language, BIGINT, file reference variables, XML, FETCH FIRST & ORDER BY IN subselect and fullselect, caseless comparisons, INTERSECT, EXCEPT, not logged tables, DECIMAL FLOAT, XQuery, TRUNCATE, OLAP Functions, Session variables, OmniFind, Spatial, DECIMAL FLOAT, Moving SUM/AVG, TRUNCATE, ROLE ,last committed, CREATED temps Updateable UNION in Views, GROUPING SETS, ROLLUP, CUBE, Many Built-in Functions, SET CURRENT ISOLATION , multi-site join, MERGE, ARRAY data type, more vendor friendly syntax, parameterized cursers, CREATE MODULE 160

SQL for 2010 and Beyond


A

whole lot more than just data access Fits right in anything you embedded SQL before Fits right in Java Fits right in pureQuery For highly scalable transactions

Sheryl M. Larsen, Inc. 2000-2012

161

Appendix A
DB2 10 SQL Enhancements

162

DB2 10 SQL
Result
Work Files

SQL

SQLPL in Triggers and UDFs Allow BIFs & scalar UDFs in check constraints Moving SUM Moving AVG SQL Paging for partial result Instance based statement hints SQL CREATE VARIABLE

Stage 2 Stage 1 Buffer Pool Buffer Manager


Data Index

Catalog Directory

Sheryl M. Larsen, Inc. 2000-2012

163

DB2 10 - Moving Average


Find the seven day centered moving average of XYZ stock for each day the stock traded. The window is specified by the row clause.
SELECT date,symbol, close_price, decimal(avg(close_price) over (order by date rows between 3 preceding and 3 following),6,3) as smooth_cp FROM stock
DATE SYMBOL CLOSE_PRICE SMOOTH_CP ------------------------------------------------------------------------04/23/2007 XYZ 110.125 112.343 04/24/2007 XYZ 109.500 112.000 04/25/2007 XYZ 110.000 111.854 04/26/2007 XYZ 119.750 112.125 04/27/2007 XYZ 110.625 112.678 04/30/2007 XYZ 111.125 113.285 05/01/2007 XYZ 113.750 113.589 05/02/2007 XYZ 114.000 112.160 05/03/2007 XYZ 113.750 112.214 05/04/2007 XYZ 112.125 112.160 05/07/2007 XYZ 109.750 111.339 05/08/2007 XYZ 111.000 110.642 05/09/2007 XYZ 110.750 110.125 05/10/2007 XYZ 108.000 109.725 05/11/2007 XYZ 109.125 109.718
Sheryl M. Larsen, Inc. 2000-2012

164

Numbers Graphed
122 120 118 116

CLOSE_PRICE SMOOTH_CP

114

112

110

108

106

104

102 XYZ XYZ XYZ XYZ XYZ XYZ XYZ XYZ XYZ XYZ XYZ XYZ XYZ XYZ XYZ 4/23/2007 4/24/2007 4/25/2007 4/26/2007 4/27/2007 4/30/2007 5/1/2007 5/2/2007 5/3/2007 5/4/2007 5/7/2007 5/8/2007 5/9/2007 5/10/2007 5/11/2007

Sheryl M. Larsen, Inc. 2000-2012

165

DB2 10 - Moving Average


For the stock XYZ, find the 7 day historical average for each day the stock traded. The window is specified by the range clause.
SELECT date,substr(dayname(date),1,9) as day, close_price, decimal(avg(close_price) over (order by date range 00000006. preceding),7,2) as avg_7_range, count(close_price) over (order by date range 00000006. preceding) as count_7_range
FROM stock WHERE symbol = XYZ DATE DAY CLOSE_PRICE AVG_7_RANGE COUNT_7_RANGE --------------------------------------------------------------------04/23/2007 Monday 110.125 110.12 1 04/24/2007 Tuesday 109.500 109.81 2 04/25/2007 Wednesday 110.000 109.87 3 04/26/2007 Thursday 119.750 112.34 4 04/27/2007 Friday 110.625 112.00 5 04/30/2007 Monday 111.125 112.20 5 05/01/2007 Tuesday 113.750 113.05 5 05/02/2007 Wednesday 114.000 113.85 5 05/03/2007 Thursday 113.750 112.65 5 05/04/2007 Friday 112.125 112.95 5 05/07/2007 Monday 109.750 112.67 5 05/08/2007 Tuesday 111.000 112.12 5 05/09/2007 Wednesday 110.750 111.47 5 05/10/2007 Thursday 108.000 110.32 5 05/11/2007 Friday 109.125 109.72 5
Sheryl M. Larsen, Inc. 2000-2012

166

Moving Average
$122.00 $120.00 $118.00 $116.00 $114.00 $112.00 $110.00 $108.00 $106.00 $104.00 $102.00 Wednesday Wednesday

CLOSE_PRICE AVG_7_RANGE

Wednesday

Tuesday

Monday

Monday

Monday

Friday

Friday

Tuesday

Thursday

Thursday

Tuesday

4/23/2007 4/24/2007 4/25/2007 4/26/2007 4/27/2007 4/30/2007 5/1/2007 5/2/2007 5/3/2007 5/4/2007 5/7/2007 5/8/2007 5/9/2007 5/10/2007 5/11/2007

Thursday

Friday

Sheryl M. Larsen, Inc. 2000-2012

167

DB2 10 - Data Paging for Partial Results


SELECT FROM phoneBook WHERE lastName = ? AND firstName >= ? OR lastName > ? ORDER BY lastName, firstName

Prior OR would be ugly if no MIA(Multi-Index-Access) Now this query can be satisified with a single index access (lastname, firstname in this example) Via a new access method called 'range list access' (currently 'NR' in explain).
Sheryl M. Larsen, Inc. 2000-2012

168

Appendix B
V8 SQL Enhancements Continued

169

V8 SQL Additional Enhancements


Parallel Sort Multiple DISTINCT

Sequences
Star Join Sparse Index Multiple CCSIDs per statement VOLATILE Table Support

Enhanced UNICODE
GET DIAGNOSTICS CURRENT PACKAGE PATH Qualified Column names

ON COMMIT DROP
Transparent ROWID Column
Sheryl M. Larsen, Inc. 2000-2012

170

Parallel Sort

For multi table sequencing:


GROUP BY 46% reduction in elapsed time ORDER BY 81% reduction in elapsed time DISTINCT Merge Scan Join

Only when less costly


4M Rows to .6M groups FETCH FIRST 10 ROWS -17% for all rows 4M Rows FETCH FIRST 10 ROWS -22% for all rows

Sheryl M. Larsen, Inc. 2000-2012

171

Multiple Distinct Clauses


SELECT

COUNT(DISTINCT(C4)), AVG(DISTINCT(C5), COUNT(DISTINCT(C6)) COUNT(DISCTINCT(C5) FROM T1 HAVING AVG(DISTINCT(C6))


-55% CPU, -45% Elapsed for 4 DISTINCTS

SELECT

This

is NOT

COUNT(DISTINCT(C4,C5, C6)) !!!!


172

Sheryl M. Larsen, Inc. 2000-2012

Sequences

Just like Oracle CREATE SEQUENCE ALTER SEQUENCE


RESTART WITH value INCREMENT BY MINVALUE MAXVALUE CYCLE/NO CYCLE CACHE/NO CACHE

Identity Column Improvements


RESTART WITH value INCREMENT BY MINVALUE MAXVALUE CYCLE/NO CYCLE CACHE/NOC CACHE

GRANT/REVOKE NEXT VALUE FOR EXPRESSION PREVIOUS VALUE FOR EXPRESSION

Sheryl M. Larsen, Inc. 2000-2012

173

Sequences Versus Identity Col


Stand alone Not limited to one table Retrieve via NEXT/PREV VALUE Can be altered via ALTER SEQUENCE Tied to a table or single column table If tied, limited to one table relationship Retrieve via IDENTITY_VAL_LOCAL() Can be altered in V8 via ALTER TABLE
174

Sheryl M. Larsen, Inc. 2000-2012

Volatile Table Support


CREATE TABLE SAP26459 VOLATILE

Forces index access for tables that have unpredictable cardinality

Can help SAP performance Can help any table that starts out empty and drastically changes throughout the day
Sheryl M. Larsen, Inc. 2000-2012

175

Multiple CCSIDs per Statement


Can now mix EBCDIC, ASCII, and Unicode tables and host variables Conversion to Unicode for unlike column CCSIDs

May materialize query

SELECT T6.EBCDIC_COL FROM T6, T7, T8 WHERE T7.ASCII_COL > T8.UNICODE_COL


Sheryl M. Larsen, Inc. 2000-2012

176

Enhanced Unicode
Catalog now stored in UNICODE Allows SQL to contain Unicode literals and names For Java and Microsoft integration For Package vendors

Old canned catalog queries have to be rewritten!

SAP, PeopleSoft, Siebel, etc.


Sheryl M. Larsen, Inc. 2000-2012

Range predicates Not = predicates

177

GET DIAGNOSTICS

Returns SQL Error Information


For whole statement When multiple errors occur

For SQL Message length > 70 (extended names, arrays)] Assume FETCH FROM C1 FOR 22 ROWS just executed

GET DIAGNOSTICS :num_rows = ROW_COUNT, :num_cond = NUMBER;


Results in 4 rows returned 22003 -802 5 Results in 1 error condition

GET DIAGNOSTICS CONDITION 1 :sqlstate = RETURNED_SQLSTATE, :sqlcode = DB2_RETURNED_SQLCODE, :row_num = DB2_ROW_NUMBER;


Sheryl M. Larsen, Inc. 2000-2012

178

CURRENT PACKAGE PATH


Less need for SQLJ and DDF apps Less network traffic for multiple PKLIST values Easier to switch to/from JDBC and SQLJ Improved handling of nested stored procedure packages

SET CURRENT PACKAGE PATH = FRST, SECD, PROD;

Sheryl M. Larsen, Inc. 2000-2012

179

Qualified Column Names

For UPDATEs

For INSERTs

UPDATE T2 SET T2.COL8 = :hv;

INSERT T2.COL9 INTO T2 VALUES (:hv);

Sheryl M. Larsen, Inc. 2000-2012

180

Miscellaneous

Limit increases
Table name 18 to 128 VIEW/ALIAS 18 to 128 Column name 18 to 30 SQL Statement to 2M Index key 255 to 2000 Predicates 255 to 32704 Characters 255 to 32704 Hex Digits 255 to 32704 Partitions 254 to 4096 Virtual Storage to 264

Distribution stats on non-index columns


Will not need DSTATS
181

Sheryl M. Larsen, Inc. 2000-2012

Miscellaneous

XML Publishing Functions


XMLELEMENT XMLATTRIBUTES XMLFOREST XMLFOREST XMLCONCAT XMLAGG XML2CLOB

Table function cardinality


SELECT * FROM TABLE(MYUDF(C5) CARDINALITY 99) AS XY; Helps DB2 using block data movement between table functions

AFTER TRIGGER workfiles are eliminated when old/new transition variables are retuned for 3 rows or less
182

Sheryl M. Larsen, Inc. 2000-2012

ON COMMIT DROP
For

DECLARED TEMPORARY tables Automatically drops table at COMMIT


When no cursors are open against it
Big

improvement on DDF threads that use CMTSTAT = INACTIVE


Stops DECLARED TEMP TABLES from preventing thread from going INACTIVE

Sheryl M. Larsen, Inc. 2000-2012

183

Transparent ROWID Column


Eliminates

the need to explicitly alter the table to add a ROWID column for the use of LOBs DB2 will generate a hidden ROWID column that is not visible at SELECT * FROM TABLE Simplifies porting LOBs from other platforms

Sheryl M. Larsen, Inc. 2000-2012

184

Appendix C
Repositioning Cursors

Sheryl M. Larsen, Inc. 2000-2012

185

EMP Table and Cursor


EMPNO 1 2 4 6 8 EMP_NAME JOE SAM JIM KELLY MIKE EMP_ADDR DOWNERS GROVE ELMHURST AURORA LIBERTYVILLE BARRINGTON EMP_PHONE 5552833820 5553824857 5559382737 5551293874 5551267480

DELCLARE EMPCSR CURSOR FOR SELECT EMP_NAME, EMP_ADDR, EMP_PHONE FROM EMP WHERE EMPNO > :lastempno ORDER BY EMPNO FETCH FIRST 2 ROWS ONLY;
Sheryl M. Larsen, Inc. 2000-2012

186

Get First 2 Rows


EMPNO 1 2 4 6 8 EMP_NAME JOE SAM JIM KELLY MIKE EMP_ADDR DOWNERS GROVE ELMHURST AURORA LIBERTYVILLE BARRINGTON EMP_PHONE 5552833820 5553824857 5559382737 5551293874 5551267480

SET :lastempno = 0 , :page0 in COM AREA OPEN EMPCSR; FETCH EMPCSR FOR 2 ROWS; Store :lastempno = :last-fetched-empno in COM AREA and :page1 Display screen

Sheryl M. Larsen, Inc. 2000-2012

187

Get Next 2 Rows


EMPNO 1 2 4 6 8 EMP_NAME JOE SAM JIM KELLY MIKE EMP_ADDR DOWNERS GROVE ELMHURST AURORA LIBERTYVILLE BARRINGTON EMP_PHONE 5552833820 5553824857 5559382737 5551293874 5551267480

Get :lastempno from COM AREA (=2 for page1) OPEN EMPCSR; FETCH EMPCSR FOR 2 ROWS; Store :lastempno = :last-fetched-empno in COM AREA and :page2
188

Sheryl M. Larsen, Inc. 2000-2012

Go Back 1 Page
EMPNO 1 2 4 6 8 EMP_NAME JOE SAM JIM KELLY MIKE EMP_ADDR DOWNERS GROVE ELMHURST AURORA LIBERTYVILLE BARRINGTON EMP_PHONE 5552833820 5553824857 5559382737 5551293874 5551267480

Get :lastempno from COM AREA for Page 0 (=0) OPEN EMPCSR; FETCH EMPCSR FOR 2 ROWS ; Store :firstempno and :page2 in COM AREA FETCH EMPCSR; Store :lastempno = :last-fetched-empno in COM AREA
Sheryl M. Larsen, Inc. 2000-2012

Always go an extra page back so the > works

189

BRWSUM Table Makes row unique, should have index COL1.COL2.COL3.COL4


COL1
A A

COL2
1 1

COL3
TT UU

COL4
99 77

COL5
Data . Data .

A
B B

4
2 3

SS
RR RR

66
66 77

Data .
Data . Data .

B
B B

3
3 4

RR
SS SS

88
66 99

Data .
Data . Data .

B
C
190

4
1 1

UU
SS SS

88
66 77

Data .
Data . Data .

Sheryl M. Larsen, Inc. 2000-2012

Declare Cursor
DELCLARE BRWSUM1 CURSOR FOR SELECT COL5 FROM BRWSUM WHERE ? AND ? AND ? AND ? AND ? AND ? AND ? ORDER BY COL1, COL2, COL3, COL4 FETCH FIRST 5 ROWS ONLY;
191
COL1 A A COL2 1 1 COL3 TT UU COL4 99 77 COL5 Data . Data .

A
B

4
2

SS
RR

66
66

Data .
Data .

B
B B B B C C

3
3 3 4 4 1 1

RR
RR SS SS UU SS SS

77
88 66 99 88 66 77

Data .
Data . Data . Data . Data . Data . Data .

Sheryl M. Larsen, Inc. 2000-2012

Declare BRWSUM1Cursor
DELCLARE BRWSUM1 CURSOR FOR SELECT COL5 FROM BRWSUM COL1 WHERE ((COL1 = :col1-last A AND COL2 = :col2-last A AND COL3 = :col3-last A AND COL4 > :col4-last) B OR (COL1 = :col1-last B AND COL2 = :col2-last B AND COL3 > :col3-last) B OR (COL1 = :col1-last B AND COL2 > :col2-last) B OR (COL1 > :col1-last)) C ORDER BY COL1, COL2, COL3, COL4C FETCH FIRST 5 ROWS ONLY;
192
Sheryl M. Larsen, Inc. 2000-2012

COL2 1 1 4 2 3 3 3 4 4 1

COL3 TT UU SS RR RR RR SS SS UU SS

COL4 99 77 66 66 77 88 66 99 88 66

COL5 Data . Data . Data . Data . Data . Data . Data . Data . Data . Data .

SS

77

Data .

Get First 5 Rows SET


:col1-last = low values, :col2-last = 0, :col3-last = low values,:col4-last = 0, :page0 in COM AREA

OPEN BRWSUM1; FETCH BRWSUM1 FOR 5 ROWS; Store :col1-4-last = :last-fetchedrow in COM AREA and :page1 Display screen

COL1 A A A B B B B B B C C

COL2 1 1 4 2 3 3 3 4 4 1 1

COL3 TT UU SS RR RR RR SS SS UU SS SS

COL4 99 77 66 66 77 88 66 99 88 66 77

COL5 Data . Data . Data . Data . Data . Data . Data . Data . Data . Data . Data .

193
Sheryl M. Larsen, Inc. 2000-2012

Get Next 5 Rows Get from COM AREA


:col1-last = B, :col2-last = 3, :col3-last = RR,:col4-last =77
OPEN BRWSUM1;
COL1 COL2 1 1 4 2 3 3 3 4 4 1 COL3 TT UU SS RR RR RR SS SS UU SS COL4 99 77 66 66 77 88 66 99 88 66 77 COL5 Data . Data . Data . Data . Data . Data . Data . Data . Data . Data . Data .

( (COL1 = B AND COL2 = 3 AND COL3 = RR AND COL4 > 77) OR (COL1 = B AND COL2 = 3 AND COL3 > RR) OR (COL1 = B AND COL2 > 3) OR (COL1 > B))

First Screen

A A A B B B B B B C

194

C 1 SS FETCH BRWSUM1 FOR 5 ROWS; Store :col1-4-last = :last-fetched-row in COM AREA and :page2 Display screen
Sheryl M. Larsen, Inc. 2000-2012

Go Back 1 Page
Get from COM AREA for page0 :col1-last = low values :col2-last = 0, :col3-last = low values,:col4-last =0
OPEN BRWSUM1;
COL1 COL2 1 1 4 2 3 3 3 4 4 1 COL3 TT UU SS RR RR RR SS SS UU SS COL4 99 77 66 66 77 88 66 99 88 66 77 COL5 Data . Data . Data . Data . Data . Data . Data . Data . Data . Data . Data .

( (COL1 = low AND COL2 = 0 AND COL3 = low AND COL4 > 0) OR (COL1 = low AND COL2 = 0 AND COL3 > low) OR (COL1 = low AND COL2 > 0) OR (COL1 > 0))

A A A B B B

Last Screen

B B B C

195

C 1 SS FETCH BRWSUM1 FOR 5 ROWS; Store :col1-4-last = :last-fetched-row in COM AREA and :page1 Display screen
Sheryl M. Larsen, Inc. 2000-2012

Index
Also

available in soft copy

Sheryl M. Larsen, Inc. 2000-2012

196

Você também pode gostar