天天看點

SQL Server-聚焦WHERE Column = @Param OR @Param IS NULL有問題?前言

上一篇我們講完SQL動态查詢,本節我們繼續來講解SQL動态查詢中存在的問題。

當我們建立存儲過程調用存儲過程時,若篩選條件有值則過濾,沒有值則傳回所行記錄,類似如下查詢:

這樣查詢會存在什麼問題呢?性能會不會有問題呢,這個是我們本節需要深入探讨的問題。

接下來我們建立如下測試表并插入測試資料,如下:

對于動态SQL條件篩選過濾我們利用WHERE 1 = 1來拼接。接下來我們使用一般SQL語句和動态查詢并比較其IO,如下:

SQL Server-聚焦WHERE Column = @Param OR @Param IS NULL有問題?前言
SQL Server-聚焦WHERE Column = @Param OR @Param IS NULL有問題?前言

我們能夠看到動态SQL查詢邏輯讀取隻讀取2次,而另外一般SQL語句查詢邏輯讀取7次,同時我們看到SQL動态查詢計劃執行的是索引查找,而一般SQL語句則是索引掃描。

看來執行一般SQL語句不會走索引查找,将導緻性能問題,在開頭我們就講過篩選條件有值則過濾,無值則查詢所有資料,那麼我們完全可以借助ISNULL來查詢,下面我們用ISNULL來改變一般語句篩選條件,看看是否會走索引查找呢?

SQL Server-聚焦WHERE Column = @Param OR @Param IS NULL有問題?前言
SQL Server-聚焦WHERE Column = @Param OR @Param IS NULL有問題?前言

我們看到結果依然是走索引掃描,沒有任何改變。是不是就沒有解決之道了呢?我們來改變一般SQL語句查詢方式,如下:

如上隻能是勉勉強強解決了問題,因為隻是針對一個參數,如果有多個參數要進行IF...ELSE..,那可就傻逼了。從本質上解決這個問題我們需要利用可選項重新編譯。如下:

SQL Server-聚焦WHERE Column = @Param OR @Param IS NULL有問題?前言
SQL Server-聚焦WHERE Column = @Param OR @Param IS NULL有問題?前言
當利用條件篩選過濾資料時,如果條件有值則過濾,否則傳回所有行記錄。如果執行一般SQL語句和動态SQL,那麼動态SQL會走索引查找,而一般SQL語句将導緻索引掃描,此時需要加上OPTION(RECOMPILE)才走索引查找。 本文轉自Jeffcky部落格園部落格,原文連結:http://www.cnblogs.com/CreateMyself/p/8280460.html,如需轉載請自行聯系原作者