背景

我正在将160GB数据库从具有48GB RAM的Win 2008服务器上的MSSQL 2008(标准)迁移到Win 2012上运行MSSQL 2012(64位Web版)的新服务器上配备64GB RAM。旧服务器处于活动状态并处于负载状态;新服务器未投入生产。新服务器有8个tempdb文件(每个4GB)。

问题

在新服务器上的测试中,我看到许多查询中的步骤引起警报,提示“操作员使用tempdb来在执行期间溢出数据”。我已经能够通过重写一些查询来避免排序,但这并不能真正解决问题。旧服务器上的相同查询不会引起溢出。我读过,当MSSQL无法完成内存中的操作并不得不溢出/分页到tempdb中时,就会发生溢出。我应该担心溢出吗?您会注意到,估计的行数与实际的行数之间存在一些差异。当前,MSSQL已消耗了大约35gb的内存,但工作集只有682mb。旧服务器(尽管在生产中,正在处理负载)具有44gb的内存用于MSSQL,其中43.5gb在其工作集中。



我不知道是否溢出可能与记忆设置有关-任何人都有想法吗? MSSQL当前有几英亩的RAM可用,为什么它会因某种形式和散列匹配而溢出到tempdb中?

评论

执行计划中的警报是2012年的新警报。您是否检查过警报是否一直在旧服务器上溢出?您正在监视吗?

@MartinSmith啊,没有意识到警报是新的。我没有监视旧服务器上的溢出。将对此进行调查。

略有切点,但我坐在10表连接的前面,默认情况下,该表连接大多数都使用合并连接,并且行估计非常好,这会导致tempdb 0级溢出和25s运行时。强制哈希联接(和顺序)可消除溢出并在9s内运行。我只是想知道它是合并还是散列还是溢出会引起差异,以及优化器是否适当权衡了看似即将到来的溢出的影响(因为行估计非常好)。

新服务器具有硬件numa吗?

#1 楼

这里有几个不同的问题:

问:为什么查询以前没有溢出? SQL 2012之前的错误。这是一个很好的例子,说明为什么在进行性能调整时,您必须比图形执行计划更深入。 />
因为SQL Server没有授予他们足够的内存来完成其操作。执行计划可能低估了所需的内存量,或者存储盒承受了内存压力,或者它们只是大查询。 (请记住,SQL Server将内存用于三件事-缓存原始数据页,缓存执行计划以及用于查询的工作空间。该工作空间的内存最终很小。)

问:如何减少溢出通过编写可修改的T-SQL语句,具有最新的统计信息,在服务器中放置足够的内存,建立正确的索引,以及在事情无法解决时解释执行计划。您期望的方式。请查看Grant Fritchey的书《 SQL Server查询性能调优》,以获取所有这些内容的详细说明。