[egenix-users] cursor.rowcount abnormalities and performance question

Jim Vickroy Jim.Vickroy at noaa.gov
Wed Jul 30 14:05:57 CEST 2003


Regarding the use of fecthone() vs fetchall(), my advice is the standard
Python mantra -- avoid premature optimization -- code it in a simple and clear
manner -- test it in you problem domain (expected number of rows, size per
row, etc.) -- optimize when/where testing reveals performance issues.  I have
been pleasantly surprised how fast SQL Server retrievals are for 1mb BLOBs.

stuff at mailzilla.net wrote:

> Hello,
>
> When using mxODBC with the Windows SQL Server Driver I've noticed that
> when performing a query with executedirect the cursor object has a
> rowcount of -1 or 0 and nothing else.  I am using Python 2.2 and the
> mxODBC package that ships with BlackAdder.
>
> -1 seems to be the initial value of rowcount before queries are performed
> but I'm unsure as to why this would remain the value after a query
> considering that the count should be >= 0, at least fundamentally.  In my
> tests I have only seen values of 0 (when there are no records) and -1 when
> there are some records-- in these cases, I am expecting this to be a
> positive value representing the number of records that matched the query.
>
> If I do a fetch operation (i.e. fetchone) on the cursor that has a
> rowcount of -1 I do indeed retrieve records.  There seems to be a
> disconnect between rowcount and being able to fetch records.
>
> Is SQL Server/ODBC sending over misleading info or is this a problem with
> mxODBC?
>
> I generally use rowcount to determine whether I need to retreive
> records using fetchone inside a while loop (no need to execute the loop
> if rowcount is 0).  It's a little cleaner if I can reliably use rowcount
> but if the value doesn't sync with the actual result set then I can safely
> do something like this:
>
> while 1:
>    row = c.fetchone()
>    if not row: break
>    processTheRecord(row)
>
> If rowcount can be relied upon, I could do this, which is much cleaner:
>
> for i in range(c.rowcount):
>    row = c.fetchone
>    processTheRecord(row)
>
> Performance question- Since I need to perform some manipulation on each
> record I believe it is more efficient to perform a while loop and
> fetchone rather than getting everything via fetchall and then iterating
> over that result (since theoretically, fetchall would be iterating to get
> each record so technically speaking that would require iterating twice).
> If this assumption is false, please let me know.  Perhaps there are some
> internal ODBC/mxODBC optimizations that allow fetchall to actually perform
> much faster than several fetchone's.  My concern is that if fetchall
> iterates through the result set to produce the list of rows and then I am
> iterating through the fetched list then I can accomplish the same goal w/
> 1 less iteration via a series of fetchone's.  Also, I imagine it would be
> safer to process each record individually then fetching the entire result
> set at once in terms of system resource utilization (i.e. if the result
> set were millions of records there would need to be data structs allocated
> to hold them).
>
> I'm curious to see if my reluctance to use fetchall is well-founded or
> overly paranoid.
>
> Thanks for any info,
>
> Phil
>
> _______________________________________________________________________
> eGenix.com User Mailing List                     http://www.egenix.com/
> http://lists.egenix.com/mailman/listinfo/egenix-users



More information about the egenix-users mailing list