fhg
Volume 9, Number 17 -- May 20, 2009

Faster Fetching

Published: May 20, 2009

Hey, Ted:

When using embedded SQL to read data, I have the option of retrieving one row or multiple rows with one fetch. Does fetching more than one row at a time improve program performance?

--Neil


I'd like to think it does, Neil. It seems to me it should. Here are the comments of John, a reader who claims that a multiple-row fetch is appreciably faster.

I have used fetch with multiple-occurrence data structures in order to read multiple records at once and minimize the use of FETCH in the program. The execution of a FETCH is quite resource intensive and slow. I have found 50 to 100 rows quite effective. Trust me. It makes a massive difference in execution time.

In programming terms I wrote a read subroutine that managed the data structure occurrence and executed FETCH only when I had run out of occurrences. It hid the mechanics of end of file and data handling from the main routines.

I ran a little test, just to see what I might discover. First, here's a simple single-fetch program.

H option(*srcstmt:*nodebugio) 

Fqsysprt   o    f  132        printer 

D Transaction     ds                  qualified inz 
D   Batch                        3p 0 
D   Code                         2a 
D   Order                        7a 
D   Item                        15a 
D   Warehouse                    3a 
D   Quantity                    11p 3 

D SqlEof          c                   const('02000') 
D DetailLine      s            132a 

D Print           pr 
D   Data                       132a   value 

D/copy prototypes,assert 

 /free 
     *inlr = *on; 
     exec sql 
        declare Input cursor for 
           select batch, tcode, ordno, itnbr, house, trqty 
             from imhist 
            order by prqoh desc; 

     exec sql 
        open Input; 
        assert (sqlstt=*zeros: 'Open error'); 

     dow '1'; 
        exec sql 
           fetch next from Input into :Transaction; 
        assert (sqlstt <= SqlEof: 'Fetch error'); 
        if sqlstt >= SqlEof; 
           leave; 
        endif; 
        Print (%editc(Transaction.Batch:'3') + ' ' + 
               Transaction.Code + ' ' + 
               Transaction.Order + ' ' + 
               Transaction.Item + ' ' + 
               Transaction.Warehouse + ' ' + 
               %editc(Transaction.Quantity:'J')); 
     enddo; 
     return; 
 /end-free 

Oqsysprt   e            PrintLine   1 
O                       DetailLine 
 * ========================================================== 
P Print           b 
D                 pi 
D   Data                       132a   value 
 /free 
     DetailLine = Data; 
     except PrintLine; 
 /end-free 
P                 e 

Here's the same program, with a multiple-row fetch into an array data structure.

H option(*srcstmt:*nodebugio) 

Fqsysprt   o    f  132        printer 

D ArraySize       s             10i 0 inz(100)
D Transaction     ds                  qualified inz dim(100)
D   Batch                        3p 0 
D   Code                         2a 
D   Order                        7a 
D   Item                        15a 
D   Warehouse                    3a 
D   Quantity                    11p 3 

D Ndx             s             10i 0 
D SqlEof          c                   const('02000')
D DetailLine      s            132a 

D Print           pr 
D   Data                       132a   value 

D/copy prototypes,assert 

 /free 
     *inlr = *on; 
     assert (%elem(Transaction) = ArraySize: 
                   'Invalid data structure definition');

     exec sql 
        declare Input cursor for 
           select batch, tcode, ordno, itnbr, house, trqty
             from imhist
            order by prqoh desc;

     exec sql 
        open Input;
        assert (sqlstt=*zeros: 'Open error'); 

     dou sqlstt >= SqlEof; 
        exec sql 
           fetch next from Input 
              for :ArraySize rows 
              into :Transaction; 
        assert (sqlstt <= SqlEof: 'Fetch error');
        for Ndx = 1 to SqlEr3; 
           Print (%editc(Transaction(Ndx).Batch:'3') + ' ' +
                  Transaction(Ndx).Code + ' ' + 
                  Transaction(Ndx).Order + ' ' + 
                  Transaction(Ndx).Item + ' ' + 
                  Transaction(Ndx).Warehouse + ' ' +
                  %editc(Transaction(Ndx).Quantity:'J'));
        endfor; 
     enddo; 
     return; 
 /end-free 

