NONCLUSTERED INDEX中包含的列如何影响索引碎片?

时间:2015-12-30 09:47:29

标签: sql-server indexing

我正在学习索引以及在使用非键列和键列时出现的关于数据库/索引碎片的问题。

CREATE INDEX IX_Persons_Name ON Persons (LastName, FirstName)
vs
CREATE INDEX IX_Persons_Name ON Persons (LastName) INCLUDE (FirstName)

非键列如何影响索引的碎片?在上述简单场景中将它用作关键列是否更好?

1 个答案:

答案 0 :(得分:1)

简而言之,是的。这一切都取决于包含列的性质。我刚刚进行了以下测试:

create table FragTest (ID int, SID int, data varchar(500));

insert into FragTest (ID, SID, data)
select Number, Number, 'a' from dbadmin.dbo.Numbers
where Number <= 1000000;

create unique clustered index CIX on FragTest (ID);
create index IX on FragTest (SID) include (data);

select * from sys.dm_db_index_physical_stats(
   db_id(), 
   object_id('dbo.FragTest'), 
   null, null, 'detailed');

update dbo.FragTest set data = replicate('a', 500);

select * from sys.dm_db_index_physical_stats(
   db_id(), 
   object_id('dbo.FragTest'), 
   null, null, 'detailed');

所以从本质上讲,我创建了一个表,并使用&#34; narrow&#34;填充了varchar列。数据,检查碎片,用&#34;宽&#34;更新varchar列。数据,然后再次检查碎片。本质上,在更新之前,非聚集索引中叶级别的数据打包得与窄数据一样紧密。当更新发生时,这些叶级别页面上没有空间来保持新的宽值,因此页面拆分发生并且碎片化了。