SQL 查詢的最佳化規則

當 SQL 查詢最佳化發生時,會將所有最佳化規則套用至查詢中的條件,然後重新排序述詞。

AND 和 OR 最佳化,以及述詞的重新排序會套用至 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'
最佳化查詢:
where Node like all('ibm','com')
範例 2
原始 SQL 查詢:
where Node like 'ibm' and Node like all('com','uk')
最佳化查詢:
where Node like all('ibm','com','uk')
範例 3
原始 SQL 查詢:
where Node like all('ibm','com') and Node like all('uk','london')
最佳化查詢:
where Node like all('ibm','com','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'
最佳化查詢:
where Node like any('London', 'Copenhagen')
範例 2
原始 SQL 查詢:
where Severity = 1 or Severity = any(2,3)
最佳化查詢:
where Severity = any(1,2,3)
範例 3
原始 SQL 查詢:
where Severity = any(1,2) or Severity = any(3,4)
最佳化查詢:
where Severity = any(1,2,3,4)

重新排序述詞

最佳化工具會根據其指派的執行成本,重新排序 WHERE 子句中述詞的評估。

如果 OR 最佳化中的第一個述詞 (即最便宜的述詞) 評估為 TRUE ,則不需要評估更昂貴的述詞 (即後面的任何述詞)。 同樣地,在 AND 最佳化中,如果第一個述詞評估為 FALSE ,則不需要評估較昂貴的述詞。

從最低到最高的已指派執行成本為:
  1. True/False
  2. 整數比較
  3. 字串比較
  4. 整數 ANY/ALL/IN
  5. 字串 ANY/ALL/IN
  6. 次選取-是巢狀 SELECT 陳述式
範例: AND 最佳化 (a AND b AND c)
原始 SQL 查詢:
where Summary like 'tool' and Serial in (1, 2, 3, 4, 5) and Severity > 2 
最佳化的重新排序查詢:
where Severity > 2 and Summary like 'tool' and Serial in (1, 2, 3, 4, 5)
範例 :OR optimization (a OR b OR c)
原始 SQL 查詢:
where Summary like 'tool' or Serial in (1, 2, 3, 4, 5) or Severity > 2
最佳化的重新排序查詢:
where Severity > 2 or Summary like 'tool' or Serial in (1, 2, 3, 4, 5)