python - ODBC DSN 使 MSSQL 减慢至超时

标签 python .net sql-server odbc pyodbc

Windows XP SP3下的MS SQL Server 2008 R2中有一个数百万条记录的数据库。

我的同事编写了一个 .Net 应用程序,它直接连接到该数据库并运行合理数量的查询。我不了解 .Net,但我确信此应用程序不会使用 ODBC 连接到数据库。

另一方面,我编写了一个命令行 python(CPython 版本 2.7.5)应用程序,它连接到该数据库并对其运行简单的查询,以通过互联网将数据发送到其他地方。使用 pyodbc 3.0.7(来自 http://www.lfd.uci.edu/~gohlke/pythonlibs/ 的安装程序)和使用 SQL Server Native Client 10.0 驱动程序的 DSN 建立数据库连接。我尝试在 Windows 数据源 (ODBC) 小程序的连接池选项卡中禁用和启用此驱动程序的连接池。该脚本从数据库发送 100 条记录,然后关闭连接并休眠 2 分钟,然后再次运行。

这两个程序都与 db 在同一台机器上持续运行。

问题是,当我删除定义的 DSN 时,.Net 应用程序运行良好(当然 python 脚本没有运行)。当我再次定义DSN并启动python脚本并行运行.Net应用程序时,大约5个小时没有问题。但逐渐地,虽然 python 脚本大部分都很好,.Net 应用程序开始从数据库超时。

发生这种情况会出现什么问题?

编辑:

python 脚本(使用 ODBC 连接)始终运行良好。但 .Net 应用程序在几个小时后就落后于正常性能。当我关闭 python 脚本时,.Net 应用程序仍然保留在后面。但是当我删除为 python 脚本定义的 ODBC DSN 时,.Net 应用程序恢复正常性能。这很奇怪。正如我所说,我对 .Net 一无所知,所以这可能是 .Net 应用程序部分非标准代码的结果,可能是开放事务、锁、太多连接等。为了使情况更奇怪,通过删除记录和重建索引将数据库大小减半,到目前为止似乎已经解决了 .Net 应用程序问题。

编辑2:

Python 脚本运行的唯一两个查询是:

SELECT TOP 100 FROM tbl_data WHERE id > ? ORDER BY id

SELECT * FROM tbl_data WHERE id = ?

第一个查询通常在每次运行 python 脚本时仅运行一次。第二个最多运行 100 次。 id 是主键,因此被索引。正如您所看到的,查询再简单不过了。对于第一个查询,我读取了程序中的整个结果集,以免游标在数据库服务器上保持打开状态。此外,我还关闭了我正在使用的驱动程序的 ODBC 小程序中的连接池,因此每次运行脚本后,数据库连接都应该被释放,并且数据库服务器上的所有资源都应该被释放。该脚本休眠 2 分钟,然后重复此操作。

.Net 应用程序运行的查询要复杂得多,并结合了数据库上的一些触发器。奇怪的是它本身运行得很好。但是当定义了 DSN 后,它开始在单个插入语句上等待很长时间,有时会导致超时。

另外,我应该说 Windows 和 MSSQL 没有使用 Microsoft 的最新补丁进行更新,因此,如果这是 ODBC 驱动程序或 MSSQL 本身的错误,那么其他人可能已经解决了该问题。

编辑3

表在 PK 索引上聚集。数据表目前包含约150万条记录。 DB大小约为160GB。服务器规范不高。 Intel Core i7 2600、4GB RAM、普通 1TB SATA 磁盘驱动器。

最佳答案

有很多因素会影响性能。可能存在资源争用、SQL Server 配置次优、磁盘速度慢、索引丢失等...

我将首先在两个进程运行时监视系统资源。您可以使用 perfmon 来监视操作系统和 SQL 计数器。我首先看

  • 处理器信息/%ProcessorTime

    逻辑磁盘/平均磁盘秒/读取

    逻辑磁盘/平均磁盘秒/写入

    内存/可用兆字节

    SQLServerBufferManager/BufferCacheHitRatio

    SQLServerBufferManager/PageLifeExpectency

这是一篇关于使用 perfmon 的精彩文章,http://www.brentozar.com/archive/2006/12/dba-101-using-perfmon-for-sql-performance-tuning/

下一步是优化查询和 SQL Server 性能。

查询性能,http://technet.microsoft.com/en-us/magazine/2007.11.sqlquery.aspx SQL Server 性能,

关键是,影响您的数据库的可能性非常多,几乎不可能根据提供的信息来识别您的问题。我建议您仔细检查每一项,以确定您的系统未以最佳状态运行的原因。

关于python - ODBC DSN 使 MSSQL 减慢至超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18314442/

相关文章:

c# - 如何在 C# 中的 dll 中进行全局异常处理?

sql-server - 如何确定 SQL Server 中正在编译的内容

sql-server - 是否可以在使用sql的更新语句中使用MAX?

python - 是否允许在抽象类中使用用户定义的装饰器?或者说,应该继承后使用吗?

python - 传递值的形状是 (3514, 78),索引意味着 (1, 78)

python - 如何在 django-import-export 中导入 django-taggit 标签

sql - 强制转换函数以仅显示日期时间中的月份和日期

Python:在放置请求中合并文件路径

c# - 在c#中通过引用传递参数时跟踪地址

c# - 获得早期绑定(bind)关系