converting to multi-row fetch

36
Converting To Converting To Anthony Anthony Tichonoff Tichonoff Florida Hospital MIS Florida Hospital MIS January 2007 January 2007 With Ease With Ease Multi-Row Multi-Row Fetch Fetch

Upload: tess98

Post on 14-Dec-2014

2.057 views

Category:

Documents


1 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Converting to Multi-Row Fetch

Converting To Converting To

Anthony TichonoffAnthony TichonoffFlorida Hospital MISFlorida Hospital MIS

January 2007January 2007

With EaseWith Ease Multi-Row FetchMulti-Row Fetch

Page 2: Converting to Multi-Row Fetch

Multi-Row Fetch Multi-Row Fetch

AgendaAgenda

Why use multi-row fetchingWhy use multi-row fetching

What I need to know using What I need to know using multi-row fetchingmulti-row fetching

Extras about multi-row fetchingExtras about multi-row fetching

How to bridge into multi-row fetching with easeHow to bridge into multi-row fetching with ease

Page 3: Converting to Multi-Row Fetch

Why use multi-row fetching?Why use multi-row fetching?

Converting To Multi-row Fetching With EaseConverting To Multi-row Fetching With Ease

Page 4: Converting to Multi-Row Fetch

Why use multi-row fetchWhy use multi-row fetch

Performance AdvantagesPerformance Advantages

Improves ThroughputImproves Throughput

Fewer database access callsFewer database access calls

Lower network operationsLower network operations

Lowers CPU consumptionLowers CPU consumption

V8 ROU (V8 ROU (Return On UpgradeReturn On Upgrade))

Page 5: Converting to Multi-Row Fetch

Advantages: PerformanceAdvantages: Performance

Single – Row Fetch Multi – Row Fetch

Application DBM1 MSTR IRLM Application DBM1 MSTR IRLM

declare cursor

open cursor

close cursor

commit

fetch

declare cursor

open cursor

close cursor

commit

fetch

Page 6: Converting to Multi-Row Fetch

CPU Consumption CPU Consumption

Page 7: Converting to Multi-Row Fetch

Return on UpgradeReturn on Upgrade

What does V8 cost you?What does V8 cost you?

online transaction online transaction 0%0% +15%+15%

transaction in data sharing transaction in data sharing -5%-5% +10%+10%

batch batch -5%-5% +20%+20%

insert insert -5%-5% +5%+5%

fetch, select, update fetch, select, update +5%+5% +20%+20%

batch data sharing batch data sharing -10%-10% +15%+15%

batch DRDA batch DRDA -20%-20% +15%+15%

utility utility -5%-5% +10%+10%

query query -20%-20% +15%+15%

Performance objective is less than Performance objective is less than 10% average regression.10% average regression.

Typical customer workload Typical customer workload regression is expected to be 5 to regression is expected to be 5 to 10% higher on average, differing by 10% higher on average, differing by work load: work load:

Options with significant potential to Options with significant potential to offset an expected increase include offset an expected increase include multi-row fetch, multi-row insert, multi-row fetch, multi-row insert, long term page fix and rebind.long term page fix and rebind.

Return on UpgradeReturn on Upgrade

Page 8: Converting to Multi-Row Fetch

What you need to know.What you need to know.

Converting To Multi-row Fetching With EaseConverting To Multi-row Fetching With Ease

Page 9: Converting to Multi-Row Fetch

Requirements for Multi-rowRequirements for Multi-row

Understanding the foundationUnderstanding the foundation What is a rowsetWhat is a rowset New SQL syntaxNew SQL syntax

DeclareDeclare

FetchFetch Host variable arraysHost variable arrays Error handlingError handling

Page 10: Converting to Multi-Row Fetch

What is a rowset?What is a rowset?

A group of rows for the result table of a query that are A group of rows for the result table of a query that are returned by a single fetch statement.returned by a single fetch statement.

The maximum size of the rowset is 32767The maximum size of the rowset is 32767

The program fetch call controls how many rows are The program fetch call controls how many rows are returned in a rowset.returned in a rowset.

It is possible to intertwine single-row and multi-row It is possible to intertwine single-row and multi-row fetches within the same program.fetches within the same program.

SingleSingle

FetchFetch Single RowSingle Row

MultipleMultiple

FetchFetchMultiple RowsMultiple Rows

Page 11: Converting to Multi-Row Fetch

Declare Syntax ChangesDeclare Syntax Changes

DECLARE CURSOR Syntax

NO SCROLLDECLARE cursor-name

ASENSITIVEINSENSITIVESENSITIVE STATIC

DYNAMIC

SCROLL

