sqlalchemy Resultproxy在大型桌子上慢吗?

时间:2010-02-20 01:04:38

标签: db2 sqlalchemy

您好我在db2表上使用sqlalchemy,行数为500k。

使用像这样的普通sql:

 sql="select * from test.test"
 result=Session.execute(sql)
 for row in result:
      pdic[row.id]=row.val1

这需要5分钟

如果我使用ibm_db:

 sql="select * from test.test"
 stmt = ibm_db.exec_immediate(ibm_db_conn,sql)
 result =ibm_db.fetch_both(stmt)   
 while(result):
         pathdic[result['ID']]=result['VAL']
         result = ibm_db.fetch_both(stmt)   

这不到30秒

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

如果您使用的是DB2 for Linux,UNIX和Windows,则会在数据库中内置名为event monitors的复杂跟踪工具,以捕获有关应用程序发送的SQL工作负载的详细信息。如果SQLAlchemy无效地访问DB2,您将看到语句事件监视器捕获的不同系列事件。另一种可能性是程序的两个版本都以大致相同的方式处理DB2数据,但SQLAlchemy花费更多的“在DB2之外”时间分配内部对象来包含结果。我使用写入表的语句事件监视器,因此我可以搜索各种问题和模式,因此我包含的链接是一个DB2实用程序,它极大地简化了定义事件监视器和包含其输出的表的行为。在那之后,你只需要

SET EVENT MONITOR YourMonitorName STATE 1

启动它,

SET EVENT MONITOR YourMonitorName STATE 0

将其关闭。将其关闭部分非常重要,因为在监视器打开时执行的每个SQL语句都会在事件监视器表中生成3到5行数据。