DB2 Developers Guide to Optimum SQL Performance

Similar documents
Top 25+ DB2 SQL Tuning Tips for Developers. Presented by Tony Andrews, Themis Inc.

Useful Business Analytics SQL operators and more Ajaykumar Gupte IBM

Leveraging WebSphere Commerce for Search Engine Optimization (SEO)

Intro to Embedded SQL Programming for ILE RPG Developers

Name: Srinivasan Govindaraj Title: Big Data Predictive Analytics

SQL Query Performance Tuning: Tips and Best Practices

ERserver. DB2 Universal Database for iseries SQL Programming with Host Languages. iseries. Version 5

Programming Against Hybrid Databases with Java Handling SQL and NoSQL. Brian Hughes IBM

Advanced SQL. Jim Mason. Web solutions for iseries engineer, build, deploy, support, train

IBM Tivoli Service Request Manager 7.1

SQL Performance and Tuning. DB2 Relational Database

Unit 3. Retrieving Data from Multiple Tables

SQL Optimization & Access Paths: What s Old & New Part 1

Best Practices for DB2 on z/os Performance

z/os V1R11 Communications Server system management and monitoring

SQL Performance for a Big Data 22 Billion row data warehouse

Tune That SQL for Supercharged DB2 Performance! Craig S. Mullins, Corporate Technologist, NEON Enterprise Software, Inc.

SQL Tuning Proven Methodologies

Database lifecycle management

Oracle Database: SQL and PL/SQL Fundamentals NEW

DB2 for i5/os: Tuning for Performance

What new with Informix Software as a Service and Bluemix? Brian Hughes IBM

WebSphere Commerce V7 Feature Pack 2

Elena Baralis, Silvia Chiusano Politecnico di Torino. Pag. 1. Physical Design. Phases of database design. Physical design: Inputs.

Development Environment and Tools for Java. Brian Hughes IBM

Using Temporary Tables to Improve Performance for SQL Data Services

Focus on the business, not the business of data warehousing!

IBM Software Services for Collaboration

2874CD1EssentialSQL.qxd 6/25/01 3:06 PM Page 1 Essential SQL Copyright 2001 SYBEX, Inc., Alameda, CA

Oracle Database: SQL and PL/SQL Fundamentals

DB2 V8 Performance Opportunities

WebSphere Business Monitor

CA Performance Handbook. for DB2 for z/os

DataPower z/os crypto integration

Duration Vendor Audience 5 Days Oracle End Users, Developers, Technical Consultants and Support Staff

ADVANCED 1 SQL PROGRAMMING TECHNIQUES

Embedded SQL programming

Displaying Data from Multiple Tables. Chapter 4

Top Ten SQL Performance Tips

z/os V1R11 Communications Server System management and monitoring Network management interface enhancements

Communications Server for Linux

1Z0-117 Oracle Database 11g Release 2: SQL Tuning. Oracle

Instant SQL Programming

Using AS/400 Database Monitor To Identify and Tune SQL Queries

Deploying a private database cloud on z Systems

Overview of Storage and Indexing. Data on External Storage. Alternative File Organizations. Chapter 8

IBM s Cloud Platform : IBM Bluemix

WebSphere DataPower Release DNS Enhancements

Oracle Database 12c: Introduction to SQL Ed 1.1

IBM WebSphere Application Server Communications Enabled Applications

Guide to Performance and Tuning: Query Performance and Sampled Selectivity

Performance Implications of Various Cursor Types in Microsoft SQL Server. By: Edward Whalen Performance Tuning Corporation

Information Systems SQL. Nikolaj Popov

Driving Smarter, More Efficient Supply Chains Through Analytics

IBM DB Introduction to SQL and database objects Hands-on Lab. Information Management Cloud Computing Center of Competence.

Oracle Database: SQL and PL/SQL Fundamentals

Oracle EXAM - 1Z Oracle Database 11g Release 2: SQL Tuning. Buy Full Product.

IBM Cognos Controller Version New Features Guide

IBM Software Group Enterprise Networking Solutions z/os V1R11 Communications Server

RDBMS Using Oracle. Lecture Week 7 Introduction to Oracle 9i SQL Last Lecture. kamran.munir@gmail.com. Joining Tables

How To Choose A Business Continuity Solution

