1

在 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进行数据库连接。Connection Pooling我已经尝试在Windows 小程序选项卡中禁用和启用此驱动程序的连接池Data Sources (ODBC)。该脚本从数据库发送 100 条记录,然后关闭连接并休眠 2 分钟,然后再次运行。

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

问题是当我删除定义的 DSN(当然 python 脚本没有运行)时,.Net 应用程序运行良好。当我再次定义 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 没有更新微软的最新补丁,所以如果它是 ODBC 驱动程序或 MSSQL 本身的错误,它可能已经为其他人解决了。

编辑 3

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

4

1 回答 1

1

有很多事情会影响性能。可能存在资源争用、次优 SQL Server 配置、慢速磁盘、缺少索引等...

当两个进程都在运行时,我会首先监视系统资源。您可以使用 perfmon 来监视 OS 和 SQL 计数器。我会先看看

  • 处理器信息/%处理器时间

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

    LogicalDisk/Avg 磁盘秒/写

    内存/可用 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 性能,

关键是有很多可能会影响您的数据库,因此几乎不可能根据提供的信息来识别您的问题。我建议您仔细检查这些项目中的每一项,以确定您的系统未以最佳方式运行的原因。

于 2013-08-19T13:39:03.300 回答