Sql server 非聚集索引中包含的列如何影响索引碎片?

Sql server 非聚集索引中包含的列如何影响索引碎片?,sql-server,indexing,Sql Server,Indexing,我正在学习索引,在使用非键列和键列时,会出现一个关于数据库/索引碎片的问题 CREATE INDEX IX_Persons_Name ON Persons (LastName, FirstName) vs CREATE INDEX IX_Persons_Name ON Persons (LastName) INCLUDE (FirstName) 非键列如何影响索引的分段?在上述简单场景中,将其用作键列是否更好?简而言之,是的。这完全取决于include列的性质。我刚刚进行了以下测试: crea

我正在学习索引,在使用非键列和键列时,会出现一个关于数据库/索引碎片的问题

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

非键列如何影响索引的分段?在上述简单场景中,将其用作键列是否更好?

简而言之,是的。这完全取决于include列的性质。我刚刚进行了以下测试:

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');
创建表FragTest(ID int,SID int,data varchar(500));
插入FragTest(ID、SID、数据)
从dbadmin.dbo.Numbers中选择Number,Number,'a'

where Number我看不出一个包含的列如何/为什么会对碎片有任何影响。从我在互联网上阅读的理解来看,应该不会对碎片有任何影响,但我只是在学习索引,我想我可能遗漏了一些东西。谢谢你的评论!我推荐这本书,简单易读,清晰实用:谢谢你的建议。我来看看。