共用方式為


表達式的基數估計 (CE) 意見反應

適用於:適用於: SQL Server 2025 (17.x) Azure SQL DatabaseAzure SQL 托管實例在 Microsoft Fabric 中的 SQL 資料庫

不正確的基數估計通常會在查詢優化期間造成效能不佳。 表達式的基數估算(CE)回饋會擴展由 CE 回饋功能所啟動的框架。 目標是改善重複表達式的基數估計值。 表達式的意見反應功能會從先前跨查詢的表達式執行學習,以尋找適當的 CE 模型選擇,並將學到的內容套用至這些表達式的未來執行。 如同 CE 意見反應,模型建議會自動測試並套用至未來的查詢執行。

表達式的意見反應功能會識別並使用 模型 假設,以更符合給定查詢的運算式和數據分佈,進而改善查詢執行計劃品質。 目前,表達式的反饋功能可以識別計畫操作符,這些計畫操作符的預估資料列數與實際資料列數差異很大。 當發生重大模型估計錯誤時,意見反應會套用至查詢內的表達式,而且有可行的替代模型可以嘗試。

資料庫引擎的不同版本會根據數據的散發和查詢方式,使用不同的 CE 模型假設。

針對表達式使用 CE 意見反應

運算式的 CE 意見反應會監控查詢執行,並識別持續導致基數預估錯誤的子運算式。 根據觀察到的模式產生回饋,並在查詢編譯期間應用,以提高估計準確性。

必要條件和設定

若要使用運算式的 CE 意見反應,必須符合下列先決條件:

  • 資料庫必須使用 相容性層級 160 或更新版本
  • 必須啟用資料庫範圍組態(預設值為啟用)。
  • 若要檢查資料庫範圍組態的目前狀態:
SELECT name,
       value,
       value_for_secondary
FROM sys.database_scoped_configurations
WHERE name = 'CE_FEEDBACK_FOR_EXPRESSIONS';

您可以使用下列資料庫範圍的組態指令,在資料庫上啟用此功能:

ALTER DATABASE SCOPED CONFIGURATION SET CE_FEEDBACK_FOR_EXPRESSIONS = ON;

若要停用資料庫的運算式回饋功能,請停用 CE_FEEDBACK_FOR_EXPRESSIONS 資料庫範圍設定。

ALTER DATABASE SCOPED CONFIGURATION SET CE_FEEDBACK_FOR_EXPRESSIONS = OFF;

運作方式

雖然指紋不是 SQL Server 資料庫引擎的新概念,但表達式功能意見反應內容中的 指紋 是指表達式內計算簽章的組合。 例如,虛構企業中的商務分析師可能想要取得客戶任何訂單的相關信息,這些客戶花費超過 10,000 美元。 涉及從顧客資料表收集資料並聯結至訂單資料表的 SELECT 語句,可能是檢視此類數據的一種方法:

SELECT *
FROM Customer AS C
     INNER JOIN Orders AS O
         ON C.custkey = O.o_custkey
WHERE O.o_totalprice > 10000;

針對此查詢,查詢優化器可能會選擇先從每個數據表取得數據 - Customer,然後從這兩個數據表中選取所有相關聯的數據行,並在訂單金額大於 $10,000 時,使用篩選條件來Orders數據。 查詢計劃內的每個邏輯運算式 (例如篩選器或聯結) 都會產生有助於指紋的簽章。 針對運算式的 CE 意見反應會利用這些指紋來學習,並將意見反應套用到即使整體查詢結構不同但共用類似子運算式的查詢上。

此功能著重於在查詢過程中表現出一致性基數高估或低估的運算式。 它會分析目前不符合 CE 意見反應資格的兩種不同的工作負載模式:

  • 沒有重複執行,但具有重複運算式模式的工作負載。 例如,常用的聯結模式。

  • 查詢的其中一個部分可能會受益於與相同查詢另一部分不同的 CE 模型。 例如,表格 AB 之間的結合可能需要簡單包含,而表格 CD之間的結合可能需要基本包含。

表達式功能的意見反應會套用篩選和聯結假設,以更正誤判問題,例如:

Filters:

  • ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES
  • ASSUME_PARTIAL_CORRELATION_FOR_FILTER_ESTIMATES
  • ASSUME_FULL_INDEPENDENCE_FOR_FILTER_ESTIMATES

Joins:

  • ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS
  • 基礎容器假設 (無需提供提示)

這些假設反映了不同的 CE 模型策略,例如遏制和獨立性。 如需更多概念背景,請參閱 Kate Smith 所說明的基數估計意見反應SQL Server 2016 中相互關聯資料行的基數估計

提示生命週期

意見反應提示會依序經過以下幾個狀態:

  • 監控:系統觀察子表達式的重複執行並追蹤基數錯誤估計是否持續存在。
  • 應用:如果錯誤估計持續,則可以在查詢編譯期間產生並套用意見反應提示,以調整 CE 模型。
  • 已封鎖:如果套用的提示導致基數估計值欠佳,則會封鎖它,使其無法將來使用。

此生命週期可確保僅在有益時才應用回饋,並避免估計品質回歸。

迴歸保護

運算式的 CE 意見反應包括迴歸保護。 如果提示導致基數估計值比之前更差,則會封鎖它。 不過,此保護僅限於基數估計,而且不會評估查詢執行時間。 對於執行/執行時期相關的迴歸, 自動計劃更正 可能會介入。 如果未啟用自動計劃更正功能,會記錄此功能會執行的動作,並透過查詢 sys.dm_db_tuning_recommendations 動態管理檢視來查看。

遙測和監控

可以使用下列工具監控 CE 表達式活動的意見反饋:

  • 擴展活動:
    • adhoc_ce_feedback_query_level_telemetry
    • query_adhoc_ce_feedback_expression_hint
    • query_adhoc_ce_feedback_hint

CE 意見反應擴充事件 query_ce_feedback_begin_analysisquery_ce_feedback_telemetry 也在追蹤功能的活動時很有用。

  • 指紋資料會快取在名為 AdHocCEFeedbackCache 的專用記憶體管理器中。 您可以透過系統型錄檢視 sys.dm_exec_ce_feedback_cache存取此快取。

  • 展示計劃整合

    套用關於運算式提示的 CE 回饋時,查詢計劃會在 Showplan XML 中包含屬性CardinalityFeedback 。 此標籤表示已使用意見反應來調整特定子運算式的基數估計值。

快取和持久性

持續的回饋意見會儲存在內部的查詢存放庫資料表(sys.plan_persist_ce_feedback_for_expressions),在啟動時自動重新載入。 這可確保系統不需要重新學習已遇到指紋的回饋。 快取資料保存機制本質上是有損的,這表示回饋數據只會間歇性地保存至磁碟。 目前無法設定持續性的頻率。

如果 SQL Server 執行個體在下一個持續性週期之前重新啟動或清除記憶體,則自上次排清以來產生的意見反應可能會遺失。

Limitations

持續性目前不適用於可讀取次要資料庫上的查詢存放區。 CE 回饋針對運算式,可以在主要複本和次要複本上以不同的方式應用。 不過,意見反應不會保存在次要複本上,而且只會存在於該案例中的記憶體型快取內。 如果發生容錯移轉事件,在任何可讀取的次要資料庫上學到的回饋資訊將會遺失。