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

使用连接到SQL Server的Python和unixODBC挂起大型select查询,python,sql-server,odbc,pyodbc,unixodbc,Python,Sql Server,Odbc,Pyodbc,Unixodbc,我们必须从CentOS 6中对SQL Server运行大量大型select查询。在两台服务器上,当使用一个相当平淡的select语句时,从SQL Server返回的数据的速率会很快开始,然后会变慢,每30秒接收一次突发数据。在另外两台服务器上,查询持续运行,在不到2分钟的时间内完成。unixODBC和msodbcsql在所有这些框上的配置都完全相同 导致问题的示例代码: import datetime import pyodbc db_connection_string = '<conn

我们必须从CentOS 6中对SQL Server运行大量大型select查询。在两台服务器上,当使用一个相当平淡的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()
导入日期时间
导入pyodbc
db_连接_字符串=“”
打印(datetime.datetime.now(),“连接到数据库…”)
db\u connection=pyodbc.connect(db\u connection\u字符串,autocommit=True)
打印(datetime.datetime.now(),“…已连接”)
cursor=db_connection.cursor()
尝试:
sql_语句='从表中选择数据;'
num=0
打印(datetime.datetime.now(),“在光标上迭代…”)
对于cursor.execute(sql_语句)中的行:
num+=1
如果num%100000==0:
打印(datetime.datetime.now(),num)
打印(datetime.datetime.now(),num)
打印(datetime.datetime.now(),“…迭代已完成”)
最后:
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系统的组合可能会产生奇怪的驱动程序交互。

我在CentOS 6上遇到msodbc 11.0.2270.0的问题,特别是Django 1.7.5(是的,我知道Django今天有一个安全版本,但我的测试一直在1.7.5上)。我已经消除了Django 1.7引入的一些线程问题,但是遇到了SQLRowCount和SQLParam兼容性问题。我想知道它们是否与Django 1.7新的多线程特性中的msodbc驱动程序卡住有关,但没有确切的证据。不管是哪种方式,请继续提供您发现的内容,或许我们可以对问题进行分类。顺便说一句,如果有人能够找到指向odbcinst.ini的msodbc Red Hat驱动程序可用选项的链接,我们将不胜感激。我在Google的任何文档中都找不到诸如“Threading”和“UsageCount”之类的选项,而且我找到的这些结果没有包括任何细节,只是配置示例。这是我能找到的最接近的选项,但在示例配置参数()中似乎更为相似。他们可能编写驱动程序来自动检测这些选项。可能没有多大帮助,我自己也不怎么使用微软的东西。