2017-05-31 76 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