2010-02-20 49 views
0

嗨我使用sqlalchemy在500k行的db2表上。sqlalchemy Resultproxy在大表上緩慢?

使用普通的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

如果您正在使用DB2 for Linux,UNIX和Windows,則在數據庫中內置了名爲event monitors的複雜跟蹤工具,用於捕獲有關您的應用程序發送的SQL工作負載的詳細信息。如果SQLAlchemy無效訪問DB2,則會看到由語句事件監視器捕獲的不同系列事件。另一種可能性是,這兩個版本的程序都以大致相同的方式處理DB2數據,但SQLAlchemy花費更多的時間「分配內部對象來包含結果」。我使用寫入表的語句事件監視器,以便我可以搜索各種問題和模式,因此我所包含的鏈接是一個DB2實用程序,它極大地簡化了定義事件監視器和包含其輸出的表的操作。在此之後,你只需要

SET EVENT MONITOR YourMonitorName STATE 1

啓動它,並

SET EVENT MONITOR YourMonitorName STATE 0

將其關閉。關閉它的一部分非常重要,因爲監視器打開時執行的每條SQL語句都會在事件監視器表中生成3到5行數據。