可能是一个奇怪的标题,但我会试着表达我的困境。
非聚集索引与三列(即FirstName
,LastName
和BirthDate
)之间的真正区别是什么,并覆盖索引,其中我们有两个索引列( FirstName
和LastName
)以及一个包含的专栏BirthDate
?
使用一种类型相比其他类型的性能提升吗?当我们更新BirthDate
列中的值时,两种索引类型中发生了什么?
使用干净的非群集覆盖索引获得/失去的是什么,而在两个索引中,我们在索引中都有三个值,而无需从页面文件中获取额外的任务来获取数据。
索引结构有区别吗?
也许问题太宽泛,但问题很简单。
答案 0 :(得分:5)
区别在于: included 列不能用于限制返回的行 - 例如它们不能用在WHERE
子句中(因为它们不是索引导航树的一部分 - 它们只包括 - 顾名思义 - 在索引的叶级上)。
另一方面:由于它们不是导航结构的一部分,它们也不会使你的索引膨胀 - 它们可能大于最大值。索引条目限制为900字节。因此,如果您有大列(例如VARCHAR(MAX)
或大型二进制列),那些永远不会被索引 - 但它们可以包含在叶级别上索引
PS:正如@gotqn在这篇关于这个问题的评论中所指出的 - 这是关于SQL Server中索引的所有内容的一篇非常好的,广泛的,写得很好的系列文章:
SQL Server Central: Stairway to SQL Server Indexes
强烈推荐!