多列上的非集群索引 VS 单个索引中的多列

use*_*812 1 sql-server azure-sql-database

我正在向 SQL Azure DB 添加非聚集索引,我想知道在单个非聚集索引中包含多个列与在每个非聚集索引中包含一个列相比,有什么区别?

Aak*_*shM 7

与在单个非聚集索引中包含多个列与在每个非聚集索引中包含单个列相比,有什么区别?

考虑一个T具有聚集 PKId列和附加列A, B,的表C

A包含、B、 和的单个非聚集索引C可以支持以下查询的快速查找:

WHERE A > @a
WHERE A = @a AND @b1 < B AND B < @b2
WHERE A = @a AND B = @b AND C < @c
Run Code Online (Sandbox Code Playgroud)

但不是

WHERE B = @b
WHERE C = @c
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,我们不能比表扫描做得更好

但是,如果我们有多个索引,IX_AonA等:

WHERE A = @a
WHERE B = @b
WHERE C = @c
Run Code Online (Sandbox Code Playgroud)

都将从索引和复合查询中受益,例如

WHERE A = @a AND B = @b AND C < @c
Run Code Online (Sandbox Code Playgroud)

也会有一个小小的好处。