我们正在使用 VM 在 Azure 云中设置 SQL 服务器。当我们确定数据/日志/临时数据库的最佳设置时,我们遇到了许多建议将临时数据库放置在 Azure 提供的临时存储驱动器上的博客文章。然而,更深入的研究从微软那里发现了这一信息,据说不应该这样做。
所以我们留下了以下问题:
- 任何人都可以就我们是否应该将 tempdb 放在临时存储上提供当前的结束答案吗?
- 有人对此事有明确的绩效结果吗?
- 如果将 tempdb 放在临时存储上,可能会产生哪些副作用?
我们正在使用 VM 在 Azure 云中设置 SQL 服务器。当我们确定数据/日志/临时数据库的最佳设置时,我们遇到了许多建议将临时数据库放置在 Azure 提供的临时存储驱动器上的博客文章。然而,更深入的研究从微软那里发现了这一信息,据说不应该这样做。
所以我们留下了以下问题:
由于最初的建议是将 tempdb 放在 D: 驱动器上,因此对此有些困惑。这不再是真的。有关最新信息,我建议您阅读此处的“Windows Azure 虚拟机中 SQL Server 的性能指南”白皮书:http: //msdn.microsoft.com/en-us/library/windowsazure/dn248436.aspx
这是 TempDB 部分的摘录:
如 Windows Azure 虚拟机磁盘和缓存设置部分所述,我们建议您将 tempDB 放置在操作系统磁盘或数据磁盘上,而不是临时磁盘 (D:) 上。以下是基于我们对 SQL Server 测试工作负载进行的内部测试而提出此建议的三个主要原因。
• 性能差异:在我们的测试中,我们注意到您可以获得与 D: 相同水平的性能,如果不是来自操作系统或单个数据磁盘的更多 IOPS。但是,D: 盘的性能并不能保证与操作系统或数据盘一样可预测。这是因为 D: 驱动器的大小和从中获得的性能取决于您使用的虚拟机的大小。
• 虚拟机宕机情况下的配置:如果虚拟机关闭(由于计划内或计划外的原因),为了让 SQL Server 在 D: 驱动器下重新创建 tempDB,启动 SQL Server 服务的服务帐户需要具有本地管理员权限。此外,本地 SQL 部署的常见做法是将数据库和日志文件(包括 tempDB)保存在单独的文件夹中,在这种情况下,需要在 SQL Server 启动之前创建该文件夹。对于大多数客户来说,这种额外的重新配置开销是不值得的。
• 性能瓶颈:如果您将 tempdb 放在 D: 驱动器上并且您的应用程序工作负载大量使用 tempDB,这可能会导致性能瓶颈,因为 D: 驱动器可能会在 IOPS 吞吐量方面引入限制。相反,将 tempDB 放在操作系统或数据磁盘上以获得更大的灵活性。有关优化 tempdb 的配置最佳实践的详细信息,请参阅 SQL Server TempDB IO 最佳实践的编译。
更新: 现在临时驱动器可用作 D 系列 Azure VM 的 SSD,@CSharpRocks 引用的白皮书略有过时。有关最新建议(截至 2014 年底至 2015 年中),请参阅以下两篇文章:
上面的文章明确提到将 tempdb 和缓冲池扩展放在 D:\ 上。摘抄:
使用 D 系列虚拟机 (VM) 时,仅在 D 驱动器上存储 tempdb 和/或缓冲池扩展。与其他 VM 系列不同,D 系列 VM 中的 D 驱动器是基于 SSD 的。这可以提高大量使用临时对象或具有不适合内存的工作集的工作负载的性能。
2017 年:
我有一个长时间运行的存储过程,它是 tempdb 密集型的。在 OS 驱动器上设置 Tempdb,Azure 默认配置它,在使用 SDD 磁盘的 DSv2 机器上,查询运行大约 1 分半钟。
将 Tempdb 移动到临时存储(并且什么都不做)将查询更改为在 57 秒内运行,因此性能提高了 33%。查询在这两种情况下都重复运行,并且时间(给予或接受)始终保持在这些数字上。
将 TempDB 放在临时存储上需要特别考虑启动 SQL 服务器。有两种方法。一种是将文件指向 D 的根目录,并赋予 SQL Server 进程本地管理权限。如果您已经有其他东西启动 SQL Server 进程而不仅仅是自动服务启动,那么这是您要考虑的场景。否则,它会引起安全问题。
第二个选项是将SQL Server服务设置为手动启动,然后编写一个powershell脚本来启动它,并将那个powershell脚本放在一个计划任务上,在启动时运行。powershell 脚本将首先确保该目录在启动 SQL Server 之前存在于临时存储中。
它已在另一个答案中链接到,但本文档于 2017 年更新,它并未正式推荐 TempDb 的这种设置,而只是将其移出操作系统分区。但是,它说:
如果您的工作负载大量使用 TempDB(例如用于临时对象或复杂连接),将 TempDB 存储在 D 驱动器上可能会导致更高的 TempDB 吞吐量和更低的 TempDB 延迟。
我的表演经验证实了最后一行。