Mic*_*een 6 sql-server memory-grant
其他问题的图表适用于 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 OFF 和 6656kB ON 外,所有大小所需的内存都是相同的。
这个图怎么会是这个形状呢?哪些考虑因素意味着三区域解决方案在中等行数(10,000 行)时是最佳的,但在较大行数(100 万行)时则不是最佳?
据我所知,SQL Sever 开发团队之外的任何人都无法最终说明该特定图形为何呈这种形状。但一般来说,从学术和行业经验来看,如果我开始为假设的 DBMS 编写内存管理模块,什么样的考虑会导致这种结果?
内存授予主要基于预期基数和平均行大小以及由于实现细节而产生的开销进行估计。
由于赠款总额较小,人们可以在估计值周围提供更多的“回旋余地”(例如 1.4 倍)。如果赠款数额较大,人们可能会选择较低的模糊系数(例如 1.25)。
当排序超出授予的内存并需要溢出到磁盘时,还可能存在与所需的额外内存相关的固定开销。有效处理溢出数据可能需要某种“大输出缓冲区”。人们可以选择是否使用 7470 等跟踪标志来满足这一需求。
对于一系列常见的中等大小的内存授予,使用固定的额外授予(例如 6MB)可能是有意义的,而不是混乱地进行小而详细的计算,无论如何都不太可能完全正确。这将超出所需的任何固定内存大小(例如 512KB),作为排序所需内存中的绝对最小大小。
在这种安排中,您会看到线的一部分的斜率约为 1.25,另一部分的斜率约为 1.4,中间有一个平坦的位,其中选择了固定的附加补助金。
归档时间: |
|
查看次数: |
112 次 |
最近记录: |