我有这个查询(当然有几个连接跨表和一些视图,为简单起见,我会称之为x)。
select * from x
- > 10秒后返回,仍然可以接受,
相当重的联接和大量数据select * from x where userid = 1
- >在0-1秒后返回,
案例3:使用SP:if @userid = -1 select * from x else select
from x where userid = @userid
- >现在用参数用户ID 1调用sp应该在0-1秒返回,因为它应该与情况2相当,但实际上它返回
10
秒
现在,sp OR OPTION上的参数屏蔽或WITH RECOMPILE
(重新编译)查询与where子句没有帮助,是什么使得
使用userid = something
SP运行得更快将OPTION(重新编译)
在SP的第一部分,即在没有where子句的查询上。 :
if @userid = -1 select * from x option
(recompile) else select * from x where userid = @userid
有任何解释吗?
我之前可以猜测它是使用基于查询的优化而没有where子句,即使对于where子句的查询,但为什么呢?
答案 0 :(得分:1)
存储过程缓存执行计划,因此每次调用SP时,它们都不会有重新编译查询的开销。在使用存储过程进行事务时,这一点尤其重要。当查询运行几秒钟时,它就不那么重要了。
当查询获取参数时,存储过程必须决定要优化的值。我猜你的SQL Server认为这两个查询是相同的,并且正在为它们使用相同的缓存计划。它是基于第一个查询优化计划。这是猜测,但它可以解释你所看到的。
您可以使用以下版本的查询轻松解决此问题:
select *
from x
where @userid = -1 or userid = @userid
option (recompile)