この質問は以前に尋ねられた可能性がありますが、この用語で検索したところ、「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 も同様です。
プランの下部は、以下のクエリ用です。
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)
はい。ただし、選択したインデックスではできません。
これらのインデックスを作成すると:
CREATE INDEX ix_top ON #ab (col1a) INCLUDE (colb);
CREATE INDEX ix_bottom ON #ab (colb, col1a);
私は戻ってきます この計画 :
そして、それは multiple index hints を使用する必要がないことです。
少し異なるインデックスで:
CREATE INDEX ix_mindyourbusinessypercube ON #ab (col1a, colb);
計画 は、その1つのインデックスのみを使用するように変更しますが、テストデータが限られているため、パフォーマンスの影響を推測することは困難です。私はそれを演習として残します イパーキューブ 読者。