sys.sp_query_store_set_hints(Transact-SQL)
적용 대상: SQL Server 2022(16.x) Azure SQL 데이터베이스 Azure SQL Managed Instance
지정된 query_id 대한 쿼리 저장소 힌트를 만들거나 업데이트합니다.
구문
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 ] )
현재 지원되지 않는 쿼리 힌트는 다음과 같습니다.
OPTIMIZE FOR ( @var = val)
MAXRECURSION
USE PLAN
(대신 쿼리 저장소 원래 계획 강제 기능 sp_query_store_force_plan 고려).DISABLE_DEFERRED_COMPILATION_TV
DISABLE_TSQL_SCALAR_UDF_INLINING
- 테이블 힌트(예: FORCESEEK, READUNCOMMITTED, INDEX)
사용 권한
데이터베이스에 대한 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로 식별되었습니다.
단일 힌트 적용
다음 예제에서는 쿼리 저장소 식별된 대로 RECOMPILE 힌트를 query_id 39에 적용합니다.
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 시스템 저장 프로시저를 사용하여 query_id 39에서 힌트를 제거합니다.
EXEC sys.sp_query_store_clear_hints @query_id = 39;