如何防止 99% 的每日索引碎片

oll*_*lle 11 index sql-server-2008 fragmentation

我有一个可容纳 100.000 名玩家的高分表,每天插入 2 次,每个玩家一条记录。在一天结束时,该表中索引的索引碎片为 99%。有没有办法通过调整设置来防止这种情况?

CREATE TABLE HighScore(
    [id] [int] IDENTITY(1,1) NOT NULL,
    [user] [int] NULL,
    [player] [int] NULL,
    [round] [tinyint] NULL,
    [group] [int] NULL,
    [rank] [int] NULL,
    [delta] [int] NULL,
    [roundpoints] [int] NULL,
    [totalpoints] [int] NULL,
PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]


CREATE NONCLUSTERED INDEX [HighScore_RoundGroup_Nidx] ON .[HighScore] 
(
    [round] ASC,
    [group] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 80) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)

usr*_*usr 3

我认为您应该尝试更高的FILLFACTOR设置HighScore_RoundGroup_Nidx(例如 50 或 40)。您可以将其设置FILLFACTOR为 0 或 100,因为PRIMARY KEY它不应该产生碎片。如果仍然存在碎片,FILLFACTOR则无济于事,因为原因是新分配的页面与其他新分配的页面交错。这是一个众所周知的 SQL Server 问题。您可以将此索引移动到其自己的文件组中,这将阻止此问题。