我有两个表,我们称它们为 TableA 和 TableB。
TableA TableB
------ ------
ID ID
Date Date
Foo Bar
两个表的日期字段都有一个索引。现在,我想创建一个视图,该视图在 Date 字段上的两个表之间具有完整的外部联接,以显示Foo
该日期(如果有的话)的值以及该日期的值Bar
。
create view vFooBar as
select isnull(a.Date, b.Date) Date, a.Foo, b.Bar
from TableA a
full outer join TableB b on a.Date = b.Date
然后我运行一个查询:
select * from vFooBar where Date = '20141201'
这行得通......但是编译器合并a.Date
并b.Date
欺骗编译器不使用索引,我得到了一个涉及表扫描的可怕执行计划。
如何以查询它仍将使用我的索引的方式创建此视图?
尝试这个
严格来说,上面的查询在重复项方面与原始完全连接的语义并不完全相同。full join的一个正确的转换是left join union all anti-semi-join:
第二次重写还将有助于在
TheDate
列上使用索引。