Hi *,
I have a quite complex database with a lot of records distributed in some tables, I noticed that some query seams too heavy so I tryied to understand where is the problem. Looking with the "top" bash command the CPU occupation I saw that after a few seconds (~10 or 15) of mysqld occupation starts a long python session that occupy the biggest part of the resources (CPU 100%)... so I realized this few code to test what happens.

It's possible to see that the same query executed via executesql is considerably faster than via DAL... here you can see the results of two different query in which I duplicate the time interval...

t0 = datetime.datetime.today()
sql_query = db(join & where)._select(*what, left=left_join, orderby=order)
print 'query constraction: ', datetime.datetime.today() - t0

-> query constraction: 0:00:00.002458 (second try: query constraction: 0:00:00.002571)

print sql_query

-> SELECT run.date, x_wind.validity, m_pow.power, x_wind.power, x_wind.run FROM source, fc_model, run, x_temp, site, meta_data, x_wind LEFT JOIN m_pow ON ((x_wind.validity = m_pow.validity) AND (x_wind.site = m_pow.site)) WHERE ((((((((((x_wind.validity = x_temp.validity) AND (x_wind.site = x_temp.site)) AND (x_wind.run = x_temp.run)) AND (x_wind.source = x_temp.source)) AND (x_wind.site = site.id)) AND (x_wind.run = run.id)) AND (x_wind.source = source.id)) AND (source.model = fc_model.id)) AND (x_wind.meta_data = meta_data.id)) AND (((((x_wind.validity >= '2010-11-30 23:00:00') AND (x_wind.validity < '2010-12-08 22:59:00')) AND (x_wind.source IN (2))) AND (x_wind.meta_data IN (1))) AND (x_wind.site IN (1)))) ORDER BY x_wind.meta_data, x_wind.run, x_wind.source, x_wind.site, x_wind.validity; (second try query not reported)


t0 = datetime.datetime.today()
prova = db.executesql(sql_query)
print len(prova)

-> 576 (second try: 1080)

print 'query executed via raw mysql: ', datetime.datetime.today() - t0

-> query executed via raw mysql: 0:00:07.264365 (second try: query executed via raw mysql: 0:00:13.251476)

t0 = datetime.datetime.today()
data_source = db(join & where).select(*what, left=left_join, orderby=order)
print 'query executed via DAL ', datetime.datetime.today() - t0

-> query executed via DAL 0:03:23.115262 (second try: query executed via DAL 0:12:19.628098)


Is there something wrong in the usage of the DAL query?

thank you very mutch in advance

Cheers

        Manuele

Reply via email to