我有一个供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年
您如何确定碎片级别?我不希望聚集索引有太多逻辑上的碎片。但是,有些内部碎片,您不需要
—
马丁·史密斯
FILLFACTOR = 80
那里。这样只会浪费空间。所有列都是固定长度的,因此行不能在更新时扩展,并且插入不能在表的中间进行。99%的其他指数似乎也出乎意料的高。每个索引有几页?
每天重建之后的99%确实会投入一些,您能显示
—
马丁·史密斯
sys.dm_db_index_physical_stats
输出吗?