我们的生产 SQL Server 遇到一些问题。
服务器:双四核至强 8GB 内存 单个 RAID 10 阵列 Windows 2003 服务器 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。
所以,这是我的问题-
什么会导致 tempdb 上的所有这些写入?我不确定我们是否一直都有那么多事件,但这似乎有些过多,而且这些问题是最近才出现的。
我应该向服务器添加更多内存吗?
在高负载服务器上,tempdb 和 db 文件是否应该位于不同的阵列上?
最佳答案
如果您有 SAN 或 NAS,磁盘队列长度较长并不意味着存在 I/O 瓶颈,您可能需要查看其他附加计数器。查看SQL Server Urban Legends discussed了解更多详情。
1:以下操作大量使用tempdb
- 重复创建和删除临时表(本地或全局)
- 使用 tempdb 进行存储的表变量
- 与 CURSORS 关联的工作表
- 与 ORDER BY 子句关联的工作表
- 与 GROUP BY 子句关联的工作表
- 与哈希计划关联的工作文件
这些 SQL Server 2005 功能也大量使用 tempdb:
- 行级版本控制(快照隔离)
- 在线索引重建
正如其他 SO 答案中提到的,阅读 this article关于提高 tempdb 性能的最佳实践。
2:查看服务器上的可用 RAM 量,即查看 WMI 计数器 Memory->Available Mbytes 并没有什么帮助,因为 SQL Server 会将数据页缓存在 RAM 中,因此任何运行足够长的数据库服务器将没有多少可用 RAM .
您应该查看的计数器更有意义,可以告诉您向服务器添加 RAM 是否有帮助:
SQL Server 实例:缓冲区管理器->页面预期生命周期(以秒为单位)
低于 300-400 秒的值意味着页面在内存中的时间不会很长,并且数据会不断从磁盘读取。页面预期生命周期较短的服务器将受益于额外的 RAM。
和
SQL Server实例:缓冲区管理器->缓冲区缓存命中率
这告诉您从 RAM 读取但不必从磁盘读取的页面的百分比,缓存命中率低于 85 将意味着服务器将受益于额外的 RAM
3:是的,这里不会出错。建议将 tempdb 放在一组单独的磁盘上。看this KB article在标题下:移动 tempdb 数据库了解如何执行此操作。
关于sql-server - SQL Server 2005内存压力和tempdb写入问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/620226/