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磁盘驱动器。
答案 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性能,
- 不同卷上的单独数据和日志文件(最好是raid 10)
-tempdb(http://technet.microsoft.com/en-us/library/ms175527(v=SQL.105).aspx)
-configure min / max memory
- 在内存和即时文件初始化中配置锁定页面
- 检查此链接,http://www.brentozar.com/sql/sql-server-performance-tuning/
关键是有很多可能会影响您的数据库,几乎不可能根据提供的信息识别您的问题。我建议您仔细阅读这些项目,以确定系统未以最佳状态运行的原因。