Database DB2 Universal Database for iseries Embedded SQL programming

Overview of Storage and Indexing

Using SQL in RPG Programs: An Introduction

Analytics Powered Smarter Merchandising

Redbooks Paper. Local versus Remote Database Access: A Performance Test. Victor Chao Leticia Cruz Nin Lei

Performance rule violations usually result in increased CPU or I/O, time to fix the mistake, and ultimately, a cost to the business unit.

SQL Server. 1. What is RDBMS?

SQL SELECT Query: Intermediate

Industry Models and Information Server

Introduction to PL/SQL Programming

Handling Exceptions. Copyright 2006, Oracle. All rights reserved. Oracle Database 10g: PL/SQL Fundamentals 8-1

WebSphere Business Monitor

Chapter 9, More SQL: Assertions, Views, and Programming Techniques

SQL Query Evaluation. Winter Lecture 23

Requirements Change Management and Artifact Workflow. DOP-1027 DOORS Next Generation

D B M G Data Base and Data Mining Group of Politecnico di Torino

Practical Performance Understanding the Performance of Your Application

An Oracle White Paper December Advanced Network Compression

DBMS / Business Intelligence, SQL Server

Embedding SQL in High Level Language Programs

Handling Exceptions. Schedule: Timing Topic. 45 minutes Lecture 20 minutes Practice 65 minutes Total

Displaying Data from Multiple Tables

ADY-1727: IBM Watson Analytics and Cognos Business Intelligence for Line of Business Smart Data Discovery

Analyze Database Optimization Techniques

Introduction to Microsoft Jet SQL

System Monitor Guide and Reference

IBM RATIONAL PERFORMANCE TESTER

Maximo Cognos BI. Pam Denny Maximo BI Architect Twitter: andbflo_denny IBM Corporation

Examine the structure of the EMPLOYEES table: EMPLOYEE_ID NUMBER Primary Key FIRST_NAME VARCHAR2(25) LAST_NAME VARCHAR2(25)

IBM Software Information Management Creating an Integrated, Optimized, and Secure Enterprise Data Platform:

Security of Cloud Computing for the Power Grid

Managing and Securing the Mobile Device Invasion IBM Corporation

Transcription:

DB2 Developers Guide to Optimum SQL Performance Réunion du Guide DB2 pour z/os France Lundi 18 mars 2013 Tour Euro Plaza, Paris-La Défense Tom Beavin Silicon Valley Lab Email: beavin@us.ibm.com 2012 IBM Corporation

Please Note: IBM s statements regarding its plans, directions, and intent are subject to change or withdrawal without notice at IBM s sole discretion. Information regarding potential future products is intended to outline our general product direction and it should not be relied on in making a purchasing decision. The information mentioned regarding potential future products is not a commitment, promise, or legal obligation to deliver any material, code or functionality. Information about potential future products may not be incorporated into any contract. The development, release, and timing of any future features or functionality described for our products remains at our sole discretion. Performance is based on measurements and projections using standard IBM benchmarks in a controlled environment. The actual throughput or performance that any user will experience will vary depending upon many factors, including considerations such as the amount of multiprogramming in the user's job stream, the I/O configuration, the storage configuration, and the workload processed. Therefore, no assurance can be given that an individual user will achieve results similar to those stated here. 2

Outline Write efficient predicates Minimize SQL traffic Use multi-row operations Avoid sorting whenever possible Only touch columns and rows you need Literals vs. variables know the difference Subqueries vs Joins OPTIMIZE FOR n ROWS +++ 3

Traits of a well-performing SQL query Written in an efficient form Accurate statistics Optimal optimizer settings Adequate system resources 4

Query Optimization SQL QUERY SELECT N_NAME, COUNT(*) FROM ORDER, CUSTOMER, NATION WHERE C_NATIONKEY = N_NATIONKEY AND C_CUSTKEY = O_CUSTKEY AND N_REGIONKEY = 4 Database Objects: Tables Indexes Views MQTs... AND O_ORDERDATE BETWEEN? AND? GROUP BY N_NAME; Statistics: # of rows in tables # of distinct column values... Configuration: 5 Buffer pools Sort pool RID pool... Optimizer

