怎麼樣善用索引增加查詢效率呢?很重要的就是使用 SARGAble 的查詢語法!
使用索引的提示
- 索引使用到的欄位應盡量的少,可減少 Insert, Update, Delete 和 Merge 指令調整索引導致的效能影響,以及使用的磁碟空間。
- 索引適合建立在常讀取,但不常增修的大量資料表。增進讀取的效能,並減少寫入的效能影響。
- 檢視 (View) 能應用索引加速嗎 ? 如果包含資料表連接 (Join)、彙總函數 (ex. SUM),使用索引可以增進讀取的效能。
- 盡量一次 (指令) 就完成 Insert 或 Update,減少更新整體索引的次數。
- 使用 SARGAble 的查詢語法,以有效的利用索引。
使用 SARGAble 查詢條件
SARGAble 是 Search ARGument ABLE 的縮寫,意思是「可以用索引尋找」。
SARGAble 運算子包含 =
, >
, <
, >=
, <=
, BETWEEN
, LIKE
, IS \[NOT\] NULL
, IN
等。
另外還有效果不那麼大的運算子: <>
, NOT
, NOT IN
, NOT LIKE
…,因可能導致掃描整個索引,導致和掃描整個資料表沒有差異太多。
使用函數、運算式和 LIKE
前方使用 %
查詢,不能滿足 SARGAble 的條件,舉例如下:
WHERE name LIKE '%Alice%'
WHERE SQRT(length) = 5.0
WHERE First + Last = Fullname
查詢條件不滿足 SARGAble,會導致查詢速度變慢,因為:
- 增加 CPU 計算量。
- 掃描所有索引。
- 隱性轉換。
- 糟糕的基數預測結果。
- 產生不合適的執行計畫。
改善查詢效能的原則
以下列出一些常見的原則:
- 避免在查詢時呼叫函數 (Function),減少計算的成本;若在
WHERE
條件加入函數,將無法使用索引取得資料。 - 避免在
WHERE
加入<>
,因為需要掃描整個索引。 - 避免在
LIKE
條件的一開始使用%
萬用字元,導致掃描整個索引。 - 連接表格的欄位,應該加入至索引欄位。
- 減少不必要的排序、聚合動作,因為會增加大量的計算成本。
- 盡可能使用預存程序,節省重新編譯查詢的時間,以及傳輸 SQL 指令的頻寬。
最後是個人的調整心得與延伸閱讀!SQL Server 效能搶救 (7) 改進查詢效能的心得、延伸閱讀 – Lazy Coding