改寫 AP 時注意到 TSQL 上有使用到 LIKE _ 萬用字元,傳入參數會像是 A_____12345,所以好奇去觀察統計資訊和執行計畫,在執行計畫中注意到神奇的 operator
該 operator 竟然是 nested loop + nonclustered index seek 讀取全部 Table 資料後,卻只輸出一筆資料
仔細閱讀這 12 行 TSQL 和執行計畫後發現
- 隱含轉換:因為是 ORM 產生 TSQL 語法,沒有注意到 Table 欄位是 char,但傳入參數是 nvarchar 造成隱含轉換,四個條就有三個是隱含轉換
- 違反 SARG 原則,使用反向條件:明明條件可以寫成 [欄位 = '未結案']就好,卻要寫[欄位 <> '結案'],資料就[結案]和[未結案]這兩個狀態而已啊
修正上述兩點後,執行計畫就恢復正常
該案例只觀察統計資訊的話,大概不會想要花時間 turning,其實數據都還蠻低的