Predicates, predicates, predicates... A prime influence on access paths Predicates Found inside WHERE, ON, HAVING clauses Have a huge impact on query performance! Can be: Extremely filtering (qualify very few rows) = good! Poorly filtering (qualify a ton of rows) SELECT... FROM EMP E, DEPT D Local pred Local pred Join pred WHERE E.GENDER = F AND E.AGE BETWEEN 25 AND 65 AND E.DEPTID = D.DEPTID AND E.SAL = (SELECT MAX(SAL) FROM EMP WHERE...) AND E.EDU IN ( BA, BS, MA, MS ) equal range equal subquery In list 6

Predicates: Indexable or Not? Indexable Predicates Can match to index entries May or may not become index matching predicates depending on available indexes and access path selected The best kind of predicates Not Indexable Predicates Cannot match index entries WHERE LASTNAME = 'SMITH' AND FIRSTNAME <> 'JOHN' Indexable Not Indexable 7

Predicate Processing Index Matching Restrict the range of data that is retrieved Index Matching defines START and STOP keys on the index All other predicates will reject rows based upon this retrieved range of data Index on EMPLOYEE(LASTNAME, FIRSTNAME, AGE) SELECT COUNT(*) FROM EMPLOYEES WHERE LASTNAME = SPADE AND FIRSTNAME = SAM AND SALARY >? 8

Predicate Processing Index Screening Applied on the index after matching predicates, but before data access Column needs to exists in the chosen index Screening predicates do not limit the number of index entries read But can limit the number of data rows retrieved Index on EMPLOYEE(LASTNAME, FIRSTNAME, AGE) SELECT COUNT(*) FROM EMPLOYEES WHERE LASTNAME = SPADE AND SALARY >? AND AGE >? 9

Predicate Processing Rscan (d) fetch fixpg join data page Iscan (e) fetch find key fixpg index page Relational Data Service (RDS) Data Manager Index Manager Residual Predicates UPPER(PROJ) LIKE %DEV% Others GRADE <> X Index Screening SAL > 125000 Index Matching TYPE = ENGINEER Stage 1 Stage 2 Database SELECT... FROM EMP WHERE TYPE = ENGINEER AND SAL > 125000 AND GRADE <> X AND UPPER(PROJ) LIKE %DEV% Index on (TYPE, DEPT, SAL) 10

Predicate Processing (contd.) Stage 1 Evaluated by the Data/Index Manager with relatively little expense Some Stage 1 predicates are Indexable (i.e. use indexes) Stage 2 Much more expensive for DB2 to resolve due to additional processing and code path. Cannot make effective use of indexes. What determines stage 1 vs stage 2? Predicate syntax Type and length of constants or columns in the predicate Whether the predicate is applied before or after a join Table join sequence Read the official books for your particular release Well written queries Filter as much as needed/possible within the query itself Favor Stage 1 Indexable -> Stage 1 Others -> Stage 2 11

Promote predicates to earlier stage Watch out for functions or arithmetic against columns Stage 2 Stage 1 Indexable QTY * 2 = :hv QTY = :hv / 2 YEAR(DCOL) = 2008 :hv BETWEEN C1 AND C2 DCOL + 10 YEARS < CURRENT DATE DCOL BETWEEN '2008-01-01' AND '2008-12-31' :hv >= C1 AND :hv <= C2 DCOL < CURRENT DATE - 10 YEARS DCOL <> '9999-12-31' GENDER <> 'F' DCOL < '9999-12-31' GENDER = 'M' 12

Minimize SQL traffic Don t issue SQL if you can avoid it E.g., Consider caching read-only constants on client Avoid generic I/O boxes E.g., Consider customizing your SQL to suit your true need Avoid joins in applications Let DB2 do what it does best 13

Avoid touching unnecessary data Only touch the columns you really need Extra columns can be a drag on performance Access path may not be the best E.g., INDEXONLY not available Data is carried all the way from disk to the client Increased CPU costs Avoid SELECT * unless really needed 14

Don t return unnecessary rows Don t filter rows in the application that DB2 can filter Use predicates Consider FETCH FIRST n ROWS only When the client will only see a limited # of rows DB2 optimizes the access path accordingly Can be used in subselects 15 SELECT PNAME, PCOST, SALARY, PID FROM PRODUCTS WHERE (PNAME =? AND PID >?) OR (PNAME >?) ORDER BY PNAME, PID FETCH FIRST 20 ROWS ONLY

