Sql-Server

SQL Server 無萬用字元 LIKE 優化

  • February 16, 2021

在使用 SQL Server 2008 R2 作為後端的 Web 應用程序中,我有幾個欄位,如果存在,則將 WHERE 子句添加到查詢中。

如果我要將所有查詢生成為 like 子句,例如:

AND Uri LIKE @Uri

如果Uri包含 no %,優化器是否足夠聰明,可以將其視為WHERE Uri = @Uri還是我必須處理該應用程序端?

我意識到優化器有一天可能會從我下面改變,這有點草率,但我仍然很好奇。

範例計劃

我做了一個一次性測試,似乎表明這可能是條件的>= ... <=情況:

在此處輸入圖像描述

比。哪裡條款:

在此處輸入圖像描述

所以他們都在那個人為的索引上觸發了索引搜尋。是否與這種情況>= ... <=相同=,並且會一直發生這種情況嗎?

很可能是的,如果有適當的索引並且統計資訊是最新的,那麼查詢優化器應該能夠盡可能使用現有的索引和最佳操作(搜尋)。

您將在以下 2 篇文章中獲得詳細資訊: %Like% 運算符的索引使用 - MSDN 上的查詢調整和 SQL 性能 - myitforum.com 上的索引和 LIKE 子句。

這並不完全是一個答案,而是基於我的實際經驗。我不確定這是否是 SQL2008 R2 中的錯誤,但幾個月前我們最近從 SQL 2000 升級到 SQL 2008。幾個月後,我們從 2008 升級到 2008 R2。

在那段時間的某個地方(不確定它是否是 R2 之前的版本),我們開始收到關於長期存在、從未更新的搜尋腳本的投訴。該腳本完全符合您的要求,偶爾會出現包含無萬用字元 LIKE 呼叫的 WHERE 子句,例如:

WHERE member_id LIKE '12345'

在這個新環境中,通常需要不到一秒鐘的查詢需要接近 5-10 秒。

我對我們進行了一些優化。在這種情況下,它是一個 perl 腳本,並且不想過多地觸及業務邏輯,我能夠調整查詢字元串以將 LIKE 比較返回到相等 (=) 比較:

$where_clause =~ s/LIKE '([^%]+)'(?:\s|$)/= '$1'/gi;

該正則表達式用 = 相等子句替換被比較的字元串不包含 % 萬用字元標記的 LIKE 子句。(我還沒有對它進行詳盡的測試,但似乎有效且有意義。)

我在想,在 SQL 2000 和 SQL 2008 之間或 2008 和 2008R2 之間發生了一些變化。

引用自:https://dba.stackexchange.com/questions/2221