这个问题之前可能已经被问过,但我尝试使用“SQL Server 是否可以对同一查询使用两个索引”这个术语进行搜索,但没有产生任何结果。
假设您有以下查询:
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)
这是执行计划,也是粘贴计划链接。
计划的底部用于以下查询:
Select col1a from #ab
group by col1a
having count (distinct colb)>1
计划的表扫描/顶部部分用于以下查询:
select col1a,colb
from #ab
where col1a in (
问题:
如果我有如下索引:
create index nic_toppart on #ab(Col1a,colb)
它会被选为计划的顶部吗?
总之,我的意思是:
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)
是的,但不是您选择的索引。
如果我创建这些索引:
我收回了这个计划:
这无需使用多个索引提示。
索引略有不同:
该计划更改为仅使用一个索引,尽管鉴于有限的测试数据很难推测性能影响。我把它作为练习留给
超立方体读者。