您好我在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秒
有什么想法吗?
答案 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行数据。