摘要
新增 EstimateRowsWithoutRowGoal 查詢執行計畫屬性SQL Server 2017 累積更新 3 (CU3) 及 Microsoft 2016 服務包 2 (SP2) SQL Server。
當查詢優化器估算查詢執行計畫的成本時,通常假設所有來源的合格資料列都必須被處理。 然而,有些查詢會讓查詢優化器搜尋一個能更快回傳較少列數的計畫。 如果查詢使用 TOP 子句、 FAST number_rows 查詢提示、 IN 或 EXIST 子句,或 SET ROWCOUNT { number | @number\_var } 陳述式,則可能發生這種情況。 在這種情況下,優化器在估算查詢計畫時使用了一個列目標。 若套用列目標計畫,查詢執行計畫中估計的列數會減少。 這是因為計畫假設需要處理的列數較少,才能達成列數目標。
註 用列目標來估算的其實是近似值。 如果實際的資料分布不均勻,可能比實際需要處理的資料列數還少。 因此,這可能會產生效率不佳的查詢計畫。 作為解決方法,你可以使用 USE HINT ('DISABLE_OPTIMIZER_ROWGOAL') 查詢選項或 Trace Flag 4138。
更多資訊請參閱 SQL Server 2016 中的「更新引入 USE HINT 查詢提示參數」。 然而,在複雜的查詢中,判斷是否套用了列目標,以及它對規劃選擇的影響有多大,可能會很有挑戰性。
透過使用 EstimateRowsWithoutRowGoal 屬性,你可以將結果與 EstimateRows 屬性的結果比較,看看列目標對查詢優化器估計值的影響有多大。
註 若列目標未套用於特定查詢計畫運算子,則此屬性不包含。
更多資訊
此更新包含於以下 SQL Server 累積更新中:
關於 SQL Server 的累積更新:
每次新的 SQL Server 累積更新都包含了之前累積更新中包含的所有熱修補與安全修補。 請查看 SQL Server 的最新累積更新:
SQL Server 服務包資訊
此更新包含於以下 SQL Server 服務包中:
Service Pack 2 for SQL Server 2016
Service Pack 3 for SQL Server 2014
關於 SQL Server 服務包:
Service Pack 是累積性的。 每個新版 Service Pack 都包含前一版 Service Pack 中所有的修正程式,以及任何新增的修正程式。 我們的建議是套用該服務包的最新服務包及累積更新。 所以在安裝最新版的 Service Pack 之前,您不需要安裝前一版的 Service Pack。 請使用以下文章中的表1,查詢最新服務包及最新累積更新的更多資訊。
如何確定 SQL Server 及其元件的版本、版本與更新等級
參考資料
了解 Microsoft 用來說明軟體更新的術語。