共用方式為


sys.query_store_plan (Transact-SQL)

適用於: SQL Server 2016 (13.x) 以上版本 Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics

包含與查詢相關聯之每個執行計劃的相關信息。

資料行名稱 資料類型 描述
plan_id bigint 主索引鍵。
query_id bigint 外鍵。 聯結至 sys.query_store_query (Transact-SQL)
plan_group_id bigint 計劃群組的標識碼。 數據指標查詢通常需要多個(填入和擷取)計劃。 填入和擷取一起編譯的計劃位於相同的群組中。

0 表示計劃不在群組中。
engine_version nvarchar(32) 用來以 <major>.<minor>.<build>.<revision> 格式編譯計劃的引擎版本。
compatibility_level smallint 查詢中所參考資料庫的資料庫相容性層級。
query_plan_hash binary(8) 個別計劃的 MD5 哈希。
query_plan nvarchar(max) 查詢計劃的 Showplan XML。
is_online_index_plan bit 方案是在在線索引組建期間使用。

注意: Azure Synapse Analytics 一律會傳 0回 。
is_trivial_plan bit Plan 是一個微不足道的計劃(查詢優化器階段 0 中的輸出)。

注意: Azure Synapse Analytics 一律會傳 0回 。
is_parallel_plan bit 計劃是平行的。

注意: Azure Synapse Analytics 一律會傳 1回 。
is_forced_plan bit 當使用者執行預存程式 sys.sp_query_store_force_plan時,方案會標示為強制。 強制機制 不保證 此確切計劃將用於 所 query_id參考的查詢。 計劃強制會再次編譯查詢,而且通常會產生與 所 plan_id參考之計劃完全相同或類似的計劃。 如果計劃強制不成功, force_failure_count 則會遞增,並 last_force_failure_reason 填入失敗原因。

注意: Azure Synapse Analytics 一律會傳 0回 。
is_natively_compiled bit 計劃包含原生編譯的記憶體優化程式。 (0 = FALSE,1 = TRUE)。

注意: Azure Synapse Analytics 一律會傳 0回 。
force_failure_count bigint 強制此計劃失敗的次數。 只有在重新編譯查詢時,才能遞增它(而不是每次執行時)。 0每次is_plan_forcedFALSE 變更為 TRUE時,都會重設為 。

注意: Azure Synapse Analytics 一律會傳 0回 。
last_force_failure_reason int 強制計劃失敗的原因。

0:無失敗,否則導致強制失敗的錯誤錯誤號碼
3617: COMPILATION_ABORTED_BY_CLIENT
8637: ONLINE_INDEX_BUILD
8675: OPTIMIZATION_REPLAY_FAILED
8683: INVALID_STARJOIN
8684: TIME_OUT
8689: NO_DB
8690: HINT_CONFLICT
8691: SETOPT_CONFLICT
8694: DQ_NO_FORCING_SUPPORTED
8698: NO_PLAN
8712: NO_INDEX
8713: VIEW_COMPILE_FAILED
<其他值>: GENERAL_FAILURE

注意: Azure Synapse Analytics 一律會傳 0回 。
last_force_failure_reason_desc nvarchar(128) last_force_failure_reason文字描述。

COMPILATION_ABORTED_BY_CLIENT:用戶端在完成之前中止的查詢編譯
ONLINE_INDEX_BUILD:查詢會在目標數據表有在線建置的索引時嘗試修改數據
OPTIMIZATION_REPLAY_FAILED:優化重新執行腳本無法執行。
INVALID_STARJOIN:p lan 包含無效的 StarJoin 規格
TIME_OUT:優化器在搜尋強制計劃指定的計劃時超過允許的作業數目
NO_DB:方案中指定的資料庫不存在
HINT_CONFLICT:無法編譯查詢,因為計劃與查詢提示發生衝突
DQ_NO_FORCING_SUPPORTED:無法執行查詢,因為計劃與使用分散式查詢或全文檢索作業發生衝突。
NO_PLAN:查詢處理器無法產生查詢計劃,因為無法驗證強制計劃對查詢有效
NO_INDEX:計劃中指定的索引已不存在
VIEW_COMPILE_FAILED:因為計劃中所參考的索引檢視中有問題,因此無法強制查詢計劃
GENERAL_FAILURE:一般強制錯誤(未涵蓋其他原因)

注意: Azure Synapse Analytics 一律會傳 NONE回 。
count_compiles bigint 規劃編譯統計數據。
initial_compile_start_time datetimeoffset 規劃編譯統計數據。
last_compile_start_time datetimeoffset 規劃編譯統計數據。
last_execution_time datetimeoffset 上次運行時間是指查詢/計劃的最後一個結束時間。
avg_compile_duration float 以微秒為單位規劃編譯統計數據。 除以 1,000,000 以取得秒數。
last_compile_duration bigint 以微秒為單位規劃編譯統計數據。 除以 1,000,000 以取得秒數。
plan_forcing_type int 適用於: SQL Server 2017 (14.x) 和更新版本

