11

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

服务器:双四核 Xeon 8 GB RAM 单 RAID 10 阵列 Windows 2003 Server 64 位 SQL Server 2005 标准 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 文件是否应该位于不同的阵列上?

4

5 回答 5

7

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

1:以下操作大量使用 tempdb

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

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

  • 行级版本控制(快照隔离)
  • 在线索引重建

正如其他 SO 答案中提到的,请阅读这篇关于提高 tempdb 性能的最佳实践的文章。

2:查看服务器上的可用 RAM 量,即查看 WMI 计数器 Memory->Available Mbytes 无济于事,因为 SQL Server 会将数据页缓存在 RAM 中,因此任何运行时间足够长的 db 服务器将几乎没有可用 RAM .
您应该查看的计数器在告诉您向服务器添加 RAM 是否有帮助时更有意义:
SQL Server Instance:Buffer Manager->Page Life Expectancy (in seconds) 低于 300-400 秒的值意味着页面是不在内存中很长时间,并且不断地从磁盘读取数据。页面预期寿命较短的服务器将受益于额外的 RAM。

SQL Server Instance:Buffer Manager->Buffer Cache hit Ratio 这告诉你从 RAM 读取的页面的百分比不必从磁盘读取,缓存命中率低于 85 将意味着服务器将受益来自额外的 RAM

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

于 2009-03-08T13:59:08.470 回答
3

很好的问题,+1

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

除了通常的 order by 子句、临时表等之外。

你可能会更好地分割你的日志和数据文件(也是为了可恢复性)。更多的内存总是好的,但请参阅下面的这个64 位特定的东西,Grumpy Old DBA

最后,也许是最重要的,您可能会在 tempdb 中发生空间分配争用:Linchi SheaSQL Server 存储团队的解释

后期编辑:

Paul Randall 添加了一个条目“ Comprehensive tempdb blog post series ”,它提供了很好的链接

于 2009-03-06T20:30:27.190 回答
3

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

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

于 2009-03-06T20:37:37.500 回答
3

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

于 2009-03-08T11:09:10.360 回答
0
  1. 对 tempdb 的写入可以是任何内容。内部哈希表、临时表、表变量、存储过程调用等。

  2. 如果您只有 250 兆的可用 RAM,那么更多的 RAM 会更好。

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

所有对 tempdb 的写入都将是 64k 大小,因为这是每个数据库范围的大小。

于 2009-03-08T06:29:23.560 回答