[egenix-users] cursor.executedirect configurable?

M.-A. Lemburg mal at egenix.com
Wed Sep 10 18:23:17 CEST 2008


On 2008-09-10 15:48, Brad Allen wrote:
> Thanks. I haven't yet done any serious performance comparisons between
> execute and executedirect with the ODBC driver we're using ( the
> built-in Windows ODBC driver for SQL Server).
> 
> Instead, I was motivated by the finding that some of the large join
> queries I generated using Storm worked with executedirect, but failed
> cryptically using plain cursor.execute. I would prefer to find out why
> the same query failed with cursor.execute rather than switch to
> executedirect.
> 
> Any ideas on what would cause this a select query to fail with the plain
> execute, but works fine with executedirect? 

The plain .execute() uses a prepare step, SQL type binding and
does some processing directly on the client, whereas .executedirect()
sends all data to the server for processing and uses Python type
binding for parameters.

> Here is the error:
> 
> mx.ODBC.Error.InterfaceError: ('07009', 0, '[Microsoft][ODBC SQL Server
> Driver]Invalid Descriptor Index', 6793)

Could also post the query and parameters that caused this problem ?

The error is related to a parameter you have in the query which
the client apparently does not detect correctly.

Thanks.

> Thanks.
> 
> M.-A. Lemburg wrote:
>> Hello Brad,
>>
>> On 2008-09-10 04:18, Brad Allen wrote:
>>  
>>> I am using mxODBC 3 with the Storm ORM, which makes use of
>>> cursor.execute. I would like to find a way to configure mxODBC to use
>>> executedirect without having to change or override Storm's call to
>>> cursor.execute.
>>>
>>> Is there some way to configure mxODBC to use the executedirect behavior
>>> when cursor.execute is called?
>>>     
>>
>> No, that's not possible without wrapping the cursor object and
>> then redirecting the method in the wrapper.
>>
>> Note that cursor.execute() will work like cursor.executedirect()
>> when called without parameters.
>>
>> You should check the performance of using one over the other.
>> cursor.executedirect() will bypass the prepare step, so the
>> statement will have to be parsed and processed over and over
>> again.
>>
>> Some database backends do clever caching on the server, so this
>> is not an issue, in fact, it's faster for simple queries since
>> you avoid a few network round-trips.
>>
>> For other backends, it's slower, since they don't implement
>> such caching.
>>
>> Another issue is related to parameter binding: using
>> cursor.executedirect() the ODBC driver does not have any
>> parameter type information available (this only becomes
>> available via the prepare step), so mxODBC cannot do
>> any efficient conversion to database data types on the
>> client side. This may result in conversion problems on
>> the server side and introduce extra overhead.
>>
>>   
> 
> 
> ------------------------------------------------------------------------
> 
> 
> _______________________________________________________________________
> eGenix.com User Mailing List                     http://www.egenix.com/
> https://www.egenix.com/mailman/listinfo/egenix-users

-- 
Marc-Andre Lemburg
eGenix.com

Professional Python Services directly from the Source  (#1, Sep 10 2008)
>>> Python/Zope Consulting and Support ...        http://www.egenix.com/
>>> mxODBC.Zope.Database.Adapter ...             http://zope.egenix.com/
>>> mxODBC, mxDateTime, mxTextTools ...        http://python.egenix.com/
________________________________________________________________________

:::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,MacOSX for free ! ::::


   eGenix.com Software, Skills and Services GmbH  Pastor-Loeh-Str.48
    D-40764 Langenfeld, Germany. CEO Dipl.-Math. Marc-Andre Lemburg
           Registered at Amtsgericht Duesseldorf: HRB 46611



More information about the egenix-users mailing list