非聚集索引包含列会导致高度碎片化

时间:2019-04-04 00:38:50

标签: sql-server indexing azure-sql-database

我在Azure SQL Server中具有非聚集索引,如下所示:

CREATE NONCLUSTERED INDEX [IX_index_xx] 
ON [dbo].[ActiveDay] ([user_id] ASC, [enterprise_id] ASC)
INCLUDE ([dateTime])  
WITH (STATISTICS_NORECOMPUTE = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]

应用程序运行时,可以在用户执行某些操作(如登录)时向该表输入新行或更新“ dateTime”列。该表中没有其他繁重的操作。表中有大约135,000行。我重建了上面的索引,但是在1天后,它再次被碎片化,占60%,页数约为1370。为什么它在1天内变得高度碎片化?我真的不明白原因。

1 个答案:

答案 0 :(得分:0)

  

为什么它在1天之内变得高度碎片化?

此索引中的行按(user_id,enterprise_id)排序。因此,当您在表中插入新行时,它可能会进入聚集索引的 end 中,但是必须将其插入到此非聚集索引的 medium 中。如果目标页面已满,则必须将其拆分,并且该数据库的新页面将在非完全范围内启动。

来自不同对象的扩展区的交错和来自索引排序顺序的不同部分的页面的交错都是碎片类型。这种非聚集索引的碎片化是正常现象,通常不会引起严重问题,尤其是当您的数据库存储在SSD上时,就像所有Azure SQL数据库一样。

重建索引后,索引中的所有叶子页都已100%充满,并且大部分碎片已消除。但是,当您在表中插入新行时,碎片自然会返回。重建后,任何插入都需要分页,并导致碎片。如果您确实要重建索引,可以将填充因子设置为80%左右,以防止重建索引后出现大量的页面拆分。