sp_query_store_set_hints(Transact-SQL)

적용 대상: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed Instance

지정된 query_id 대한 쿼리 저장소 힌트를 만들거나 업데이트합니다.

Transact-SQL 구문 표기 규칙

구문

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

인수

[ @query_id = ] query_id

sys.query_store_query 쿼리 저장소 query_id입니다. @query_id 대단합니다.

[ @query_hints = ] N'query_hints'

으로 'OPTION시작하는 쿼리 옵션의 문자열입니다. @query_hints nvarchar(max)입니다. 자세한 내용은 이 문서의 지원되는 쿼리 힌트를 참조하세요.

[ @query_hint_scope = ] 'replica_group_id'

기본적으로 새 쿼리 저장소 힌트의 범위는 로컬 복제본입니다. @query_hint_scope 작은입니다. 이 선택적 매개 변수는 보조 복제본에 대한 쿼리 저장소를 사용할 때 보조 복제본에 힌트가 적용되는 범위를 결정합니다 . 선택적 query_hint_scope 인수는 기본적으로 로컬 복제본(주 복제본 또는 보조 복제본)으로만 설정되지만 필요에 따라 sys.query_store_replicas 참조하는 replica_group_id 지정할 수 있습니다.

반환 값

0 (성공) 또는 1 (실패).

설명

힌트는 유효한 T-SQL 문자열 형식 N'OPTION (..)'에서 지정됩니다.

  • 특정 query_id 대한 쿼리 저장소 힌트가 없으면 새 쿼리 저장소 힌트가 만들어집니다.
  • 특정 query_id 대한 쿼리 저장소 힌트가 이미 있는 경우 제공된 마지막 값은 연결된 쿼리에 대해 이전에 지정한 값을 재정의합니다.
  • 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 ] )

현재 지원되지 않는 쿼리 힌트는 다음과 같습니다.

사용 권한

데이터베이스에 대한 ALTER 권한이 필요합니다.

쿼리 저장소에서 쿼리 식별

다음 예제에서는 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 qt
INNER JOIN sys.query_store_query 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로 식별되었습니다.

단일 힌트 적용

다음 예제에서는 쿼리 저장소에서 식별된 대로 query_id 39에 RECOMPILE 힌트를 적용합니다.

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

다음 예제에서는 쿼리 저장소에서 식별된 레거시 카디널리티 추정기를query_id 39로 강제 적용하는 힌트를 적용합니다.

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

여러 힌트 적용

다음 예제에서는 RECOMPILE, MAXDOP 1 및 SQL 2012 쿼리 최적화 프로그램 동작을 포함하여 query_id 39에 여러 쿼리 힌트를 적용합니다.

EXEC 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, 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(Transact-SQL) 시스템 저장 프로시저를 사용하여 query_id 39에서 힌트를 제거합니다.

EXEC sys.sp_query_store_clear_hints @query_id = 39;

다음 단계