ODBC DSN减慢MSSQL的超时速度

时间:2013-08-19 13:00:13

标签: python .net sql-server odbc pyodbc

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

我的同事编写了一个.Net应用程序,该应用程序直接连接到此数据库并运行合理数量的查询。我不知道.Net,但我确定这个应用程序没有使用ODBC连接到数据库。

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

这两个程序都在与db相同的机器上运行。

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

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

编辑:

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

编辑2:

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

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

SELECT * FROM tbl_data WHERE id = ?

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

.Net app运行的查询要复杂得多,再加上数据库上的一些触发器。而奇怪的是,它本身运行得非常好。但是当定义了DSN时,它会在单个insert语句上开始等待很长时间,这有时会导致超时。

另外我应该说Windows和MSSQL没有更新来自microsoft的最新补丁,所以如果它是ODBC驱动程序或MSSQL本身的错误,它可能已经为其他人解决了。

编辑3

表格聚集在PK索引上。数据表现在包含大约1.5M记录。数据库大小约为160GB。服务器没有高规格。 Intel Core i7 2600,4GB RAM,普通1TB SATA磁盘驱动器。

1 个答案:

答案 0 :(得分:1)

有许多因素可能影响性能。可能存在资源争用,次优SQL Server配置,慢速磁盘,缺少索引等...

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

  • ProcessorInformation /%ProcessorTime

    LogicalDisk / Avg Disk sec / read

    LogicalDisk / Avg Disk sec / write

    内存/可用MBytes

    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性能,

关键是有很多可能会影响您的数据库,几乎不可能根据提供的信息识别您的问题。我建议您仔细阅读这些项目,以确定系统未以最佳状态运行的原因。