当我们没有聚集索引时会出现外部碎片

问题描述 投票:0回答:1

如果我们没有聚集索引,因此数据在物理上按堆顺序存储,并且我们在堆上创建非聚集索引。数据可以存储在任何地方,没有任何限制。这样的话,就不会有外部碎片了,因为分页没有意义?

我想澄清一下聚集索引对非聚集索引和碎片的总体影响。

sql-server indexing clustered-index non-clustered-index fragmentation
1个回答
0
投票

我想我明白你的想法,但它是基于一些误解。

让我们从一个简单的电话簿类比开始。您创建全新的电话簿只是为了获得新电话号码的详细信息。该死的,你想。页面已满。电话簿很好,很高效,整页内容一致。您可以在相关页面内贴一张带有详细信息的便利贴。碎片化。

现在让我们举一个不同的例子。这次,您有一个事务日志,其中事务日期时间是主键,甚至是连续的事务编号。一些新数据到达。您可以将其按顺序添加到书的最后一页。伟大的。没有碎片。但是,您需要返回到以前的记录并更新它。突然间,它不再适合该行。你有一个问题。碎片化。

最重要的是,碎片是数据内容变化的自然组成部分。它也不限于聚集索引。这些问题也会出现在非聚集索引上。唯一的关键区别是聚集索引反映了基表中的实际记录顺序 - 数据存储在索引的叶节点中而不是指向记录的指针中。

有一些策略可以减轻碎片化。例如,Ola 的索引维护脚本是主流的选择。填充因子可以推迟或减轻也会产生碎片影响的少量更改。

但是,最重要的是,如果您坐在那里“面对电话簿”,那么您无疑会需要一个索引。根据您的应用程序要求,您可能会选择创建“覆盖索引”,即非聚集索引,它允许您定位记录和所需的内容,而无需查找开销。在大多数情况下,索引应该围绕所需的用例进行设计。

© www.soinside.com 2019 - 2024. All rights reserved.