Oqsysprt   e            PrintLine   1 
O                       DetailLine 
 * ==========================================================
P Print           b 
D                 pi 
D   Data                       132a   value
 /free 
     DetailLine = Data; 
     except PrintLine; 
 /end-free 
P                 e 

Last, I tested a multiple-row fetch into a multiple-occurrence data structure.

H option(*srcstmt:*nodebugio) 

Fqsysprt   o    f  132        printer 

D ArraySize       s             10i 0 inz(100) 
D Transaction     ds                  qualified inz occurs(100)
D   Batch                        3p 0 
D   Code                         2a 
D   Order                        7a 
D   Item                        15a 
D   Warehouse                    3a 
D   Quantity                    11p 3 

D Ndx             s             10i 0 
D SqlEof          c                   const('02000') 
D DetailLine      s            132a 

D Print           pr 
D   Data                       132a   value 

D/copy prototypes,assert 

 /free 
     *inlr = *on; 
     assert (%elem(Transaction) = ArraySize: 
                   'Invalid data structure definition');

     exec sql 
        declare Input cursor for 
           select batch, tcode, ordno, itnbr, house, trqty
             from imhist 
            order by prqoh desc; 

     exec sql 
        open Input; 
        assert (sqlstt=*zeros: 'Open error'); 

     dou sqlstt >= SqlEof; 
        exec sql 
           fetch next from Input 
              for :ArraySize rows 
              into :Transaction; 
        assert (sqlstt <= SqlEof: 'Fetch error'); 
        for Ndx = 1 to SqlEr3; 
           %occur(Transaction) = Ndx; 
           Print (%editc(Transaction.Batch:'3') + ' ' +
                  Transaction.Code + ' ' + 
                  Transaction.Order + ' ' + 
                  Transaction.Item + ' ' + 
                  Transaction.Warehouse + ' ' + 
                  %editc(Transaction.Quantity:'J')); 
        endfor; 
     enddo; 
     return; 
 /end-free 

Oqsysprt   e            PrintLine   1 
O                       DetailLine 
 * ==========================================================
P Print           b 
D                 pi 
D   Data                       132a   value 
 /free 
     DetailLine = Data; 
     except PrintLine; 
 /end-free 
P                 e 

The file with which I tested had 1.3 million records. The first two programs used 11 seconds of CPU time. However, the last one used only seven seconds of CPU time. Using an array data structure was no faster than the single-row fetch. The multiple-occurrence data structure was faster than the array data structure.

--Ted


RELATED STORY

SQL's Other Fetch Options



                     Post this story to del.icio.us
               Post this story to Digg
    Post this story to Slashdot


Sponsored By
HALCYON SOFTWARE

Webinar: How to Survive in IT with a reduced headcount

 

Thurs, Jun 04, 2009 | 10:30 - 11:30 AM EDT

 

                                   · Do you need to do more with fewer resources?
                                   · Do you have staff that are skilled in Windows but
                                      have to manage i5/OS or AIX machines?
                                   · Discover "smarter" ways to automate your systems
                                      and achieve even greater cost savings
                                   · Discover how to automate 80% or more of your IT operations

 

Register to attend the live video broadcast or
view a recording after the event.


Senior Technical Editor: Ted Holt
Technical Editor: Joe Hertvik
Contributing Technical Editors: Edwin Earley, Brian Kelly, Michael Sansoterra
Publisher and Advertising Director: Jenny Thomas
Advertising Sales Representative: Kim Reed
Contact the Editors: To contact anyone on the IT Jungle Team
Go to our contacts page and send us a message.

Sponsored Links

