我有这个查询(当然还有跨表的几个连接和一些视图,为了简单起见,我将它们称为 x)。
- 案例 1:
select * from x
-> 在 10 秒内返回,仍然可以接受,连接和大量数据相当繁重 - 案例2:
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 秒内返回。现在,参数屏蔽 OR WITH RECOMPILE on sp OR OPTION (recompile) on query with where 子句没有帮助,使 SP 运行得更快的
userid = something
原因是将 OPTION(recompile) 放在 SP 的第一部分,即在没有 where 的查询上条款。:- 案例 4:使用 SP:
if @userid = -1 select * from x option (recompile) else select * from x where userid = @userid
有什么解释吗?
我可以猜到它使用基于查询的优化而没有 where 子句,即使是带有 where 子句的查询,但这是为什么呢?