規劃強制類型。

0: NONE
1: MANUAL
2: AUTO
plan_forcing_type_desc nvarchar(60) 適用於: SQL Server 2017 (14.x) 和更新版本

plan_forcing_type文字描述。

NONE:不強制計劃
MANUAL:規劃用戶強制
AUTO:自動調整強制規劃。
has_compile_replay_script bit 適用於:SQL Server 2022 (16.x) 和更新版本

指出計劃是否有與其相關聯的優化重新執行腳本:
0 = 沒有優化重新執行文稿(無或甚至無效)。
1 = 記錄的優化重新執行腳本。

不適用於 Azure Synapse Analytics。
is_optimized_plan_forcing_disabled bit 適用於:SQL Server 2022 (16.x) 和更新版本

指出是否已針對計劃停用優化計劃強制:
0 = 已停用。
1 = 未停用。

不適用於 Azure Synapse Analytics。
plan_type int 適用於:SQL Server 2022 (16.x) 和更新版本

方案類型。
0:已編譯的計劃
1:發送器計劃
2:查詢變體計劃

不適用於 Azure Synapse Analytics。
plan_type_desc nvarchar(120) 適用於:SQL Server 2022 (16.x) 和更新版本

計劃類型的文字描述。
編譯計劃:指出計劃是非參數敏感性計劃優化計劃
發送器計劃:指出計劃是參數敏感性計劃優化發送器計劃
查詢變體計劃:指出計劃是參數敏感性計劃優化查詢變體計劃

不適用於 Azure Synapse Analytics。

備註

啟用次要複本 查詢存放區 時,可以強制使用多個方案。

在 Azure Synapse Analytics 中,使用資料行 has_compile_replay_scriptis_optimized_plan_forcing_disabledplan_type_desc plan_type會導致Invalid Column Name錯誤,因為它們不受支援。 如需如何在 Azure Synapse Analytics 中使用的sys.query_store_plan範例,請參閱範例 B

規劃強制限制

查詢存放區 有一個機制可強制查詢優化器使用特定執行計劃。 不過,有一些限制可以防止強制執行計劃。

首先,如果計劃包含下列建構:

  • 插入大量語句
  • 外部數據表的參考
  • 分散式查詢或全文檢索作業
  • 使用彈性查詢
  • 動態或索引鍵集數據指標
  • 無效的星形聯結規格

注意

Azure SQL 資料庫 和 SQL Server 2019 和更新版本的組建版本支持強制靜態和快速向前數據指標的計劃。

其次,當計劃依賴的物件時,就無法再使用:

  • 資料庫(如果資料庫,原計劃的來源,不再存在)
  • 索引 (不再存在或停用)

最後,計劃本身的問題:

  • 查詢不合法
  • 查詢優化器超過允許的作業數目
  • 格式不正確的計劃 XML

權限

需要 VIEW DATABASE STATE 權限。

範例

A. 尋找 SQL Server 無法透過 QDS 強制計畫的原因

請注意 last_force_failure_reason_descforce_failure_count 資料列:

SELECT TOP 1000
    p.query_id,
    p.plan_id,
    p.last_force_failure_reason_desc,
    p.force_failure_count,
    p.last_compile_start_time,
    p.last_execution_time,
    q.last_bind_duration,
    q.query_parameterization_type_desc,
    q.context_settings_id,
    c.set_options,
    c.STATUS
FROM sys.query_store_plan p
INNER JOIN sys.query_store_query q
    ON p.query_id = q.query_id
INNER JOIN sys.query_context_settings c
    ON c.context_settings_id = q.context_settings_id
LEFT JOIN sys.query_store_query_text t
    ON q.query_text_id = t.query_text_id
WHERE p.is_forced_plan = 1
    AND p.last_force_failure_reason != 0;

B. 在 Azure Synapse Analytics 中檢視查詢計劃結果的查詢

使用下列範例查詢,在 Azure Synapse Analytics 的 查詢存放區 中尋找 100 個最新的執行計劃。

SELECT TOP 100
    plan_id,
    query_id,
    plan_group_id,
    engine_version,
    compatibility_level,
    query_plan_hash,
    query_plan,
    is_online_index_plan,
    is_trivial_plan,
    is_parallel_plan,
    is_forced_plan,
    is_natively_compiled,
    force_failure_count,
    last_force_failure_reason,
    last_force_failure_reason_desc,
    count_compiles,
    initial_compile_start_time,
    last_compile_start_time,
    last_execution_time,
    avg_compile_duration,
    last_compile_duration,
    plan_forcing_type,
    plan_forcing_type_desc
FROM sys.query_store_plan
ORDER BY last_execution_time DESC;