在我的计算机上,pyodbc非常缓慢,但在其他计算机上却不是这样。

6
我正在使用Python 2.7和Pyodbc 3.0.6访问一个运行在与我的计算机相同网络上的DB2(9.7)服务器。以下是一个非常简化的示例,类似于我尝试做的事情。
import pyodbc as db

def dbcur(connectname):
    con = db.connect(connectname)
    cur = con.cursor()
    return cur,con


def main():

    print 'a'
    cur,con = dbcur('DSN=MYODBCCON')
    print 'b'


    # X.name is a short varchar
    qry = """
        select
        X.name as N
        from schema.table as X
        """

    print 'c'

    cur.execute(qry)

    print 'd'

    c = 0
    for row in cur:
        c+=1
        if not c%100:
            print c, row

    return

if __name__ == '__main__': main()

这段代码在我的Windows 8电脑上运行非常缓慢(10秒内处理100行)。然而,在我同事的Windows 7电脑上运行速度非常快。他的计算机与我的配置相似,并且使用的是相同版本的pyodbc和Python,因此我不认为这是一个问题。
当我同时使用IBM DB2 ODBC DRIVER和IBM DATA SERVER DRIVER FOR ODBC时,问题仍然存在。
有什么建议可以解释这个缓慢的原因吗?
我知道像cur.fetchmany()这样的东西,但是我仍然期望这个代码能够更快,而不用使用它。
更新:
事实证明,ODBC之所以慢,是因为跟踪被打开了。我关闭了跟踪功能,性能恢复到了我所期望的水平。(跟踪功能可以在Windows 7和8的ODBC数据源中找到。)

1
我首先会检查这是否是pyodbc/python问题还是一般的ODBC/配置/...问题。尝试使用另一个ODBC客户端进行查询,例如Excel。在Excel中使用时性能是否缓慢? - codeape
很可能是Windows 8/DB2/ODBC驱动程序的问题。 - codeape
1
原来ODBC跟踪是开着的。我刚刚把它关闭了,现在它运行得就像我预期的那样快了。唉。 - inconvergent
非常感谢您提供的追踪见解!我都快抓狂了。回答自己的问题是否比回复您的评论更合适呢? - Matthew Cornell
谢谢。我也遇到了同样的问题。你救了我。 - notilas
显示剩余4条评论
1个回答

4

原来ODBC速度慢是因为开启了跟踪。我关闭了跟踪,性能恢复到预期水平。(在Windows 7和8中,跟踪可以在ODBC数据源下找到。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接