我们必须在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系统的组合时,可能会出现奇怪的驱动程序交互。