[SQL SERVER]提高FullScan效能

誰說Like '%rico%'沒辦法使用IndexSeek。

去年我在SQL PASS分享如何提高FullScan效能,Relational Database大致上最有效的方法就是強制使用平行計畫(參考[SQL SERVER]讓一般使用者執行DBCC TraceON),但資料量小且多核心環境下,要留意不正當平行操作的效能影響,另一方法我個人是使用NoSQL Database來改善,現實世界中,系統有時無可避免FullScan,好比使用者要求 Like ‘%12%’之類的查詢,所以前端我會判斷使用者所輸入欄位並決定要使用那個資料庫(SQL Server or NoSQL Database)。

這篇我來分享如何讓Like ‘%12%’這類的語法使用index seek,當然如你有聽過我去年在SQL PASS效能調校分享的話,我這方法其實真的很簡單。

 

針對以下TSQL建立正確nonclustered index

SELECT c1, c2, AString

FROM dbo.BigTestLIKE

WHERE AString LIKE '%98%';

create index idx1 ON dbo.BigTestLIKE(AString);

(70000 個資料列受到影響)

掃描計數 3,邏輯讀取 12058

CPU 時間 = 1093 ms,經過時間 = 1439 ms

因為B-tree先天限制,所以執行計畫使用索引掃描是可以預期並理解,那有沒有辦法使用索引搜尋呢?

答案是有的,而且方法很簡單。

 

修改TSQL

SELECT c1, c2, AString

FROM dbo.BigTestLIKE

WHERE AString LIKE '%98%' and AString>''

(70000 個資料列受到影響)

資料表 'BigTestLIKE'。掃描計數 1,邏輯讀取 6725

CPU 時間 = 797 ms,經過時間 = 1075 ms

 

增加條件 AString>'' 讓其符合SARG格式,執行計畫則使用索引搜尋並大大降低I/O,效能調校就是這樣簡單。