星期日, 5月 30, 2021

[SQL] Like - 萬用字元

改寫 AP 時注意到 TSQL 上有使用到 LIKE _ 萬用字元,傳入參數會像是 A_____12345,所以好奇去觀察統計資訊和執行計畫,在執行計畫中注意到神奇的 operator

該 operator 竟然是 nested loop + nonclustered index seek 讀取全部 Table 資料後,卻只輸出一筆資料
仔細閱讀這 12 行 TSQL 和執行計畫後發現
  • 隱含轉換:因為是 ORM 產生 TSQL 語法,沒有注意到 Table 欄位是 char,但傳入參數是 nvarchar 造成隱含轉換,四個條就有三個是隱含轉換
  • 違反 SARG 原則,使用反向條件:明明條件可以寫成 [欄位 = '未結案']就好,卻要寫[欄位 <> '結案'],資料就[結案]和[未結案]這兩個狀態而已啊
修正上述兩點後,執行計畫就恢復正常

該案例只觀察統計資訊的話,大概不會想要花時間 turning,其實數據都還蠻低的
 
修正前修正後
關鍵 Table Logical Read56810
CPU Time281ms0ms

關鍵 operator:[讀取的資料列數] 從 244,679 降低為 743,743 就是未結案資料
執行計畫成本差異

沒有留言:

張貼留言