考虑以下
declare @flag bit = 1
select *
from a
left join b
on a.id = b.id
and @flag = 0
理想情况下,我可能将其分解为两个存储过程:一个用于@flag为真,另一个用于何时为假。但是,在我的情况下,有一个大规模的查询,我只是希望对我可以找到一些低成果的地方进行一些快速优化。
显然我的想法是,在某些条件下,我不会浪费时间加入表b,但这不是SQL的工作方式。有没有其他方法可以进行这种优化,或者将其分解为多个触发器,无论是否使用连接都是实现此目的的唯一方法?
答案 0 :(得分:1)
我已经在AdventureWorks数据库上测试了你的方法,它运行正常。查看IO,SQL执行表的0次读取。
我要做的关键是将OPTION (RECOMPILE)
添加到查询的末尾,因为SQL可能会在缓存中重用不适当的计划。