SQL查询性能说明

时间:2012-09-19 16:25:57

标签: sql sql-server sql-optimization database-optimization

我有这个查询(当然有几个连接跨表和一些视图,为简单起见,我会称之为x)。

  1. 案例1:select * from x - > 10秒后返回,仍然可以接受, 相当重的联接和大量数据
  2. 案例2:select * from x where userid = 1 - >在0-1秒后返回,
  3. 案例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子句的查询上。 :

  4. 案例4:使用SP:if @userid = -1 select * from x option (recompile) else select * from x where userid = @userid
  5. 有任何解释吗?

    我之前可以猜测它是使用基于查询的优化而没有where子句,即使对于where子句的查询,但为什么呢?

1 个答案:

答案 0 :(得分:1)

存储过程缓存执行计划,因此每次调用SP时,它们都不会有重新编译查询的开销。在使用存储过程进行事务时,这一点尤其重要。当查询运行几秒钟时,它就不那么重要了。

当查询获取参数时,存储过程必须决定要优化的值。我猜你的SQL Server认为这两个查询是相同的,并且正在为它们使用相同的缓存计划。它是基于第一个查询优化计划。这是猜测,但它可以解释你所看到的。

您可以使用以下版本的查询轻松解决此问题:

select *
from x
where @userid = -1 or userid = @userid
option (recompile)