Don t use features that aren t needed Specify FOR READ ONLY on cursors that aren t going to be used for positioned update / delete Default is to assume cursor might be used for positioned delete Some query optimizations can only be done on read-only cursors Specify NO SCROLL for cursors that don t need scrolling (or take the default) Scrolling adds overhead, even if only fetching in a forward direction Some query optimization can only be done on non-scroll cursors 16 Multi-row Fetch great if fetching lot s of data, but if fetching only a few rows: Adds overhead to fetch rows that might not be needed Some query optimizations can only be done on single-row fetch cursors

Minimize SQL traffic Use Multi-row FETCH Returns up to 32,767 rows in a single API call Significant CPU performance improvements Works for static or dynamic SQL Works for scrollable or non-scrollable cursors Support for positioned UPDATEs and DELETEs Sample program DSNTEP4 = DSNTEP2 with multi-row fetch) 17

Minimize SQL traffic Use Multi-row FETCH Coding multi-row fetch WITH ROWSET POSITIONING on cursor declaration NEXT ROWSET and FOR n ROWS on the FETCH Define host variable arrays Fetch loop to process the rows When using multi-row fetch Avoid GET DIAGNOSTICS due to high CPU overhead Use the SQLCODE field of the SQLCA Fetch was successful (SQLCODE 000) Fetch failed (negative SQLCODE) End of file (SQLCODE 100) 18

Minimize SQL traffic MERGE statement Combine UPDATE and INSERT into a single statement via the SQL MERGE statement MERGE INTO PRODUCT AS OLDPROD USING (VALUES (:PID, :COST, :DISCOUNT) FOR :ROWCNT ROWS) AS NEWPROD(PID, COST, DISCOUNT) ON OLDPROD.PID = NEWPROD.PID WHEN MATCHED THEN UPDATE SET COST = NEWPROD.COST, DISCOUNT = NEWPROD.DISCOUNT WHEN NOT MATCHED THEN INSERT (PID, COST, DISCOUNT) VALUES (NEWPROD.PID, NEWPROD.COST, NEWPROD.DISCOUNT) 19

Minimize SQL traffic Select from Insert / Update / Delete Benefits Select what was just changed Save multiple calls to DB2 Common Use Cases Identity columns or sequence values that get automatically assigned by DB2 User-defined defaults and expressions that are not known to the developer Columns modified by triggers that can vary from insert to insert depending on values ROWIDs, CURRENT TIMESTAMP that are assigned automatically Example: /* Generate a unique id for the next customer */ SELECT CUSTID FROM FINAL TABLE (INSERT INTO CUSTOMERS (CUSTID, CUSTNAME) VALUES (NEXT VALUE FOR CUSTSEQ, John Roberts )) 20

Avoid Unnecessary Sorts DB2 may perform a sort to support ORDER BY GROUP BY Duplicate removal (DISTINCT, UNION,...) Join processing Subquery processing But... Sorts can be expensive An SQL statement may have multiple sorts Action items: Examine DB2 explain information to check for sorts Try to take advantage of ways in which DB2 can avoid a sort If you must sort, only sort what s needed 21

Avoid Unnecessary Sorts (contd.) ORDER BY Index on (PTYPE, PNAME, PCOST) Matches all index columns SELECT... FROM PROD ORDER BY PTYPE, PNAME, PCOST Matching leading index column(s) SELECT... FROM PROD ORDER BY PTYPE Matching some index column(s), but others column(s) constrained SELECT... FROM PROD WHERE PTYPE = X05 ORDER BY PNAME 22

Avoid Unnecessary Sorts (contd.) GROUP BY Index on (PTYPE, PNAME, PCOST) Matches leading index columns SELECT PTYPE, PNAME, COUNT(*) FROM PROD GROUP BY PTYPE, PNAME; Matching leading index column(s) but in different order SELECT PNAME, PTYPE, AVG(SALARY) FROM PROD GROUP BY PNAME, PTYPE // Watch out: results will not be in GROUP BY order Matching some index column(s), but others column(s) constrained SELECT TYPE, COUNT(*) FROM PROD WHERE PTYPE = X05 GROUP BY PNAME; 23

