修改任何行数据片段我的聚集索引?

时间:2010-09-27 09:09:46

标签: sql sql-server indexing clustered-index fragmentation

我现在明白聚簇索引包含所有行数据,而不仅仅是索引字段。我试图理解这对碎片化的影响。

假设我们有一个这样的表:

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(或填充它)应该对聚簇索引碎片没有影响?

1 个答案:

答案 0 :(得分:1)

  

我想到的一个含义   以我天真的方式,就是这样   清除所有这些值将   创造差距,索引会   变得支离破碎。我猜行   仍然是正确的顺序,   那真的是索引碎片吗?

是。你会得到内部碎片。 SQL Server不会自动压缩数据页以回收空​​间。您可以使用SQL Internals Viewer工具查看此内容。尽管取决于您的工作量,这不一定是坏事。某种程度的内部碎片可能有助于缓解下面的内容(甚至通过使用FillFactor故意添加)

  

或者你可以考虑另一个   办法;如果他们都是空的开始   并且你插入数据,你最终   不得不将数据改组为   不同的页面,也得到索引   不成?

是。假设页面上没有足够的空白空间来容纳较长的行,您将获得页面拆分以为新数据腾出空间。逻辑顺序将与物理顺序不同,您将获得外部碎片。