在线索引在中间级别重建更高的碎片

Fre*_*gen 5 sql-server sql-server-2016 enterprise-edition index-maintenance

我需要重建一些大索引,并且我正在使用ALTER INDEX语句的各种选项(sort_in_tempdb、maxdop、online)对具有 4 个级别和叶级别的 800000 页的测试索引进行一些测试。
我注意到,当我使用Online=on索引的中间页(级别 1)运行语句时,与以前一样碎片化程度更高(89% 而不是 3%)。

中间页只有在我设置MAXDOP=1. 使用选项SORT_IN_TEMBP=ON,ONLINE=OFF,级别 2 碎片从 0 跳到 100。

以下是导致级别 1 碎片增加的语句:

ALTER INDEX pk_test ON dbo.test REBUILD WITH (sort_in_tempdb=off,online=on,maxdop=1)
ALTER INDEX pk_test ON dbo.test REBUILD WITH (sort_in_tempdb=off,online=on)
ALTER INDEX pk_test ON dbo.test REBUILD WITH (sort_in_tempdb=on,online=on)
Run Code Online (Sandbox Code Playgroud)

此语句导致级别 2 上的碎片从 0 变为 100,但级别 1 保持不变:

ALTER INDEX pk_test ON dbo.test REBUILD WITH (sort_in_tempdb=on,online=off)
Run Code Online (Sandbox Code Playgroud)

中间页面上的碎片是否需要担心?是什么导致碎片增加?

Fra*_*ani 1

尝试这个:

ALTER INDEX pk_test ON dbo.test REBUILD WITH (PAD_INDEX = OFF, 
    STATISTICS_NORECOMPUTE = OFF, 
    SORT_IN_TEMPDB = ON,  
    ONLINE = ON, 
    ALLOW_ROW_LOCKS = OFF, 
    ALLOW_PAGE_LOCKS = OFF, 
    FILLFACTOR = 90, 
    OPTIMIZE_FOR_SEQUENTIAL_KEY = ON)
Run Code Online (Sandbox Code Playgroud)

这样,您的碎片率将达到FILLFACTOR90%,并且您可能会避免表碎片再次激增。

请记住,您的表大小将增加 10%