使用连接到SQL Server的Python和unixODBC挂起大型选择查询



我们必须在CentOS 6 box中针对SQL Server运行大量大型选择查询。在两台服务器上,当使用一个相当平淡的select语句时,从SQL Server返回的数据速率开始得很快,然后减慢速度,每大约30秒接收一次数据。在另外两台服务器上,查询运行一致,并且在不到2分钟的时间内完成。unixODBC和msodbcsql的所有这些框上的配置完全相同。

导致问题的示例代码:

import datetime
import pyodbc
db_connection_string = '<connection string info>'
print(datetime.datetime.now(), 'Connecting to db...')
db_connection = pyodbc.connect(db_connection_string, autocommit=True)
print(datetime.datetime.now(), '...connected')
cursor = db_connection.cursor()
try:
    sql_statement = 'SELECT data FROM table;'
    num = 0
    print(datetime.datetime.now(), 'Iterating over cursor...')
    for row in cursor.execute(sql_statement):
        num += 1
        if num % 100000 == 0:
            print(datetime.datetime.now(), num)
    print(datetime.datetime.now(), num)
    print(datetime.datetime.now(), '...iteration completed')
finally:
    cursor.close()
    db_connection.close()

这使用unixODBC 2.3.0和msodbc 11.0.2270.0。服务器为CentOS 6.5/6.6和Python 3.4

我们已经尝试过:

  • 监控系统资源,除处理数据外,内存或CPU使用率不会出现峰值
  • 进程上的strace也只在处理数据时显示更改
  • SQL Server和Python服务器似乎都挂起了,等待着对方做些什么
  • 监控网络流量也显示没有峰值、包被丢弃或任何错误
  • scp和sftp将文件发送到服务器和服务器之间没有问题
  • 使用相同的查询连接到不同的数据库类型没有问题
  • 用Java重写代码并运行它在有问题的服务器上也有同样的问题,但在好的服务器上运行良好

任何其他有助于追踪这一问题的想法都将不胜感激。

问题似乎是SQL Server上的驱动程序交互无法在CentOS上正常运行。更改驱动程序设置可以防止查询挂起,尽管与其他服务器相比,在性能最好的服务器上返回结果的速度仍然快4倍。这里的教训似乎是,在尝试使用MS和Linux系统的组合时,可能会出现奇怪的驱动程序交互。

相关内容

  • 没有找到相关文章

最新更新