KB4023419 - 修正:在 2014 或之後版本中,使用 UNION ALL 和列目標查詢可能會比 2008 SQL Server SQL Server R2 慢

套用到
SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise Core - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2014 Service Pack 2 - duplicate (do not use) SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2016 Service Pack 1

症狀

當你在 Microsoft SQL Server 2014 或 2016 中查詢一個檢視時,如果與 SQL Server 2008 R2 的執行相比,查詢時間可能會長得多。

當你執行使用 UNION ALL 及列目標 ((如 TOP N 子句、FAST N 或 EXIST 謂詞) )的查詢時,若與 2008 SQL Server R2 比較,可能會發現 2014 SQL Server 或更新版本的查詢運行較慢。

原因

在 SQL Server 2008 R2 中,查詢優化器會在 UNION ALL 下改變不同部分的順序,若存在列目標,則最便宜的部分先行。 這讓查詢能在較便宜的部分產生所需列數時更早完成執行,而不必繼續執行較昂貴的部分。 這種重新排序在後續版本的 SQL Server 中不再發生。

解決方式

此問題已在以下 SQL Server 累積更新中修正:

Cumulative Update 7 for SQL Server 2016 RTM

Cumulative Update 4 for SQL Server 2016 SP1

Cumulative Update 6 for SQL Server 2014 SP2

註 此問題必須啟用查詢優化器。

欲了解更多查詢優化器與追蹤標誌的資訊,請參考以下連結:

SQL Server 查詢優化器熱修正 TF 4199 服務模型

DBCC 主控台指令與追蹤標誌

關於 SQL Server 的累積更新:

每次新的 SQL Server 累積更新都包含了之前累積更新中包含的所有熱修補與安全修補。 請查看 SQL Server 的最新累積更新:

SQL Server 2016 最新累積更新

SQL Server 2014 最新累積更新

狀態

Microsoft 已確認這是「適用對象」一節中列出的 Microsoft 產品中的問題。

參考資料

了解 Microsoft 用來說明軟體更新的術語。