5

次のようなテーブル スキーマがあるとします。

Partnersテーブル

ID      Name
1       Test

Partners_Codesテーブル

Partner_ID   Code
1            'Test_Code'

Partner_ID私はまた、ユニークなクラスタ化されたインデックスを持っていますPartners_Codes:

create unique clustered index IX_Partners_Codes on Partners_Codes (Partner_ID);

さて、次のようなクエリを実行すると:

select
    P.ID, P.Name
from dbo.Partners as P
    left outer join dbo.Partners_Codes as PC on PC.Partner_ID = P.ID;

Partners_CodesSQL Server オプティマイザは、Partners_Codes に対してクエリを実行せずにインデックスを確認できるほどスマートであり、これによりパフォーマンスが向上します。

ここで、 にActive列を追加する必要があるとしますPartners_Codes。そのため、それぞれに多くのコードをPartner含めることができますが、このコードの 1 つだけを にすることができますActive

Partners_Codes2 テーブル

Partner_ID    Code               Active
1             'Test_Code'             1
1             'Test_Code_old1'        0
1             'Test_Code_old2'        0

私が試した2つのアプローチがあります-フィルターされたインデックスを使用するActive = 1か、このビューでビューと一意のインデックスを作成します:

create table Partners_Codes2 (Partner_ID int, Code nvarchar(128), Active bit);

create view vw_Partners_Codes2
with schemabinding
as
  select
      Partner_ID, Code
  from dbo.Partners_Codes2
  where Active = 1;

create unique clustered index IX_vw_Partners_Codes2 on vw_Partners_Codes2 (Partner_ID);

create table Partners_Codes3 (Partner_ID int, Code nvarchar(128), Active bit);
create unique clustered index IX_Partners_Codes31 on Partners_Codes3 (Partner_ID, Code);
create unique nonclustered index IX_Partners_Codes32 on Partners_Codes3 (Partner_ID) include(Code, Active) where (Active = 1);

しかし、どちらのアプローチでも、SQL Server オプティマイザーはPartners_Codes、テーブルに 1 行または 0 行しかなく、テーブルからデータをフェッチしていないことを認識している場合でも、テーブルをクエリします。

私の実際のスキーマはもう少し複雑で、データを複数のテーブルに分割したくありません。問題は、フィルタリングされたインデックスまたはインデックス付きビューを作成して、オプティマイザーが示されているケースで使用できるようにすることは可能かということです。

sql fiddle demo

関連リンク:

4

1 に答える 1