Sql server 列组上的SQL Server索引不';t在单个列搜索中表现不佳

Sql server 列组上的SQL Server索引不';t在单个列搜索中表现不佳,sql-server,performance,indexing,Sql Server,Performance,Indexing,我在一组列上有一个非聚集索引,如(a,b,c,d),我已经使用了一个常见的查询来使用这个索引,该查询在where子句中搜索这四个列 另一方面,当我尝试搜索列(a)时,只需使用: select count(*) from table where a = value select count(*) from table where d = value 这里的性能很好,执行计划显示它使用了我的索引 但当我试图通过简单地使用以下命令来搜索列(d): select count(*) from

我在一组列上有一个非聚集索引,如
(a,b,c,d)
,我已经使用了一个常见的查询来使用这个索引,该查询在where子句中搜索这四个列

另一方面,当我尝试搜索列
(a)
时,只需使用:

select count(*) 
from table 
where a = value
select count(*) 
from table 
where d = value
这里的性能很好,执行计划显示它使用了我的索引

但当我试图通过简单地使用以下命令来搜索列
(d)

select count(*) 
from table 
where a = value
select count(*) 
from table 
where d = value
这里的性能很差,执行计划已经使用了相同的索引,但它显示了缺少索引的提示,影响为98%,建议为列(d)创建新索引

只是为了测试,我尝试在这个专栏上创建新的索引,性能变得非常好

我不想停留在冗余索引中,因为这个表非常庞大(30GB),它有大约1亿行

知道为什么我的主索引在所有列中都表现不好吗

数据类型为INT的列

d列数据类型为TINYINT

SQL Server版本为2014企业版

谢谢


Abed

如果在4列(A、B、C、D)上有复杂索引,则可以使用以下查询:

1) WHERE A=...
2) WHERE A=... AND B =...
3) WHERE A=... AND B =... AND C=....
3) WHERE A=... AND B =... AND C=.... AND D=...
如果要进行如下筛选,则不能跳过索引的前导部分:
其中B=。。。和C=。。。D=…
(因此,跳过A)性能将很差


尝试在每个列上创建单独的索引,它们更灵活。

如果您有一个按姓氏排序的人员列表,然后按给定的姓名排序,那么您如何使用该列表来统计具有给定姓名的人员的数量
Damien
?只有在查询筛选最左边的
n
列(
n
介于1和索引中的列数之间)时,索引才有用。复合索引(由多列组成)仅在您的选择中包含最左边的n列时才有用;您的索引将适用于(a,b)、(a,b,c)或(a,b,c,d),但它无法帮助您仅使用(d)列进行查询。这就是复合索引的工作方式谢谢,现在很清楚列组上的索引是如何工作的,但我之所以在列组上使用索引,而不使用单独的索引,是因为索引中包含另外5列,并在select子句中用作返回值,现在我想创建单独的索引不会像包含列的组索引那样执行。有什么建议吗?你可以保留你的复杂索引。(A、B、C、D)。除此之外,还要在(A)、(B)、(C)、(D)上创建其他4个索引。只需注意在表中插入,更新这些列将花费更多的时间。此外,这将需要更多的存储和RAM空间!