我正在学习索引以及在使用非键列和键列时出现的关于数据库/索引碎片的问题。
CREATE INDEX IX_Persons_Name ON Persons (LastName, FirstName)
vs
CREATE INDEX IX_Persons_Name ON Persons (LastName) INCLUDE (FirstName)
非键列如何影响索引的碎片?在上述简单场景中将它用作关键列是否更好?
答案 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列。数据,然后再次检查碎片。本质上,在更新之前,非聚集索引中叶级别的数据打包得与窄数据一样紧密。当更新发生时,这些叶级别页面上没有空间来保持新的宽值,因此页面拆分发生并且碎片化了。