次のようなテーブル スキーマがあるとします。
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_Codes
SQL 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 行しかなく、テーブルからデータをフェッチしていないことを認識している場合でも、テーブルをクエリします。
私の実際のスキーマはもう少し複雑で、データを複数のテーブルに分割したくありません。問題は、フィルタリングされたインデックスまたはインデックス付きビューを作成して、オプティマイザーが示されているケースで使用できるようにすることは可能かということです。
関連リンク: