我现在明白聚簇索引包含所有行数据,而不仅仅是索引字段。我试图理解这对碎片化的影响。
假设我们有一个这样的表:
create table Files
(
ID uniqueidentifier not null,
Field1 nvarchar(300) null,
Field2 nvarchar(300) null,
Field3 nvarchar(300) null,
Binary varbinary(max) null
)
现在假设所有这些行都充满了数据,然后在聚集索引中的某些早期行上突然将Field1,Field2,Field3和Binary设置为null。
正如我以相当天真的方式想到的那样,其中的一个含义是,清除所有这些价值将产生差距,并且索引将变得支离破碎。我猜这些行仍然是正确的顺序,那真的是索引碎片吗?
或者你可以考虑另一种方式;如果它们都是空的并且您插入数据,那么您最终是否需要将数据移植到不同的页面并获得索引碎片?
另外,我知道LOB数据存储在一个单独的分配单元中,但我不确定它的含义是什么;是否意味着将Binary设置为null(或填充它)应该对聚簇索引碎片没有影响?
答案 0 :(得分:1)
我想到的一个含义 以我天真的方式,就是这样 清除所有这些值将 创造差距,索引会 变得支离破碎。我猜行 仍然是正确的顺序, 那真的是索引碎片吗?
是。你会得到内部碎片。 SQL Server不会自动压缩数据页以回收空间。您可以使用SQL Internals Viewer工具查看此内容。尽管取决于您的工作量,这不一定是坏事。某种程度的内部碎片可能有助于缓解下面的内容(甚至通过使用FillFactor故意添加)
或者你可以考虑另一个 办法;如果他们都是空的开始 并且你插入数据,你最终 不得不将数据改组为 不同的页面,也得到索引 不成?
是。假设页面上没有足够的空白空间来容纳较长的行,您将获得页面拆分以为新数据腾出空间。逻辑顺序将与物理顺序不同,您将获得外部碎片。