SQL Server 可以对同一个查询使用多个索引吗?

The*_*war 5 performance index sql-server query-performance

这个问题以前可能有人问过,但我尝试用“SQL Server 是否可以对同一查询使用两个索引”这一术语进行搜索,但没有产生任何结果。

假设您有以下查询:

select col1a,colb
from #ab
where col1a in (
Select col1a from #ab 
group by col1a 
having count (distinct colb)>1)
Run Code Online (Sandbox Code Playgroud)

你有以下索引:

create index nci on #ab(colb)
include(col1a)
Run Code Online (Sandbox Code Playgroud)

这是执行计划,以及粘贴计划链接

坚果

计划的底部用于以下查询:

Select col1a from #ab 
group by col1a 
having count (distinct colb)>1
Run Code Online (Sandbox Code Playgroud)

表扫描/计划的顶部用于以下查询:

select col1a,colb
from #ab
where col1a in (
Run Code Online (Sandbox Code Playgroud)

题:

如果我有如下索引:

create index nic_toppart on #ab(Col1a,colb)
Run Code Online (Sandbox Code Playgroud)

它会被选为计划的顶部吗?

总之,我的意思是:

SQL Server 可以使用索引nci对计划的部分/底部进行分组,并将索引nic_toppart用于计划的顶部吗

这可能吗?

我的测试表明它只能选择一个。

下面是测试数据。如果我不清楚,请告诉我。

create table #ab
(
col1a int,
colb char(2)
)

insert into #ab
values
(1,'a'),
(1,'a'),
(1,'a'),
(2,'b'),
(2,'c'),
(2,'c')

select col1a,colb
from #ab
where col1a in (
Select col1a from #ab 
group by col1a 
having count (distinct colb)>1)


create index nci on #ab(colb)
include(col1a)

create index nci_p on #ab(col1a,colb)
Run Code Online (Sandbox Code Playgroud)

Eri*_*ing 9

是的,但不适用于您选择的索引。

如果我创建这些索引:

CREATE INDEX ix_top ON #ab (col1a) INCLUDE (colb);

CREATE INDEX ix_bottom ON #ab (colb, col1a);
Run Code Online (Sandbox Code Playgroud)

我拿回了这个计划

坚果

而且无需使用多个索引提示

索引略有不同:

CREATE INDEX ix_mindyourbusinessypercube ON #ab (col1a, colb);
Run Code Online (Sandbox Code Playgroud)

计划更改为仅使用该索引,但鉴于有限的测试数据,很难推测性能影响。我把它留作练习超立方体 读者。

坚果