----- Forwarded message from gmei <[EMAIL PROTECTED]> ----- Delivered-To: [EMAIL PROTECTED] From: "gmei" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Subject: RE: perl DBI question: fetchrow_array Date: Fri, 7 Mar 2003 13:39:14 -0500 In-Reply-To: <[EMAIL PROTECTED]>
Hi, Tim: Thanks for your reply. I have a couple of more-or-less baic questions of dbi syntax. I just checked the version of DBI on my machine: atlas$ ls -d /usr/local/src/perl_modules/DBI*[0-9] /usr/local/src/perl_modules/DBI-1.13 Right now we could not upgrade DBI on this production system, but I will ask the sysadmin to consider. With the DBI version we have, I did find that $dat->bind_columns(undef,\($row)); while($dat->fetch) { print DATA "$row\n"; } is a bit faster than while(($row) = $dat->fetchrow_array) { print DATA "$row\n"; } close(DATA); when we have $dat = $dbh->prepare("select " . join('||chr(9)||', @select) . " from $table"); We don't need to process the data in the result set, I just want to dump them into a file, So I guess I don't need to use "shift" in your example? Is "fetchall_arrayref" still the fastest? What is the syntax of it? could you use my code above as example of how to use "fetchall_arrayref"? Also,is $dat->fetch the same as $dat->fetchrow_arrayref? Thanks. Guang > -----Original Message----- > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] Behalf Of Tim Bunce > Sent: Friday, March 07, 2003 10:09 AM > To: Multiple recipients of list ORACLE-L > Subject: Re: perl DBI question: fetchrow_array > > > On Thu, Mar 06, 2003 at 02:54:19PM -0800, > [EMAIL PROTECTED] wrote: > > 1) fetchrow_arrayref is faster than fetchrow_array, as Alex > has noted. > > > > 2) I see you've already set RowCacheSize. Anecdotal > evidence ( not just mine) > > suggests that the diminished returns obtained by setting > this >100 aren't > > worth it. > > > > 3) try selectall_arrayref if you're data is not really > large. 'really > > large' depends on your environment. > > > > 4) join DBI users list, found at lists.perl.org. > > That's all true. > > I'd just add that recent DBI versions let you specify a > max_rows parameter > to the fetchall_arrayref method. You can then call it in a loop to get > rows on batches. > > This is now the fastest way to fetch rows in a loop using the DBI: > > my $rows = []; # cache for batches of rows > while( my $row = ( shift(@$rows) || # get row from cache, > or reload cache: > > shift(@{$rows=$sth->fetchall_arrayref(undef,10_000)||[]) ) > ) { > ... > } > > The code that implements fetchall_arrayref is written in C and, > although there's a default implementation in the DBI, a faster one > gets embedded into drivers like DBD::Oracle when it's (re)built > (after you've upgraded the DBI). > > Several parts of the DBI have been optimized with this code-embedding > technique so if you've not upgraded your DBI to >= 1.29, or not > rebuilt your DBD::Oracle since then it may be worth doing so. > > (FYI, if this prompts you to upgrade your DBI installation, please > note DBI 1.32 was a good release, but that 1.33 and 1.34 have > problems, > including a memory leak. I hope to release a 1.35 before Monday.) > > Tim. > ----- End forwarded message -----