假设我有一个包含 A、B、C、D 和 E 列的表 Foo。它们都是整数。让我们假设有一百万条记录,并且我们在 SQL Server 2017 上。
存在以下索引:
create Nonclustered index IX_Foo on Foo ([A], [B]) include ([C], [D], [E])
如果我运行以下查询:
Select A, B, C, D, E from Foo where A = 1 and B = 2
此查询是否会触发 Foo 中的键查找,因为 A 和 B 未包含在索引的包含列表中,或者 SQL Server 会意识到 A 和 B 位于键本身中并避免键查找?
1M多一点的简单测试
数据
该数据集不是真实世界的数据集,因为除了一条记录外,所有其他记录都是相同的。
行数
询问
没有密钥查找
这是正常的,因为考虑到查询和数据集,这个索引是完美的。
键列 <> 包含列
键列和包含列之间的主要区别在于,这些键列按 [A] --> [B] (B-Tree) 排序,而其他列 [C]、[D]、[E] 未排序(叶级)。
因此,仅在 [A] 上查找是可能的,在 [AB] 上查找也是可能的,但是如果使用索引,仅在 [B] 上查找将创建一个剩余谓词。
此外
某些数据类型无法添加到键列,但可以包含(除 、 和 之外的所有
text
数据ntext
类型image
)更多信息
作为不同查询的结果发生的键查找示例
获得 [A] 的关键查找发生了,但它不是很昂贵(一行)。