我怎样才能得到它编译时使用OR WHERE子句中把自己分裂成两个查询与UNION查询?如果我手动改写它,使用UNION查询比单查询快100倍,因为它可以有效地联合的每个查询使用不同的指标。有没有什么办法可以让优化器使用这种方法?

我有一个查询,看起来是这样的:

select columnlist
from table1
join table2 on joincond2
join table3 on joincond3
where conditions1 
    and ((@param1 is null and cond3a) or (cond3b))

其中columnlist,joincond2,joincond3,和条件1都是长表达式。踢球者是,只有在OR的条件之一是有史以来真。

我第一次想到自己可能只是重写它做了工会,但后来我反复columnlist,joincond2,joincond3和条件1,这是20行左右的SQL可能需要大量的维护的未来。是否有一个提示我可以提供或者一些更好的方式来写WHERE子句?由于事先。

有帮助吗?

解决方案

可以组

select columnlist
from table1
join table2 on joincond2
join table3 on joincond3

成的图,然后使用联合。

但是如果能够迁移到SQL2005 / 8, 可以使用公用表表达式。

with cte ( columnlist )
as (
    select columnlist
    from table1
    join table2 on joincond2
    join table3 on joincond3 )
select columnlist from cte where ...
union
select columnlist from cte where ...

其他提示

尝试增加OPTION(RECOMPILE)到查询中。如果是在一个存储过程,然后用RECOMPILE添加到这一点。这可能是因为您运行查询SQL Server中的第一次来了一个计划,并将其缓存,但随后通过它的第二次仍然使用旧的(现在差)查询计划。

您将需要一个较小命中,因为它需要重新编译每次使用查询时,却会在比较中使用一个贫穷的计划是微不足道的。

编辑:我读过,在SQL 2000的存储过程使用WITH RECOMPILE并不总是正常工作。该bug据称是固定在SQL 2005年我从来没有遇到过的bug个人了,所以我不知道确切的交易是做什么用。试试看吧,虽然。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top