问题 SQL Server 2005内存压力和tempdb写入问题


我们的生产SQL Server存在一些问题。

服务器:双四核Xeon 8 GB RAM 单个RAID 10阵列 Windows 2003 Server 64位 SQL Server 2005 Standard 64位

现在机器上有大约250MB的可用RAM。 SQL Server有大约6GB的RAM,我们的监控软件说只有一半的SQL Server分配的RAM实际被使用。

我们的主数据库大约为20GB,任何频率都可以使用大约12GB。我们的tempdb是700MB。两者都位于同一物理磁盘阵列上。

此外,使用Filemon,我能够看到tempdb文件有100或1000的写入长度65536.磁盘队列长度几乎80%的时间超过100。

所以,这是我的问题 -

  1. 什么会导致tempdb上的所有写入?我不确定我们是否总是有这么多的活动,但似乎过度,这些问题是最近的。

  2. 我应该只为服务器添加更多内存吗?

  3. 在高负载服务器上,tempdb和db文件应该位于不同的阵列上吗?


4163
2018-03-06 20:05


起源

我们有一个带热备份的RAID-10阵列。当我们遇到丢失磁盘问题时,我们购买了热备件,但这些问题已得到修复,一年多没有问题。在备用磁盘上创建新磁盘(无RAID)是否可以快速修复以提高tempdb性能? - Brian


答案:


如果您有SAN或NAS,则磁盘队列长度不高并不意味着您有I / O瓶颈,您可能需要查看其他额外的计数器。查看 SQL Server Urban Legends讨论过 更多细节。

1:以下操作大量使用tempdb

  • 重复创建和删除临时表(本地或全局)
  • 使用tempdb进行存储的表变量
  • 与CURSORS关联的工作表
  • 与ORDER BY子句关联的工作表
  • 与GROUP BY子句关联的工作表
  • 与HASH PLANS相关的工作文件

这些SQL Server 2005功能也大量使用tempdb:

  • 行级版本控制(snapshotisolation)
  • 在线指数重建

正如在其他SO答案中提到的那样 本文 关于提高tempdb性能的最佳实践。

2:查看服务器上的可用RAM量,即查看WMI计数器Memory-> Available Mbytes没有帮助,因为SQL Server会将数据页缓存在RAM中,因此任何运行时间足够长的数据库服务器都会有很少的空闲RAM 。
您应该查看的计数器更有意义,告诉您是否向服务器添加RAM将有助于:
SQL Server实例:缓冲区管理器 - >页面预期寿命(以秒为单位) 低于300-400秒的值意味着Pages内存不长,并且正在从磁盘读取数据。具有较低页面预期寿命的服务器将受益于额外的RAM。

SQL Server实例:缓冲区管理器 - >缓冲区缓存命中率 这告诉您从RAM中读取的页面百分比,不必从磁盘读取,低于85的缓存命中率将意味着服务器将受益于额外的RAM

3:是的,这里不能出错。建议在一组单独的磁盘上安装tempdb。看着 这篇知识库文章 在标题下:移动tempdb数据库以了解如何执行此操作。


7
2018-03-08 13:59



评论页面预期寿命和缓冲区缓存命中率(不知道为什么我没有想到这一点,因为我过去曾有过内存问题)。页面预期寿命为74000,缓冲区缓存为99.85。很确定这意味着它不是内存问题! - Brian
原来一个缺失的索引导致了我的每一个问题 - 我可以看到磁盘队列,磁盘秒/写,磁盘秒/读秒,第二个我创建了索引。来自300万条记录的表格的结果正在我所知道的tempdb中进行排序。 - Brian


是的,高负载服务器上的建议是将TempDB放在用户数据库的一组独立驱动器上:

SQL Server 2005联机丛书:优化tempdb性能


3
2018-03-06 20:37





不是直接答案你的问题,但这可能是一个很好的提示:重新启动SQL Server实例将清除tempdb,这可能是一个良好的开端调查在tempdb上执行的操作。


3
2018-03-08 11:09



谢谢你的提示!我不知道为什么我没有想到这一点。 - Brian


优秀的问题,+ 1

在SQL 2005+中使用tempdb的次数更多。 至少:快照隔离级别,在线索引重建,在触发器中读取INSERTED / DELETED(用于读取日志文件!)

除了通常的子句,临时表等顺序之外

您可能更好地拆分日志和数据文件(也用于可恢复性)。 更多的记忆总是好的,但看到这一点 64位特定的东西,Grumpy Old DBA 下面。

最后,也许最重要的可能是,你可以在tempdb中争用空间分配: 来自的解释 Linchi Shea 和 SQL Server存储团队

晚编辑:

Paul Randall添加了一个条目“综合tempdb博客文章系列“这提供了良好的链接


3
2018-03-06 20:30





  1. 写入tempdb可以是任何东西。内部哈希表,临时表,表变量,存储过程调用等。

  2. 如果你只有250 Megs的可用内存,那么更多内存是好的。

  3. 始终建议您将tempdb和用户数据库拆分到不同的磁盘。

对tempdb的所有写入大小都是64k,因为它是每个数据库扩展区的大小。


0
2018-03-08 06:29