CURSOR FOR Select-Statementselect-name

rowset-positioning

WITH HOLD

WITH RETURN

WITHOUT ROWSET POSITIONING

WITH ROWSET POSITIONING

rowset-positioning:

Default is WITHOUT ROWSET POSITIONING

Page 12: Converting to Multi-Row Fetch

Declare Syntax ExampleDeclare Syntax Example

SQL Declare with rowset positioningSQL Declare with rowset positioning

Declare C1 as the cursor of a query to retrieve a rowsetfrom table PayRoll

Exec SQLExec SQLDeclare C1 CursorDeclare C1 CursorWith Rowset PositioningWith Rowset Positioning ForForSelect *Select *From PayRollFrom PayRollWhere ….Where ….

End ExecEnd Exec

With Rowset Positioning specifies whether multiple rows ofdata can be accessed as a rowset on a single Fetch statement

Page 13: Converting to Multi-Row Fetch

Fetch Syntax ChangesFetch Syntax Changes

FETCH Syntax

fetch-orientation:

FETCHINSENSITIVESENSITIVE

fetch-orientationFROM

cursor-namesingle-row-fetch

multiple-row fetch

rowset-positioned

BEFOREAFTERrow-positioned

multiple-row-fetch:

rowset-positioned:

,

NEXT ROWSETPRIOR ROWSETFIRST ROWSETLAST ROWSETCURRENT ROWSETROWSET STARTING AT ABSOLUTE

RELATIVEhost-variableinteger-constant

FOR host-variableinteger-constant

ROWS

INTOINTO DESCRIPTOR

host-variable-arraydescriptor-name

Page 14: Converting to Multi-Row Fetch

Fetch Syntax ExampleFetch Syntax Example

SQL Fetch with rowset positioningSQL Fetch with rowset positioning

Fetch the next rowset

Exec SQLExec SQLFetch Next Fetch Next RowsetRowset From C1 From C1For :Rowset-Limit RowsFor :Rowset-Limit RowsInto Into

:HA_C1:HA_C1,:HA_C2,:HA_C2,:HA_C3,:HA_C3

End ExecEnd Exec

For :HV Rows is not required. The fetch statement will defaultto the row limit from the previous fetch statement.

Page 15: Converting to Multi-Row Fetch

Host variable arraysHost variable arraysFetching into arrays will return multiple rows in a single API call.Fetching into arrays will return multiple rows in a single API call.

PayRollRow 1

MultipleMultiple

FetchFetch

Fetching Multiple RowsFetching Multiple Rows

Row 2

Row 3

Row 4

HA 1 HA 2 HA 3 HA 4 HA 5 HA 6

Each host variable array can only

point to a single DB2 column

Page 16: Converting to Multi-Row Fetch

EXEC SQL DECLARE TEST.PAYROLL TABLEEXEC SQL DECLARE TEST.PAYROLL TABLE( Column_01 CHAR(1) ( Column_01 CHAR(1) NOT NULL,NOT NULL, Column_02 TIMESTAMP Column_02 TIMESTAMP NOT NULL,NOT NULL, Column_03 CHAR(8) Column_03 CHAR(8) NOT NULL,NOT NULL, Column_04 CHAR(1) Column_04 CHAR(1) NOT NULL,NOT NULL, Column_05 CHAR(8) Column_05 CHAR(8) NOT NULL,NOT NULL,) END-EXEC.) END-EXEC.

01 DCLHVA.01 DCLHVA.05 HVA-Column-01 PIC X(1) OCCURS 100 TIMES.05 HVA-Column-01 PIC X(1) OCCURS 100 TIMES.05 HVA-Column-02 PIC X(26) OCCURS 100 TIMES.05 HVA-Column-02 PIC X(26) OCCURS 100 TIMES.05 HVA-Column-03 PIC X(8) OCCURS 100 TIMES.05 HVA-Column-03 PIC X(8) OCCURS 100 TIMES.05 HVA-Column-04 PIC X(1) OCCURS 100 TIMES.05 HVA-Column-04 PIC X(1) OCCURS 100 TIMES.05 HVA-Column-05 PIC X(8) OCCURS 100 TIMES.05 HVA-Column-05 PIC X(8) OCCURS 100 TIMES.

Host variable arraysHost variable arrays

Host variable array declarationHost variable array declaration

Page 17: Converting to Multi-Row Fetch

Error handling multi-row fetchError handling multi-row fetch

Handling multi-row SQL RCHandling multi-row SQL RC

SQL RC is the result for the SQL RC is the result for the rowsetrowset not for the not for the rowrow..

