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)
是的,但不适用于您选择的索引。
如果我创建这些索引:
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)
计划更改为仅使用该索引,但鉴于有限的测试数据,很难推测性能影响。我把它留作练习超立方体 读者。
归档时间: |
|
查看次数: |
7228 次 |
最近记录: |