新基數估算器中的聯結內含專案假設會降低查詢效能
當您使用新的基數估算器編譯查詢時,本文可協助您解決 SQL Server 2014 和更新版本中可能發生的效能問題。
原始產品版本:SQL Server
原始 KB 編號: 3189675
徵兆
請參考下列案例:
- 您使用的是 SQL Server 2014 或更新版本。
- 您可以執行包含聯結和非聯結篩選述詞的查詢。
- 您可以使用新的 基數估計 (SQL Server) (New CE) 編譯查詢。
在此案例中,您會遇到查詢效能降低的情況。
如果您使用舊版 CE 編譯查詢,就不會發生此問題。
原因
從 SQL Server 2014 中,針對資料庫相容性層級 120 和更新版本引進了新的基數估算器 (New CE)。 當查詢優化器估計不同運算符和述詞的基數時,新 CE 會從模型中的舊版 CE 變更數個假設。
其中一項變更與聯結內含專案假設相關。
舊版 CE 模型假設使用者一律查詢存在的數據。 這表示,對於牽涉到兩個數據表之等聯結作業的聯結述詞而言,聯結數據行存在於聯結的兩端。 在聯結數據表上存在其他非聯結篩選述詞時,舊版 CE 會假設聯結述詞和非聯結篩選述詞有某種程度的相互關聯。 這個隱含的相互關聯稱為簡單內含專案。
或者,新的 CE 會使用基底內含專案作為相互關聯。 新的 CE 模型假設使用者可能會查詢不存在的數據。 這表示個別數據表上的篩選述詞可能不會彼此相互關聯。 因此,我們使用概率方法。
針對許多實際案例,使用基底內含專案假設可建立更佳的估計值。 這反過來又會建立更有效率的查詢計劃選擇。 不過,在某些情況下,使用簡單內含專案假設可能會提供更好的結果。 如果發生這種情況,當您使用新的 CE 而非舊版 CE 時,可能會遇到較不有效率的查詢計劃選擇。
如需如何針對新 CE 相關問題進行疑難解答的詳細資訊,請參閱 從 SQL Server 2012 或更早版本升級至 2014 或更新版本之後降低查詢效能。
解決方法
在 SQL Server 2014 和更新版本中,您可以使用 追蹤旗標 9476 來強制 SQL Server 使用簡單內含專案假設,而不是預設的基底內含項目假設。 如果您可以修改應用程式查詢,更好的選項是在 SQL Server 2016 (13.x) SP1 之後使用查詢提示 ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS
。 如需詳細資訊,請參閱 USE HINT。 例如:
SELECT * FROM Table1 t1
JOIN Table2 t2
ON t1.Col1 = t2.Col1
WHERE Col1 = 10
OPTION (USE HINT ('ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS'));
啟用此追蹤旗標或使用查詢提示可能會改善查詢計劃選擇,而不需要完全還原為舊版 CE 模型,如果下列條件成立:
- 您遇到次佳查詢計劃選擇,導致包含聯結和非聯結篩選述詞之查詢的整體效能降低。
- 您可以在「聯結基數」估計中確認顯著不明確(也就是實際與估計的數據列數目明顯不同)。
- 當您使用舊版 CE 編譯查詢時,這個不一致。
您可以在全域、工作階段層級或查詢層級啟用此追蹤旗標。
注意
使用追蹤旗標不正確可能會降低工作負載效能。 如需詳細資訊,請參閱 提示 (Transact-SQL) - 查詢。