ProData Computer Services:  Simplify your iT with DBU, DBU RDB, and RDB Connect
Halcyon Software:  Webinar: How to Survive in IT with a reduced headcount, June 4
Aberdeen Group:  Take the 2009 ERP in Manufacturing survey, get a free copy of complete report


 

IT Jungle Store Top Book Picks

Easy Steps to Internet Programming for AS/400, iSeries, and System i: List Price, $49.95
The iSeries Express Web Implementer's Guide: List Price, $49.95
The System i RPG & RPG IV Tutorial and Lab Exercises: List Price, $59.95
The System i Pocket RPG & RPG IV Guide: List Price, $69.95
The iSeries Pocket Database Guide: List Price, $59.00
The iSeries Pocket SQL Guide: List Price, $59.00
The iSeries Pocket Query Guide: List Price, $49.00
The iSeries Pocket WebFacing Primer: List Price, $39.00
Migrating to WebSphere Express for iSeries: List Price, $49.00
Getting Started With WebSphere Development Studio Client for iSeries: List Price, $89.00
Getting Started with WebSphere Express for iSeries: List Price, $49.00
Can the AS/400 Survive IBM?: List Price, $49.00
Chip Wars: List Price, $29.95


 
The Four Hundred
IBM Gets Hybrid with Servers, Talks Up BAO Boxes

Virtualization on i Boxes Depends on Consolidation, New Workloads

Jeff Jonas Explores the Nature of Data in COMMON Keynote

Mad Dog 21/21: Sometimes You Eat the Bear, Sometimes Its Porridge

Peeling Apart IBM's Q1 Server and Storage Sales

Four Hundred Stuff
Gresham Targets System i Shops with VTL Solution

PowerTech Says AS/400 Shops Still Flying in Security Danger Zone

New Gen Drives Web Features into Version 7 of BI Suite

Raz-Lee Jazzes Up its iSecurity GUI

Aldon Supports RDi 7.5 with Change Management Plug-In

Four Hundred Monitor
Four Hundred Monitor's
Full iSeries Events Calendar

System i PTF Guide
May 16, 2009: Volume 11, Number 20

May 9, 2009: Volume 11, Number 19

May 2, 2009: Volume 11, Number 18

April 25, 2009: Volume 11, Number 17

April 18, 2009: Volume 11, Number 16

April 11, 2009: Volume 11, Number 15

TPM at The Register
Canonical hooks Ubuntu Landscape into Amazon EC2

Dell taps VIA Nano chips for custom mini-servers

IBM supers shun nukes for biz analytics

NEC abandons Japan's 'next-gen' supercomputer

Quadrics co-founder jumps to Cray

Europeans go ga-ga over virtual servers

Fujitsu takes trip to Venus

IBM puts future profits in the bag

Oracle buys Virtual Iron

Sun proxy details its dating game

IBM kicks out Nehalem-free racks, towers

Hitachi scores largest loss in Japanese manufacturing history

HP forges Netweaver XML appliance

HP moves OpenVMS dev to India?

THIS ISSUE SPONSORED BY:

Halcyon Software
Help/Systems
Twin Data


Printer Friendly Version


TABLE OF CONTENTS
Faster Fetching

A Bevy of BIFs: %Dec to the Rescue

Admin Alert: Four Ways to Encrypt i5/OS Backups, Part 2

Four Hundred Guru

BACK ISSUES

From the IT Jungle Forums
PHP CLI Call

Perl, PHP, and/or ZendCore

batch printing PDF files from RPG program

Using db2_connect in PHP on iSeries

How to return value from CL program?

ADO.NET/IBM.Data.DB2.iSeries/ iDB2Connection

Order by alias names




 
Subscription Information:
You can unsubscribe, change your email address, or sign up for any of IT Jungle's free e-newsletters through our Web site at http://www.itjungle.com/sub/subscribe.html.

Copyright © 1996-2009 Guild Companies, Inc. All Rights Reserved.
Guild Companies, Inc., 50 Park Terrace East, Suite 8F, New York, NY 10034

Privacy Statement