web-dev-qa-db-ja.com

SQL Serverは同じクエリに複数のインデックスを使用できますか?

この質問は以前に尋ねられた可能性がありますが、この用語で検索したところ、「SQL Serverは同じクエリに対して2つのインデックスを使用できますか?」という結果になりませんでした。

次のクエリがあるとします。

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)

これは実行計画であり、 Paste The Plan link も同様です。

NUTS

プランの下部は、以下のクエリ用です。

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を使用できますか

これは可能ですか?

私のテストでは、選択できるのは1つだけであることを示しています。

以下はテストデータです。不明な点があればお知らせください。

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)
5
TheGameiswar

はい。ただし、選択したインデックスではできません。

これらのインデックスを作成すると:

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

CREATE INDEX ix_bottom ON #ab (colb, col1a);

私は戻ってきます この計画

NUTS

そして、それは multiple index hints を使用する必要がないことです。

少し異なるインデックスで:

CREATE INDEX ix_mindyourbusinessypercube ON #ab (col1a, colb);

計画 は、その1つのインデックスのみを使用するように変更しますが、テストデータが限られているため、パフォーマンスの影響を推測することは困難です。私はそれを演習として残します イパーキューブ 読者。

NUTS

9
Erik Darling