0

我有以下两条 SQL 语句

第一:

IF(@User_Id IS NULL)  
BEGIN  
      SELECT *
      FROM [UserTable]
END  
ELSE           
BEGIN                  
      SELECT *
   FROM  [UserTable] AS u
   WHERE  u.[Id] = @User_Id                  
END 

第二个:

SELECT  *
FROM [UserTable] AS u
WHERE (@User_Id IS NULL OR u.[Id] = @User_Id)

这两个查询都将包装在它自己的存储过程中。我怀疑 IF 语句会导致大量的 SQL 重新编译。我面临着要么将 IF 语句的每个部分分成自己的存储过程,要么用 WHERE 子句替换整个 IF 语句(如上图的第二个 SQL 语句所示)

我的问题是:从性能角度来看,这两条语句有什么区别,SQL 将如何处理每条语句?

谢谢。

4

1 回答 1

0

两种解决方案都将生成相同数量的编译。

查询优化器的第一个解决方案可以自由地为两个不同的查询中的每一个提出最佳计划。第一个查询(在 IF 的 NULL 分支上)没有太多可以优化的地方,但是如果Id列上存在索引,则可以优化第二个查询(在 ID 的 NOT NULL 分支上)。

但第二种解决方案是一场优化灾难。无论@User_Id参数的值如何,优化器都必须提出一个适用于任何参数值的计划。因此,无论 的值如何@User_Id,该计划都将始终使用次优表扫描。没有办法解决这个问题,而且这不是某些人可能认为的参数嗅探。只是计划的正确性,即使计划生成时的值不是NULL,即使参数为NULL,计划也必须工作,所以它不能使用索引。Id

总是,总是,总是,使用带有显式的第一种形式IF

于 2010-11-04T18:05:59.960 回答