Use the Get Diagnostics statement to return each Use the Get Diagnostics statement to return each row’s SQL RCrow’s SQL RC

EXEC SQLEXEC SQL GET DIAGNOSTICS GET DIAGNOSTICS :rows-returned = Row_Count :rows-returned = Row_Count ,:err-count = Number,:err-count = NumberEND-EXECEND-EXEC

returns statement informationreturns statement information

EXEC SQLEXEC SQL GET DIAGNOSTICS CONDITION :condGET DIAGNOSTICS CONDITION :cond :sqlcode = DB2_Returned_SQLCode:sqlcode = DB2_Returned_SQLCode ,:sqlstate = Returned_SQLState,:sqlstate = Returned_SQLStateEND-EXECEND-EXEC

returns condition informationreturns condition information

Page 18: Converting to Multi-Row Fetch

Error handling multi-row fetchError handling multi-row fetch

Handling multi-row SQL RC Handling multi-row SQL RC (continue)(continue)

If SQL RC = 0 then If SQL RC = 0 then all rowsall rows within the rowset have a SQL within the rowset have a SQL RC = 0. (Get Diagnostics is not necessary) RC = 0. (Get Diagnostics is not necessary)

If SQL RC = +100 then the EOT has been found, but rows If SQL RC = +100 then the EOT has been found, but rows could possibly exists within the host variable array to could possibly exists within the host variable array to process. (Get Diagnostics is not necessary)process. (Get Diagnostics is not necessary)

Any other RC not equal to 0 or +100 on a rowset we must Any other RC not equal to 0 or +100 on a rowset we must treat as you have in the past or use Get Diagnostics.treat as you have in the past or use Get Diagnostics.

Page 19: Converting to Multi-Row Fetch

Information from the SQLCAInformation from the SQLCA

Useful data within the SQLCA after the Useful data within the SQLCA after the rowset Fetch.rowset Fetch.

SQLCODESQLCODE

SQLSTATESQLSTATE

SQLERRD(3) contains the actual number of row SQLERRD(3) contains the actual number of row returned.returned.

SQLWARN flags are set to represent all warnings SQLWARN flags are set to represent all warnings accumulated while processing the Fetch.accumulated while processing the Fetch.

Page 20: Converting to Multi-Row Fetch

Extras about multi-row fetching.Extras about multi-row fetching.

Converting To Multi-row Fetching With EaseConverting To Multi-row Fetching With Ease

Page 21: Converting to Multi-Row Fetch

Helpful Extras TipsHelpful Extras Tips

Keeping track of your multi-row Keeping track of your multi-row cursors informationcursors information SQLCODESQLCODE - per cursor- per cursor Rows ReturnedRows Returned - per cursor- per cursor Current array positionCurrent array position - per cursor- per cursor Max array limitsMax array limits - per table- per table

Create ways to prevent exceeding your Create ways to prevent exceeding your host variable array boundarieshost variable array boundaries

Page 22: Converting to Multi-Row Fetch

Helpful Extras TipsHelpful Extras Tips

How big do we make the arraysHow big do we make the arrays Appropriate array size your Appropriate array size your

online appsonline apps

batch appsbatch apps

Creating standard host variableCreating standard host variable array copybooks. array copybooks. Add max limits for the arrayAdd max limits for the array

Page 23: Converting to Multi-Row Fetch

Helpful Extras TipsHelpful Extras Tips

Simple error checking for multi-row fetchingSimple error checking for multi-row fetching

Fetch Next RowsetFetch Next RowsetFrom CS1 From CS1 For :row-limt RowsFor :row-limt RowsIntoInto :HVA-1 :HVA-1 ,:HVA-2 ,:HVA-2 ,:HVA-3 ,:HVA-3

If (SQLCode = 0 Or SQLCode = 100) AndIf (SQLCode = 0 Or SQLCode = 100) And SQLERRD(3) > 0 SQLERRD(3) > 0

- Process SQLERRD(3) rows- Process SQLERRD(3) rows

Else If SQLCode = 100 and SQLERRD(3) = 0Else If SQLCode = 100 and SQLERRD(3) = 0

- Close Cursor- Close Cursor

Else Handle SQL ErrorElse Handle SQL Error

Page 24: Converting to Multi-Row Fetch

How to bridge into multi-row How to bridge into multi-row fetching with ease.fetching with ease.

Converting To Multi-row Fetching With EaseConverting To Multi-row Fetching With Ease

Page 25: Converting to Multi-Row Fetch

Bridging to Multi-row fetchingBridging to Multi-row fetching

Steps to discussSteps to discuss Our PlanOur Plan Our DesignOur Design CodingCoding AutomationAutomation ExecutionExecution

