![SQL Server 2008 不断读取 MDF 文件,性能很差](https://linux22.com/image/632763/SQL%20Server%202008%20%E4%B8%8D%E6%96%AD%E8%AF%BB%E5%8F%96%20MDF%20%E6%96%87%E4%BB%B6%EF%BC%8C%E6%80%A7%E8%83%BD%E5%BE%88%E5%B7%AE.png)
我们有一个应用程序在运行于 VMWare ESXi 上的 Windows 2008 R2 虚拟服务器上的后端运行 SQL Server 2008 R2 Express。用户抱怨该应用程序运行速度非常慢。我看到磁盘 IO 非常高,这对我来说毫无意义。
背景:
- 平均磁盘队列长度约为 60,最大值约为 250
- 平均磁盘读取次数/秒约为 2000 次,最大值约为 3500 次
- 资源监视器显示 sqlservr.exe 正在以大约 40-60 MB/秒的速度读取 .mdf 文件(见下文)。写入 IO 非常低。
- .mdf 文件只有 2 GB,这意味着整个文件应该可以装入内存
- 该服务器具有 32 GB RAM,但通常使用量不到 16 GB
- 该服务器有 8 个 15k SAS 磁盘,采用 RAID10 结构。它是一台配备 PERC H710 控制器的戴尔计算机,能够使用 SSD 来启用 CacheCade(基于 SSD 的读取缓存),我很想尝试一下,但似乎整个缓存都应该缓存在 RAM 中,所以我不确定这是否有用。
- SQL VM 位于运行 VMWare ESXi 5 的戴尔服务器上。该 ESXi 主机上还有另一个 VM,但它是一个具有很少 IO 的域控制器。
- 此应用程序之前在独立的 Windows 2003 服务器上运行。我们升级到 Windows 2008 R2,同时将应用程序升级到较新版本,因此这两个因素都有可能导致此问题。
有哪些方法可以深入研究这个问题?有没有办法查看 SQL 服务器在后台执行的操作(正在执行哪些查询等)?这种行为是否正常,负载是否对于存储来说太大?我想知道是否配置不正确。
答案1
http://msdn.microsoft.com/en-us/library/cc645993(v=sql.105).aspx#Scalability
Espress 不会为 SQL 进程使用超过 1 GB 的 RAM。您需要购买并安装至少 Web 或 Standard 才能使用超过 4 GB 的 RAM - 它们都支持 64,这比您拥有的内存要多,因此请选择其中之一。
此外,成为一名 DBA 是一个相当深奥的话题,但通过 Technet 和帮助文件很容易理解。“我如何知道正在执行哪些查询”几乎是第一天的主题(就像知道哪个版本适合给定任务一样)。Profiler 甚至不适用于 Express,所以你现在的配置让你陷入困境。
答案2
查看查询详细信息 - 检查具有高物理或逻辑 IO 的查询,隔离它们,查看查询计划。多年来我一直使用像 2008 R2 这样的过时版本... http://gallery.technet.microsoft.com/scriptcenter/Find-inefficient-query-88f4611f可能会给你一个开始。
我的提示是缺少触发表扫描的索引。分析器和调优向导也可能有助于了解问题所在。如果 2008 R2 已经在管理器中提供了活动概览,那么这将有一个包含最昂贵查询的漂亮窗口。