Escolar Documentos
Profissional Documentos
Cultura Documentos
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
SQL Performance
DB2 Engine Components Predicate Processing Intelligence Optimizer Details SQL Performance Rules
SQL
Optimizer
Catalog
Meta Data
Directory
Access Plans
Buffer Pool
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
Index
RIDs
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
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
Stage 2
4K
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
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
10
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
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
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)))
WU.USER_ID
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
16
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
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
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
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
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:________
Relational Division
Joins
UNION
Subqueries
Table
Expressions
24
25
Join Basics
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
Homework Challenged
28
FROM
ON WHERE AND
Email T71
Sheryl M. Larsen, Inc. 2000-2012
29
Parenthesis required AS expression_name is required Cannot include ORDER BY or FETCH FIRST n ROWS ONLY in z/OS
SELECT
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
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
31
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
33
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
34
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
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
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
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
39
Can use generated data anywhere outside the table expression as long as you name it
Sheryl M. Larsen, Inc. 2000-2012
40
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
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
#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
22 22 22 23 23 23 23 36
LIBBY LOU MARTIN CLARK KELLY JADE KELLY JADE JOHN ADAMS
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
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
TOTAL_STOCK ----------1 1 8
Subquery Vertical
Vertical
Subselects
54
Scalar Subquery
55
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
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
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
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
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
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
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
Homework Challenged
62
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 SELECT Columns FROM TABX X, TABY Y WHERE X.COL1 = Y.COL1
Sheryl M. Larsen, Inc. 2000-2012
64
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 (
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
2. Join tables
3. Sort (if necessary) 4. Group/Aggregate 5. Filter summary rows
66
HAVING
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
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
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
Teams
Matches
70
Classes
Matches
Sheryl M. Larsen, Inc. 2000-2012
71
72
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
(SELECT 1 FROM POLICY P1 WHERE P1.LOB IN ('A', 'F','H','L') AND NOT EXISTS
LOB A F H L
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
Count unique LOB matches, eliminate groups without ALL LOBs Count total unique LOBs
75
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
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)
Practical Uses
82
SELECT FROM
INNER JOIN
TEMP1
INNER JOIN
ORDER BY
INNER JOIN
GROUP BY )
Sheryl M. Larsen, Inc. 2000-2012
ORDER BY
83
L1 L1 S1 S2 S2 S5
S1 S2 S7 S5 S6 S9
1 1 2 2 2 3
Rows
84
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
Else
INSERT INTO TEMP2 SELECT L.PART, L.SUBPART FROM TEMP1 T1, LEGO L WHERE T1.SUBPART = L.PART;
Sheryl M. Larsen, Inc. 2000-2012
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
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
90
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
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
93
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)
94
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
96
Other
97
98
99
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
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
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
104
105
#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
108
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
109
110
111
ORDER BY (CASE T1.EMPID WHEN 2345 THEN TOTAL_COMP 100,000.00 ELSE TOTAL_COMP END);
Sheryl M. Larsen, Inc. 2000-2012
112
113
114
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
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
117
ROWSET
Tyler Jack
383 494
2000-10-14 1996-05-21
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
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
120
Tyler Jack
Chris
Absolute 7
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
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
124
125
System-maintained
SQL REFRESH TABLE option
Deletes all rows, refills table, updates catalog
Can be fast!
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
MQT strategies
HUGE MQT with many indexes Many small MQTs with few indexes
Optimal
MQT strategy
128
, 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
JAN_AMT 238,50.
FEB_AMT 392.39
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
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
DPSI Indexes
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
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
132
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
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
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
For three value logic comparisons that do not want NULL as an answer.
TRUE is preferred when comparing two NULLS
T1.*, T2.* Stage 1 Indexable T1, T2 T1.C1 IS NOT DISTINCT FROM T2.C2
136
Scalar Fullselect
(CASE expression WHEN expression THEN expression ELSE a good place for a scalar fullselect END) AS expression_name
137
DECLARE SDC1 SENSITIVE DYNAMIC SCROLL CURSOR FOR SELECT C6, C7 FROM T4;
138
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
140
141
FROM UPDATE/DELETE EXCEPT, INTERSECT OLAP Expressions ORDER BY / FETCH FIRST in Subselect
142
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
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
145
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
R2
Baker Charlie
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
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
OLAP Expressions
window-order-clause
,
NULLS LAST ASC ORDER BY sort-key-expression ASC NULLS FIRST NULLS LAST DESC DESC NULLS FIRST
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
152
153
Network
D DB2 D F DBM1
Return
To Handle COMMIT
Index Data
154
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
155
156
((SELECT SID, CLASS_ID, TIME_ID FROM SMLU_STUDENT_SCHED SS WHERE SS.SID = :challenged-sid) EXCEPT
CLASS SID ID 456 MATH 456 ENGL 456 BIO 789 BIO
(SELECT SID, CLASS_ID, TIME_ID FROM SMLU_STUDENT_SCHED SSS WHERE SSS.SID = S.SID ))
157
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
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
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
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
Catalog Directory
163
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
165
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
167
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
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
171
SELECT
This
is NOT
Sequences
173
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
176
Enhanced Unicode
Catalog now stored in UNICODE Allows SQL to contain Unicode literals and names For Java and Microsoft integration For Package vendors
177
GET DIAGNOSTICS
For SQL Message length > 70 (extended names, arrays)] Assume FETCH FROM C1 FOR 22 ROWS just executed
178
179
For UPDATEs
For INSERTs
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
Miscellaneous
AFTER TRIGGER workfiles are eliminated when old/new transition variables are retuned for 3 rows or less
182
ON COMMIT DROP
For
183
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
184
Appendix C
Repositioning Cursors
185
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
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
187
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
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
189
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 .
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 .
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 .
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
( (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
196