Avoid Unnecessary Sorts (contd.) DISTINCT DB2 s DISTINCT processing has evolved Prior to V9, DISTINCT usually involved a sort unless a unique index was available GROUP BY could be used as a workaround With DB2 9, DB2 may take better advantage of indexes Use DISTINCT only when needed DISTINCT may involve expensive sorting DISTINCTs inside subselects may involve materializations Don t use DISTINCT just to be safe Make sure duplicate rows are actually possible 24

Avoid Unnecessary Sorts (contd.) DISTINCT If duplicates are to be removed: Try rewriting the query using an IN or EXISTS subquery. EXISTS is a faster alternative because DB2 can do early out Example SELECT DISTINCT d.deptno, d.dname deptname FROM dept d, emp e WHERE d.deptno = e.deptno; Rewritten query SELECT d.deptno, d.dname deptname FROM dept d WHERE EXISTS (SELECT 1 FROM emp e WHERE e.deptno = d.deptno); 25

OPTIMIZE FOR and FETCH FIRST When # of rows needed is significantly < # of rows returned, but exact number is not known: Tell the optimizer! DB2 will try to eliminate sorts such as RID List Prefetch sort SELECT EMPNO, PNAME, DEPTNO, SALARY FROM EMPLOYEE WHERE DEPTNO >? OPTIMIZE FOR 1 ROW In cases where max number of fetches is known use FETCH FIRST n ROWS ONLY Discourages sorting and may reduce internal processing when sort can t be avoided (i.e. sort can be more efficient if it knows only top n values are going to be returned) 26

Parameterize Dynamic SQL, unless,... SELECT... FROM ORDERS WHERE CUSTID = 1331 SELECT... FROM ORDERS WHERE CUSTID = 78 SELECT... FROM ORDERS WHERE CUSTID = 3633 SELECT... FROM ORDERS WHERE CUSTID = 26631 SELECT... FROM ORDERS WHERE CUSTID = 12... VS. SELECT... FROM ORDERS WHERE CUSTID =? 27

Parameterize Dynamic SQL, unless,... Embedded Literals + Optimizer can produce best access path a specific value + Useful when you want to beat skew - But you need the right frequency/histogram stats - Dynamic SQL cache may not be effectively used + V10 Statement Concentration can help Markers or Host Variables + For dynamic SQL, full dynamic SQL cache exploitation - Suboptimal access paths for skewed data - What if M = 1%, F = 99%? + REOPT(ONCE / AUTO / ALWAYS) can help 28

Think joins before subqueries Joins Allow DB2 to pick the best table access sequence Can outperform subqueries Subqueries Force a specific sequence onto DB2 Think of joining as a first resort, and subquerying as a last resort. DB2 can rewrite some subqueries -> joins 29

Think joins before subqueries (contd.) Unique index on (DIVISION, DEPTNO) Original query: SELECT... FROM EMP WHERE DEPTNO IN (SELECT DEPTNO FROM DEPT WHERE LOCATION IN ('SAN JOSE', 'SAN FRANCISCO') AND DIVISION = 'MARKETING'); Rewritten query: SELECT... FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO AND DEPT.LOCATION IN ('SAN JOSE', 'SAN FRANCISCO') AND DEPT.DIVISION = 'MARKETING'; 30

Subqueries Correlated vs Non-Correlated SELECT * FROM EMP X WHERE JOB = 'DESIGNER' AND EXISTS (SELECT 1 FROM PROJ Correlated WHERE DEPTNO = X.WORKDEPT Performed for each outer query AND MAJPROJ = 'MA2100'); SELECT * FROM EMP WHERE JOB = 'DESIGNER' AND WORKDEPT IN (SELECT DEPTNO FROM PROJ Non-Correlated Processed upfront WHERE MAJPROJ = 'MA2100'); 31

Subqueries: To correlate or not? Answer: It depends! SELECT EMPID, EDLEVEL FROM EMP E WHERE JOBTYPE =? AND EDLEVEL >= ; (SELECT AVG(EDLEVEL) FROM EMP WHERE DEPTID = E.DEPTID) Average computed for each employee s department, over and over again Works best for few employees selected. SELECT EMPID, NAME, EDLEVEL FROM EMP E, WHERE (SELECT DEPTID, AVG(EDLEVEL) AVGED FROM EMP GROUP BY DEPTID) A JOBTYPE =? AND E.DEPTID = A.DEPTID AND EDLEVEL >= AVGED; Average-per-department, computed once for all departments Works best when many employees selected. 32

