假设我有一个这样的表模式:
Partners
桌子
ID Name
1 Test
Partners_Codes
桌子
Partner_ID Code
1 'Test_Code'
Partner_ID
我在in上也有唯一的聚集索引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;
SQL Server 优化器足够聪明,可以查看索引Partners_Codes
而不查询 Partners_Codes,这对性能很有好处。
现在假设我必须向 中添加一Active
列Partners_Codes
,因此我可以为每个设置多个代码Partner
,但只有一个代码可以是Active
。
Partners_Codes2
桌子
Partner_ID Code Active
1 'Test_Code' 1
1 'Test_Code_old1' 0
1 'Test_Code_old2' 0
我尝试了两种方法 -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
表,即使它应该知道表中只有一行或零行并且我没有从表中获取任何数据。
我的实际架构有点复杂,我不想将数据拆分为多个表。问题是 - 是否可以创建过滤索引或索引视图,以便优化器在所示情况下使用它?
相关链接: