共用方式為


sys.sp_query_store_set_hints(Transact-SQL)

適用於: SQL Server 2022 (16.x) 及後版本 Azure SQL Database AzureSQL Managed InstanceMicrosoft Fabric 中的 SQL 資料庫

為指定的query_id建立或更新 查詢存放區 提示

Transact-SQL 語法慣例

Syntax

sp_query_store_set_hints
    [ @query_id = ] query_id ,
    [ @query_hints = ] 'query_hints'
    [ , [ @replica_group_id = ] 'replica_group_id' ]
[ ; ]

Arguments

Important

擴充預存程式的自變數必須依特定順序輸入,如 語法 一節所述。 如果參數依序輸入,就會發生錯誤訊息。

[ @query_id = ] query_id

query_idsys.query_store_query中的 查詢存放區 數據行。

@query_id是 bigint

[ @query_hints = ] N'query_hints'

查詢選項的字元字串,開頭為 OPTION @query_hints為 nvarchar(max)

自變數中包含 USE HINT@query_hints,必須重複個別提示名稱周圍的單引號。 例如: @query_hints = N'OPTION (MAXDOP = 1, USE HINTS (''ENABLE_QUERY_OPTIMIZER_HOTFIXES'',''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_150''))'

如需詳細資訊,請參閱 支援的查詢提示

[ @replica_group_id = ] 「replica_group_id

這個選擇性參數會決定啟用 可讀取次要複本查詢存放區 時,提示套用至次要複本的範圍。 @replica_group_id是 bigint。 自 SQL Server 2025(17.x)及以後版本起,以及 Azure SQL 資料庫,支援次要副本的查詢儲存庫。 欲獲得完整的平台支援,請參閱 查詢商店中的次要副本

@replica_group_id自變數預設為本機複本(主要或次要複本),但您可以選擇性地指定符合 replica_group_id行中值的值,以設定不同複本群組的提示。

返回值

0 (成功) 或 1 (失敗)。

Remarks

提示會以有效的 T-SQL 字串格式 N'OPTION (..)'指定。

  • 如果特定 @query_id沒有任何查詢存放區提示存在,則會建立新的查詢存放區提示。
  • 如果特定 @query_id已有查詢存放區提示存在,則針對 @query_hints 指定的值會取代先前指定之相關聯查詢的提示。
  • 如果 query_id 不存在,就會引發錯誤。

如果其中一個提示會防止產生查詢計劃,則會忽略所有提示。 如需失敗詳細資料的詳細資訊,請參閱 sys.query_store_query_hints

若要移除與 query_id相關聯的提示,請使用系統預存程式 sys.sp_query_store_clear_hints

支持的查詢提示

這些查詢提示支援為 查詢存放區 提示:

{ HASH | ORDER } GROUP
  | { CONCAT | HASH | MERGE } UNION
  | { LOOP | MERGE | HASH } JOIN
  | EXPAND VIEWS
  | FAST number_rows
  | FORCE ORDER
  | IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX
  | KEEP PLAN
  | KEEPFIXED PLAN
  | MAX_GRANT_PERCENT = percent
  | MIN_GRANT_PERCENT = percent
  | MAXDOP number_of_processors
  | NO_PERFORMANCE_SPOOL
  | OPTIMIZE FOR UNKNOWN
  | PARAMETERIZATION { SIMPLE | FORCED }
  | RECOMPILE
  | ROBUST PLAN
  | USE HINT ( '<hint_name>' [ , ...n ] )

目前不支援下列查詢提示:

  • OPTIMIZE FOR ( @var = val)
  • MAXRECURSION
  • USE PLAN(相反,請考慮 查詢存放區 的原始計劃強制能力,sp_query_store_force_plan)。
  • DISABLE_DEFERRED_COMPILATION_TV
  • DISABLE_TSQL_SCALAR_UDF_INLINING
  • 資料表提示(例如、FORCESEEKREADUNCOMMITTEDINDEX

Permissions

需要資料庫的 ALTER 權限。

Examples

在查詢資料存放區識別查詢

下列範例會查詢sys.query_store_query_text和sys.query_store_query,以傳回所執行查詢文字片段的query_id。

在此範例中,我們嘗試微調的 SalesLT 查詢位於範例資料庫中:

SELECT *
FROM SalesLT.Address AS A
     INNER JOIN SalesLT.CustomerAddress AS CA
         ON A.AddressID = CA.AddressID
WHERE PostalCode = '98052'
ORDER BY A.ModifiedDate DESC;

查詢存放區不會立即反映其系統檢視表的查詢資料。

識別查詢存放區系統目錄檢視中的查詢:

SELECT q.query_id,
       qt.query_sql_text
FROM sys.query_store_query_text AS qt
     INNER JOIN sys.query_store_query AS q
         ON qt.query_text_id = q.query_text_id
WHERE query_sql_text LIKE N'%PostalCode =%'
      AND query_sql_text NOT LIKE N'%query_store%';
GO

在下列範例中,資料庫中先前的 SalesLT 查詢範例會識別為 query_id 39。

套用單一提示

下列範例會將 RECOMPILE 提示套用至 query_id 39,如查詢存放區中所識別:

EXECUTE sys.sp_query_store_set_hints
    @query_id = 39,
    @query_hints = N'OPTION(RECOMPILE)';

下列範例會套用提示,強制舊版基數估算器query_id 39,如 查詢存放區 所示:

EXECUTE sys.sp_query_store_set_hints
    @query_id = 39,
    @query_hints = N'OPTION(USE HINT(''FORCE_LEGACY_CARDINALITY_ESTIMATION''))';

套用多個提示

下列範例會將多個查詢提示套用至 query_id 39,包括 RECOMPILEMAXDOP 1和相容性層級 110 中的查詢優化器行為:

EXECUTE sys.sp_query_store_set_hints
    @query_id = 39,
    @query_hints = N'OPTION(RECOMPILE, MAXDOP 1, USE HINT(''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_110''))';

檢視 查詢存放區 提示

下列範例會傳回現有的 查詢存放區 提示:

SELECT query_hint_id,
       query_id,
       replica_group_id,
       query_hint_text,
       last_query_hint_failure_reason,
       last_query_hint_failure_reason_desc,
       query_hint_failure_count,
       source,
       source_desc
FROM sys.query_store_query_hints
WHERE query_id = 39;

從查詢中移除提示

使用下列範例,使用 sp_query_store_clear_hints 系統預存程式,從 query_id 39 移除提示。

EXECUTE sys.sp_query_store_clear_hints @query_id = 39;