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


11

我有一个供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

1
愚蠢的问题,但要涵盖所有基础-您每天都在重建/重组吗?
JHFB 2012年

没有TABLE DDL,任何人都会猜到。您是否使用GUID作为主键?
SQL学习者2012年

我现在每天都在重建,但我想知道是否可以防止这种情况每天发生,因为我可以很好地预测数据的发展方式。
olle 2012年

1
您如何确定碎片级别?我不希望聚集索引有太多逻辑上的碎片。但是,有些内部碎片,您不需要FILLFACTOR = 80那里。这样只会浪费空间。所有列都是固定长度的,因此行不能在更新时扩展,并且插入不能在表的中间进行。99%的其他指数似乎也出乎意料的高。每个索引有几页?
马丁·史密斯

每天重建之后的99%确实会投入一些,您能显示sys.dm_db_index_physical_stats输出吗?
马丁·史密斯

Answers:


3

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.