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

标签 sql-server sql-server-2005 performance tempdb

我们的生产 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。

所以,这是我的问题-

  1. 什么会导致 tempdb 上的所有这些写入?我不确定我们是否一直都有那么多事件,但这似乎有些过多,而且这些问题是最近才出现的。

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

  3. 在高负载服务器上,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/

相关文章:

sql - 在 SQL Server 中使用 ISNULL() 时是否存在任何性能问题?

sql - 为什么 'Select' 被称为 DML 语句?

python - 在 python 2.7 中有效的循环

java - Hibernate:SQL Server .MDF 文件的 connection.url

sql - 更新数据库中的sql位字段

c# - 数据库项目部署流程

sql-server - SQL Server 平行于 Oracle Alter Table Set Column Unused?

虚拟机与本地机中的 Java 应用程序性能

performance - JPA entitymanager 删除操作性能不佳

sql-server - 如何在 t-sql 中进行透视和计算百分比?