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 性能,
-将数据和日志文件放在不同的卷上(raid 10 更好)
-tempdb (http://technet.microsoft.com/en-us/library/ms175527(v=SQL.105).aspx)
-配置最小/最大内存
-配置内存中的锁定页面和即时文件初始化
-查看此链接,http://www.brentozar.com/sql/sql-server-performance-tuning/
关键是,影响您的数据库的可能性非常多,几乎不可能根据提供的信息来识别您的问题。我建议您仔细检查每一项,以确定您的系统未以最佳状态运行的原因。
关于python - ODBC DSN 使 MSSQL 减慢至超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18314442/