2017-05-31 59 views
0

对于“可选”参数,where子句中的ISNULL与NULL OR是否存在显着的性能差异?例如:SQL可选参数 - 性能差异

实施例1:

SELECT * FROM tblEmployees WHERE (@EmployeeID IS NULL OR EmployeeID = @EmployeeID); 

实施例2:

SELECT * FROM tblEmployees WHERE EmployeeID = ISNULL(@EmployeeID, EmployeeID); 

我认为第二种方法是更可读的,但好奇,如果有一个的性能损失采用第二种方法与第一种方法。

+0

查询计划在SQL Server中是一样的,我记得Oracle对待它的方式不同。 – hardkoded

+1

正如所写的,在@ EmployeeID不为null的情况下,两者都会阻止索引查找。如果您添加'OPTION(RECOMPILE)' –

+0

,那么可以避免使用这两种方法来避免这种查询的性能问题并非您选择实现条件的不同方式,而是查询计划的兑现,提供了一组参数,但对另一组参数可能会很糟糕。这是捕获所有查询的一个众所周知的问题。众所周知,有很多关于它的博客文章。 –

回答

0

例3:

IF @EmployeeID IS NULL 
    SELECT * FROM tblEmployees 
ELSE 
    SELECT * FROM tblEmployees WHERE EmployeeID = @EmployeeID; 
+0

我应该更具体。我指的是可能有多个可选参数的SELECT ...用于搜索屏幕上的实例。 SELECT * FROM tblEmployees WHERE(@EmployeeID IS NULL或EmployeeID = @EmployeeID)AND(@EmployeeFirstName IS NULL或EmployeeFirstName = @EmployeeFirstName)。很明显,我不希望有一堆IF ELSE在这种情况下有不同的查询。 – user2966445

0

,如果你的搜索将是非常少用甚至介质中使用,那么你的查询是否正确。

SELECT * FROM tblEmployees WHERE (@EmployeeID IS NULL OR EmployeeID = @EmployeeID); 

or 

SELECT * FROM tblEmployees WHERE EmployeeID = ISNULL(@EmployeeID, EmployeeID); 

而且这两个查询都会以类似的方式执行。

  • 因为它是非常东部维护。
  • 这将是编译每

不要使用聚结时间。

但如果搜索命中非常高或有很多表连接或涉及的数据量都非常高

然后使用动态SQL和使用sp_executesql的。

+0

而不是动态SQL只需调用两个单独的过程之一。 – LoztInSpace