2015-09-10 107 views
1

查詢這樣的東西時性能有差別嗎?T-SQL條件查詢

查詢1:

SELECT * FROM Customer WHERE Name=Name 

查詢2:

SELECT * FROM Customer 

我將用它在條件選擇所有

SELECT * FROM Customer 
WHERE Name = CASE WHEN @QueryAll='true' THEN Name ELSE @SearchValue END 

如果沒有性能問題在查詢1和2,我認爲這是這個短代碼:

IF @QueryAll='true' 
    SELECT * FROM Customer 
ELSE 
    SELECT * FROM Customer WHERE [email protected] 
+2

注:如果'Name'是空的,第三個查詢不會返回其中'Name'是空行。另外,請閱讀wild的[catch-all queries article]中的sql。(http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/) –

回答

4

您應該閱讀Erland Sommarskog的Dynamic Search Conditions in T‑SQL

如果你使用SQL Server 2008或更高版本,然後使用OPTION(RECOMPILE),寫這樣的查詢:

SELECT * 
FROM Customer 
WHERE 
    (Name = @SearchValue OR @QueryAll='true') 
OPTION (RECOMPILE); 

我通常通過NULL@SearchValue表明此參數應該被忽略,而不是使用單獨的參數@QueryAll。在本公約中查詢成爲本:

SELECT * 
FROM Customer 
WHERE 
    (Name = @SearchValue OR @SearchValue IS NULL) 
OPTION (RECOMPILE); 

編輯

詳情參見上面的鏈接。總之,OPTION(RECOMPILE)指示SQL Server在每次運行時重新編譯查詢的執行計劃,而SQL Server將而不是緩存生成的計劃。重新編譯還意味着任何變量的值都有效地內聯到查詢中,並且優化器知道它們。

所以,如果@SearchValueNULL,優化器是足夠聰明的生成計劃,如果查詢是這樣的:

SELECT * 
FROM Customer 

如果@SearchValue具有非NULL值「ABC」,優化器是足夠聰明到生成的計劃,如果查詢是這樣的:

SELECT * 
FROM Customer 
WHERE (Name = 'abc') 

OPTION(RECOMPILE)明顯的缺點是增加了對重新編譯(一般在幾百毫秒),如果你運行它可以是顯著的開銷經常查詢。

+0

Hi @Vladimir Baranov,What會是我第一個問題的答案嗎? – janmvtrinidad

+0

對不起,我不太瞭解這個問題。如果Name可以是NULL,那麼Query1和Query2可能會產生不同的結果,因此它的性能不存在問題。如果您不使用'OPTION(RECOMPILE)',Query3可能意外地比Query4慢。實際上,如果Name可以是NULL,Query3也可能產生與Query4不同的結果。所以,最好不要使用這種風格('WHERE Name = Name')。 –

+0

嗨@Vladimir Baranov,我會用OPTION(RECOMPILE)與你的第二個查詢。我使用sql2008r2。你能總結一下OPTION(RECOMPILE)的用法嗎?謝謝! – janmvtrinidad