SQL 查詢的最佳化規則
當 SQL 查詢最佳化發生時,會將所有最佳化規則套用至查詢中的條件,然後重新排序述詞。
AND 最佳化
如果 WHERE 子句由 AND 運算子所連接的多個述詞組成,則只有在每個述詞中使用相同的直欄及比較運算子,且比較運算子是 LIKE 或等於 (=) 時,才會進行最佳化。
AND 最佳化可接受的格式為:
where column operator expr1 AND column operator expr2 AND column operator expr3...
在此 WHERE 子句中, operator 是 LIKE 或 = only。
此格式會最佳化為 ALL 清單,如下所示:
where column operator ALL (expr1, expr2, expr3, ...)
- 範例 1
- 原始 SQL 查詢:
where Node like 'ibm' and Node like 'com'
- 範例 2
- 原始 SQL 查詢:
where Node like 'ibm' and Node like all('com','uk')
- 範例 3
- 原始 SQL 查詢:
where Node like all('ibm','com') and Node like all('uk','london')
OR 最佳化
如果 WHERE 子句由 OR 運算子所連接的多個述詞組成,則只有在每個述詞中使用相同的直欄及比較運算子,且比較運算子是 LIKE 或等於 (=) 時,才會進行最佳化。
OR 最佳化可接受的格式為:
where column operator expr1 OR column operator expr2 OR column operator expr3...
在此 WHERE 子句中, operator 是 LIKE 或 = only。
此格式會最佳化為 ANY 清單,如下所示:
where column operator ANY (expr1, expr2, expr3, ...)
- 範例 1
- 原始 SQL 查詢:
where Node like 'London' or Node like 'Copenhagen'
- 範例 2
- 原始 SQL 查詢:
where Severity = 1 or Severity = any(2,3)
- 範例 3
- 原始 SQL 查詢:
where Severity = any(1,2) or Severity = any(3,4)
重新排序述詞
最佳化工具會根據其指派的執行成本,重新排序 WHERE 子句中述詞的評估。
如果 OR 最佳化中的第一個述詞 (即最便宜的述詞) 評估為 TRUE ,則不需要評估更昂貴的述詞 (即後面的任何述詞)。 同樣地,在 AND 最佳化中,如果第一個述詞評估為 FALSE ,則不需要評估較昂貴的述詞。
從最低到最高的已指派執行成本為:
- True/False
- 整數比較
- 字串比較
- 整數 ANY/ALL/IN
- 字串 ANY/ALL/IN
- 次選取-是巢狀 SELECT 陳述式
- 範例: AND 最佳化 (a AND b AND c)
- 原始 SQL 查詢:
where Summary like 'tool' and Serial in (1, 2, 3, 4, 5) and Severity > 2
- 範例 :OR optimization (a OR b OR c)
- 原始 SQL 查詢:
where Summary like 'tool' or Serial in (1, 2, 3, 4, 5) or Severity > 2