我知道由于索引碎片,在 SQL Server 中缩小数据文件是一个坏主意。
在争论我的观点之前,我想确保我完全理解。
我知道当dbcc shrinkfile
(除非 with truncateonly
)运行时,后面的页面将移动到较早位置的可用空间。
此函数是否获取数据文件中的最后一页并将其放在第一个可用空间中?
换句话说,如果我们遇到这种情况:
[ Page 1 ] [ Page 2 ] [ empty1 ] [ empty2 ] [ Page 3 ] [ Page 4 ] [ empty3 ] [ empty4 ] [ Page 5 ]
...在执行 a 之后dbcc shrinkfile
会[ Page 5 ]
被移动到,[ empty1 ]
因为那是第一个可用的插槽?等等...
最后它最终看起来像这样:
[ Page 1 ] [ Page 2 ] [ Page 5 ] [ Page 4 ] [ Page 3 ]
任何帮助,将不胜感激。
收缩算法的工作原理与您描述的完全一样。可以在 Paul Randal 的博客中找到很好的描述:https ://www.sqlskills.com/blogs/paul/why-you-should-not-shrink-your-data-files/
在您的示例中,Page5 最终出现在 Empty1 中。