Page 26: Converting to Multi-Row Fetch

Bridging to Multi-row fetchingBridging to Multi-row fetching

Our PlanOur Plan Limit the amount of coding necessary to Limit the amount of coding necessary to

convert to multi-row fetch.convert to multi-row fetch.

Limit the changes to our error handling.Limit the changes to our error handling.

Make the changes fit our current program’s Make the changes fit our current program’s architecture framework.architecture framework.

Keep the changes few and simple.Keep the changes few and simple.

Page 27: Converting to Multi-Row Fetch

Bridging to Multi-row fetchingBridging to Multi-row fetching

Our Design Our Design (Limit the changes)(Limit the changes)

What we haveWhat we have What we wantWhat we want

Declare Declare

OpenOpen

FetchFetch

Loop Until DoneLoop Until Done

Process WorkProcess Work

Fetch NextFetch Next

CloseClose

Declare Declare (syntax changes)

OpenOpen

Fetch Fetch (syntax changes and wrapper)

Loop Until DoneLoop Until Done

Process WorkProcess Work

Fetch NextFetch Next

CloseClose

Our Goals:- limit change - keep it simple

Page 28: Converting to Multi-Row Fetch

Bridging to Multi-row fetchingBridging to Multi-row fetching

Our DesignOur Design Modifying the Declare with a simple syntax changeModifying the Declare with a simple syntax change Modifying the Fetch…Modifying the Fetch…

Fetch SQL StatementFetch SQL Statement(Changes made to acquire multi-row fetch)(Changes made to acquire multi-row fetch)

Add Pre-Fetch CodeAdd Pre-Fetch Code(Handles decision where to get next row)(Handles decision where to get next row)

Add Post-Fetch CodeAdd Post-Fetch Code(Handles RCs and array positioning)(Handles RCs and array positioning)

Add Variable AssignmentsAdd Variable Assignments(Move :HVA elements into :HV)(Move :HVA elements into :HV)

Page 29: Converting to Multi-Row Fetch

Coding the Working StorageCoding the Working StorageTable Working StorageTable Working Storage

Cursor Working StorageCursor Working Storage

Page 30: Converting to Multi-Row Fetch

Coding the PrefetchCoding the Prefetch

Check array Check array boundariesboundaries

Get Next Get Next Array RowArray Row

At the end At the end reset SQL reset SQL return codereturn code

Fetch next Fetch next rowsetrowset

Page 31: Converting to Multi-Row Fetch

Coding the FetchCoding the Fetch

BeforeBefore

AfterAfter

Page 32: Converting to Multi-Row Fetch

Coding the Post-FetchCoding the Post-FetchJust Just

executed executed the fetchthe fetch

Store rows Store rows returned & returned &

SQL RC per SQL RC per cursorcursor

If RC = 0 or (+100 If RC = 0 or (+100 & no array rows) & no array rows)

reset array pointer reset array pointer & SQL code& SQL code

Page 33: Converting to Multi-Row Fetch

Coding the Data MovesCoding the Data Moves

Let eliminate code Let eliminate code changes by using our changes by using our

existing host variables.existing host variables.

Page 34: Converting to Multi-Row Fetch

Bridging to Multi-row fetchingBridging to Multi-row fetching

AutomationAutomation The technique, method, or system of The technique, method, or system of

operating or controlling a process by operating or controlling a process by highly automatic means, as by highly automatic means, as by electronic devices, reducing human electronic devices, reducing human intervention to a minimum. intervention to a minimum.

My definitionMy definition Lets Lets minimize human errorminimize human error Built a Rexx program with ISPF macros to alter existing Cobol code.Built a Rexx program with ISPF macros to alter existing Cobol code.

Page 35: Converting to Multi-Row Fetch

Multi-Row Fetch Multi-Row Fetch

Points to rememberPoints to remember

Use multi-row fetching for a Return on UpgradeUse multi-row fetching for a Return on Upgrade

Know the basics for utilizing multi-row fetchKnow the basics for utilizing multi-row fetch

Extras about multi-row fetchingExtras about multi-row fetching

Find ways to quickly convert with little code Find ways to quickly convert with little code changes to gain back resources.changes to gain back resources.

Page 36: Converting to Multi-Row Fetch

Questions?Questions?

Converting To Multi-row Fetching With EaseConverting To Multi-row Fetching With Ease

Thanks for attending.Thanks for attending.

Anthony TichonoffAnthony [email protected]@flhosp.org

Florida Hospital MISFlorida Hospital MIS

Converting To Multi-Row Fetch Converting To Multi-Row Fetch With EaseWith Ease