Slow performance when running with cx_Oracle

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Slow performance when running with cx_Oracle

smi295
Hi,
When i try and retrieve a medium size dataset (10000 records) from Oracle using cx_Oracle it takes approx 2 seconds. When i move this into a pyamf call it runs at 2mins 30 secs.

eg.
def echo(data):
  """                                                                                          
  This is a function that we will expose.                                                      
  """                                                                                          
  sql="""select * from  billing"""                                                      
     
  db=cx_Oracle.connect('')    
  cursor=db.cursor()                                                                            
  try:                                                                                          
    cursor.execute(sql)
    return cursor.fetchall()                                                                        
                                                                                                                                                                                                               
  except cx_Oracle.DatabaseError,info:                                                          
    raise CustomException("Oracle DB Error",info)                                              
    return 'fail'                                                                              
                                                                                             
  finally:                                                                                      
    print "in finally"                                                                          
    cursor.close()                                                                              
    db.close()              

services = {
   'myservice.echo': echo
}

Is there any reason for this? is there a new approach i can take? Using sql Alchemy it took approximately the same time to retrieve the same dataset.
Reply | Threaded
Open this post in threaded view
|

Re: Slow performance when running with cx_Oracle

Nick Joyce
On 20 Aug 2010, at 06:15, smi295 wrote:

>
> Hi,
> When i try and retrieve a medium size dataset (10000 records) from Oracle
> using cx_Oracle it takes approx 2 seconds. When i move this into a pyamf
> call it runs at 2mins 30 secs.
>
> eg.
> def echo(data):
>  """                                                                                          
>  This is a function that we will expose.                                                      
>  """                                                                                          
>  sql="""select * from  billing"""                                                      
>
>  db=cx_Oracle.connect('')    
>  cursor=db.cursor()                                                                            
>  try:                                                                                          
>    cursor.execute(sql)
>    return cursor.fetchall()                                                                        
>
>  except cx_Oracle.DatabaseError,info:                                                          
>    raise CustomException("Oracle DB Error",info)                                              
>    return 'fail'                                                                              
>
>  finally:                                                                                      
>    print "in finally"                                                                          
>    cursor.close()                                                                              
>    db.close()              
>
> services = {
>   'myservice.echo': echo
> }
>
> Is there any reason for this? is there a new approach i can take? Using sql
> Alchemy it took approximately the same time to retrieve the same dataset.


What PyAMF version are you using? Are you using the bundled c extensions with that version?

import pyamf;pyamf.__version__
import cpyamf

PyAMF doesn't know that what you're actually trying to is sent a tuple of tuples containing all your billing data. It will encode whatever fetchall() decides to hand it. This may just be a list but could be an object that acts like a list but has some meta attributes. All of these attributes will be encoded also.

This means that the work done final encoded payload could be much greater than just encoding a tuples of scalar data.  This is why the adapter framework was developed, to give PyAMF some hints on how to accomplish the encoding.

What happens if you change the return to:

return list(cursor.fetchall())
_______________________________________________
PyAMF users mailing list - [hidden email]
http://lists.pyamf.org/mailman/listinfo/users