另一个问题的图表是针对 100 万行的表。当为 10,000 行绘制时,该图具有相当不同且更有趣的形状。
当列长度介于 524 和 903 之间时,存在一个平台期。
这种形状出现在我的工作和家用笔记本电脑上。(分别是 SQL Server 2017 CU27 和 2017 CU22、2019 CU8。两个盒子都有 16GB RAM。)
这让我认为它是经过调整的真正设计选择,而不是人工制品。
为 SQL Server 2019 设置 BATCH_MODE_ON_ROWSTORE = OFF 几乎没有任何区别。除 t800 为 6688kB 关闭和 6656kB 开启外,所需内存在所有大小上都相同。
这张图怎么会有这样的形状?哪些考虑因素意味着三区域解决方案在中等行数(10,000 行)而不是较大行数(100 万行)时是最佳的?
我知道 SQL Sever 开发团队之外的任何人都无法最终说明这个特定图表是这种形状的原因。但总的来说,从学术和行业经验来看,如果我开始为假设的 DBMS 编写内存管理模块,什么样的考虑会导致这种结果?
内存授予是基于预期基数和平均行大小以及由于实现细节而产生的开销的估计。
由于总拨款较少,人们可以在估计数周围有更多的“回旋余地”(比如 1.4 倍)。对于较大的赠款,人们可能会选择较低的软糖系数(例如 1.25)。
当排序超出授予的内存并需要溢出到磁盘时,还可能存在与所需额外内存相关的固定开销。溢出数据的有效处理可能需要某种“大输出缓冲区”。可以选择是否使用 7470 之类的跟踪标志来满足这一需求。
对于一系列常见的中等大小的内存授权,使用固定的额外授权(比如 6MB)可能是有意义的,而不是搞乱不太可能完全正确的小而详细的计算。这将在所需的任何固定内存大小(例如 512KB)之上,作为排序所需的内存中的绝对最小大小。
在这种排列中,您会看到直线的一部分倾斜度约为 1.25,另一部分倾斜度约为 1.4,中间有一个平坦的位,其中选择了固定的附加授权。