2017年10月4日 星期三

[SQL] Compare Operator - where String Scalar Function

  • Scalar Function (純量函數)
    • 輸入單一個參數值,並回傳單一個值的函數稱為 Scalar Function
    • Scalar Function 若與 "非鍵值資料行" 進行運算,完全不影響 "索引" 的 "執行計畫"
    • 但 "鍵值資料行" 進行運算,會產生顯著的影響
  • sql 使用 where 下列使否影響查詢成本
    • RTrim(String)
    • LTrim(String)
  • 資料庫使用 Adventure Works for SQL Server 2012 的資料表 Production.Product 
    • Step 1. 加入 NonClustered 包含 Name 
    • Step 2. 查詢
select * from Production.Product where Name = 'Spokes'
select * from Production.Product where RTrim(Name) = 'Spokes'
select * from Production.Product where LTrim(Name) = 'Spokes'
    • Step 3. 查詢結果
      • 查詢 1:基本且標準使用精確值比對篩選,當然可以使用 "索引搜尋" 
      • 查詢 2:RTrim 為處理 Name 右邊空白的字元,因 RTrim 運算前,不知 Name 裡所儲存的值為何,因此需 "掃描" 逐筆資料,經過函數運算後再進行比對
      • 查詢 3:同查詢 2,且 LTrim 需要處理更多的資訊,因此成本更高
    • Result:
      1. RTrim 與 LTrim 字串函數查詢,只能使用 "掃描",因此引響查詢效率
      2. 索引的 "鍵值資料行" 經過 "純量函數" 運算,就失去使用 "搜索",只能使用 "掃描",因需每筆資料都經過函數運算並比對,才能決定是否符合條件
  • REF:
    • SQL Server 效能調校

沒有留言:

張貼留言