为什么即使统计数据正确也会发生 TempDB 溢出?

Rau*_*DBA 1 memory statistics tempdb sql-server-2014 memory-grant

我阅读了Brent Ozar 发表的一篇很棒的文章,并提出了一些与内存授予相关的问题。我无法在他文章的评论部分回答我的问题,所以我想从这里得到任何帮助。

  1. 问题:有多少数据溢出到磁盘中? 400 MB还是60 MB (7643KB*8)?

他在文章中指出:

而且无论我更新统计信息多少次,我仍然会得到大约400MB 的磁盘溢出。

我在这里有点困惑(

在此处输入图片说明 在此处输入图片说明

  1. 问题:如果估计一切正常,统计数据是最新的,盒子有足够的内存,并且当时没有查询在运行,那么为什么会发生溢出到磁盘?

查看估计的行数与实际的行数。它们是相同的。统计数据很好。

我也没有使用小型服务器:我的虚拟机有 32GB 的 RAM,我已将其中的 28GB 分配给 SQL Server。没有其他查询同时运行——这只是一个孤独的查询,溢出到磁盘......

在此处输入图片说明

Pau*_*ite 8

如工具提示所示,7643 个 8KB 页面被溢出 = 59.71MB。其余的排序发生在分配的内存中。

排序溢出有两个原因:

  1. 排序是并行的。准确的内存估计在排序线程之间平均分配,并且不能在运行时在线程之间动态重新分配。如果行分布不均,一个或多个排序线程可能会溢出。这是有点更容易在低DOP如4,而不是8的情况发生。

扫描和排序线程

  1. 估计内存要求时,SQL Server 不考虑溢出管理开销。这在FIX 中有详细说明:当估计的行数和行大小正确时,排序运算符溢出到 SQL Server 2012 或 SQL Server 2014 中的 tempdb。

在 SQL Server 2019 上,可以通过行模式内存授予反馈机制自动调整执行之间授予的内存以避免溢出。