Subquery evaluation order Non-correlated subqueries are executed before correlated Multiple non-correlated subqueries are executed in the sequence they are coded Next are correlated subqueries Multiple correlated subqueries are executed in the sequence they are coded Correlated subqueries cannot be executed however until all correlation predicates are available Code subqueries in order of restrictiveness 33

Order of Subquery Predicate Evaluation WHERE NOT EXISTS (SELECT 1 FROM DSN8710.PROJ P1 WHERE P1.RESPEMP = E.EMPNO) AND NOT EXISTS (SELECT 1 FROM DSN8710.PROJ P2 WHERE P2.DEPTNO = E.WORKDEPT) 42 executions 25 rows qualify 25 executions 4 rows qualify Reverse the subqueries 42 executions 5 rows qualify 5 executions 4 rows qualify WHERE NOT EXISTS (SELECT 1 FROM DSN8710.PROJ P2 WHERE P2.DEPTNO = E.WORKDEPT) AND NOT EXISTS (SELECT 1 FROM DSN8710.PROJ P1 WHERE P1.RESPEMP = E.EMPNO)

What did we discuss? Write efficient predicates Minimize SQL traffic Use multi-row operations Avoid sorting whenever possible Only touch columns and rows you need Literals vs. variables know the difference Subqueries vs Joins OPTIMIZE FOR n ROWS +++ 35

Acknowledgements and Disclaimers: Availability. References in this presentation to IBM products, programs, or services do not imply that they will be available in all countries in which IBM operates. The workshops, sessions and materials have been prepared by IBM or the session speakers and reflect their own views. They are provided for informational purposes only, and are neither intended to, nor shall have the effect of being, legal or other guidance or advice to any participant. While efforts were made to verify the completeness and accuracy of the information contained in this presentation, it is provided AS-IS without warranty of any kind, express or implied. IBM shall not be responsible for any damages arising out of the use of, or otherwise related to, this presentation or any other materials. Nothing contained in this presentation is intended to, nor shall have the effect of, creating any warranties or representations from IBM or its suppliers or licensors, or altering the terms and conditions of the applicable license agreement governing the use of IBM software. All customer examples described are presented as illustrations of how those customers have used IBM products and the results they may have achieved. Actual environmental costs and performance characteristics may vary by customer. Nothing contained in these materials is intended to, nor shall have the effect of, stating or implying that any activities undertaken by you will result in any specific sales, revenue growth or other results. Copyright IBM Corporation 2011. All rights reserved. U.S. Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp. IBM, the IBM logo, ibm.com and DB2 are trademarks or registered trademarks of International Business Machines Corporation in the United States, other countries, or both. If these and other IBM trademarked terms are marked on their first occurrence in this information with a trademark symbol ( or ), these symbols indicate U.S. registered or common law trademarks owned by IBM at the time this information was published. Such trademarks may also be registered or common law trademarks in other countries. A current list of IBM trademarks is available on the Web at Copyright and trademark information at www.ibm.com/legal/copytrade.shtml Other company, product, or service names may be trademarks or service marks of others. 36

Information Management Communities On-line communities, User Groups, Technical Forums, Blogs, Social networks, and more Find the community that interests you World of DB2 for z/os http://db2forzos.ning.com/ Information Management ibm.com/software/data/community Business Analytics ibm.com/software/analytics/community International DB2 User Group www.idug.org IBM Champions Recognizing individuals who have made the most outstanding contributions to Information Management, Business Analytics, and Enterprise Content Management communities ibm.com/champion 37

Top DB2 for z/os e-communities World of DB2 for z/os - 1700+ members http://db2forzos.ning.com/ DB2 10 LinkedIn - 1000+ members http://linkd.in/ibmdb210 DB2 for z/os What s On LinkedIn http://linkd.in/kd05lh DB2 for z/os YouTube http://www.youtube.com/user/ibmdb2forzos WW IDUG LinkedIn Group http://linkd.in/iduglinkedin IBM DeveloperWorks http://www.ibm.com/developerworks/data/community/ search 'db2 z/os best practices' 'sql performance' 38

Thank You! Your Feedback is Important to Us Visit Us at www.ibm.com/software/data/db2/db210 39 39