1

IMHO SQL Server は、クエリに使用するのに最適なインデックスを (指示されない限り) 自分自身で選択できます。

Ok

このようなものはどうですか(疑似コード):

select __a from tbl where __a not in
 (
   select __b  from tbl 

 ) 

index_1(どちらが対象で(__a)index_2どちらが対象であるかがあるとしましょう(__b)

SQL Serverは実行時に1 つのインデックスを引き続き使用しますか、それとも複数のインデックスを一緒に使用しますか?

4

1 に答える 1

6

まず、テーブルを作成します。

USE tempdb;
GO
CREATE TABLE dbo.tbl(__a INT, __b INT);

次に、2 つのインデックスを作成します。

CREATE INDEX a_index ON dbo.tbl(__a);
CREATE INDEX b_index ON dbo.tbl(__b);

次に、いくつかのデータを入力します。

INSERT dbo.tbl(__a, __b)
  SELECT [object_id], column_id
    FROM sys.all_columns;

クエリを実行し、実際の実行計画をオンにします。はい、両方のインデックスが使用されていることを示す次のようなものが表示されます (実際、__b のインデックスは、サブクエリでのデータ取得と、行を削除するためのシークの両方に使用されます)。

ここに画像の説明を入力

クエリを作成するより効率的な方法は次のとおりです。

select __a from dbo.tbl AS t where not exists
 (
   select 1 from dbo.tbl AS t2 
     where t2.__b = t.__a
 );

これが計画全体です (ここでも、両方のインデックスが使用されていますが、操作がはるかに少ないことに注意してください)。

ここに画像の説明を入力

于 2012-04-17T18:15:54.070 に答える