쿼리 힌트(Transact-SQL)
적용 대상:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric의 SQL 분석 엔드포인트
Microsoft Fabric의 Warehouse
Microsoft Fabric의 SQL 데이터베이스
쿼리 힌트는 표시된 힌트가 쿼리 범위에서 사용되도록 지정합니다. 문의 모든 연산자에게 영향을 미칩니다.
UNION
주 쿼리에 포함된 경우 UNION
작업과 관련된 마지막 쿼리에만 OPTION
절이 있을 수 있습니다. 쿼리 힌트는 OPTION 절일부로 지정됩니다. 하나 이상의 쿼리 힌트로 인해 쿼리 최적화 프로그램이 유효한 계획을 생성하지 않는 경우 오류 8622가 발생합니다.
주의
SQL Server 쿼리 최적화 프로그램은 일반적으로 쿼리에 대해 최적의 실행 계획을 선택하므로 힌트는 숙련된 개발자나 데이터베이스 관리자가 최후의 수단으로만 사용하는 것이 좋습니다.
적용 대상:
구문론
<query_hint> ::=
{ { HASH | ORDER } GROUP
| { CONCAT | HASH | MERGE } UNION
| { LOOP | MERGE | HASH } JOIN
| DISABLE_OPTIMIZED_PLAN_FORCING
| EXPAND VIEWS
| FAST <integer_value>
| FORCE ORDER
| { FORCE | DISABLE } EXTERNALPUSHDOWN
| { FORCE | DISABLE } SCALEOUTEXECUTION
| IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX
| KEEP PLAN
| KEEPFIXED PLAN
| MAX_GRANT_PERCENT = <numeric_value>
| MIN_GRANT_PERCENT = <numeric_value>
| MAXDOP <integer_value>
| MAXRECURSION <integer_value>
| NO_PERFORMANCE_SPOOL
| OPTIMIZE FOR ( @variable_name { UNKNOWN | = <literal_constant> } [ , ...n ] )
| OPTIMIZE FOR UNKNOWN
| PARAMETERIZATION { SIMPLE | FORCED }
| QUERYTRACEON <integer_value>
| RECOMPILE
| ROBUST PLAN
| USE HINT ( <use_hint_name> [ , ...n ] )
| USE PLAN N'<xml_plan>'
| TABLE HINT ( <exposed_object_name> [ , <table_hint> [ [ , ] ...n ] ] )
| FOR TIMESTAMP AS OF '<point_in_time>'
}
<table_hint> ::=
{ NOEXPAND [ , INDEX ( <index_value> [ , ...n ] ) | INDEX = ( <index_value> ) ]
| INDEX ( <index_value> [ , ...n ] ) | INDEX = ( <index_value> )
| FORCESEEK [ ( <index_value> ( <index_column_name> [ , ... ] ) ) ]
| FORCESCAN
| HOLDLOCK
| NOLOCK
| NOWAIT
| PAGLOCK
| READCOMMITTED
| READCOMMITTEDLOCK
| READPAST
| READUNCOMMITTED
| REPEATABLEREAD
| ROWLOCK
| SERIALIZABLE
| SNAPSHOT
| SPATIAL_WINDOW_MAX_CELLS = <integer_value>
| TABLOCK
| TABLOCKX
| UPDLOCK
| XLOCK
}
<use_hint_name> ::=
{ 'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS'
| 'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES'
| 'ASSUME_FULL_INDEPENDENCE_FOR_FILTER_ESTIMATES'
| 'ASSUME_PARTIAL_CORRELATION_FOR_FILTER_ESTIMATES'
| 'DISABLE_BATCH_MODE_ADAPTIVE_JOINS'
| 'DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK'
| 'DISABLE_DEFERRED_COMPILATION_TV'
| 'DISABLE_INTERLEAVED_EXECUTION_TVF'
| 'DISABLE_OPTIMIZED_NESTED_LOOP'
| 'DISABLE_OPTIMIZER_ROWGOAL'
| 'DISABLE_PARAMETER_SNIFFING'
| 'DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK'
| 'DISABLE_TSQL_SCALAR_UDF_INLINING'
| 'DISALLOW_BATCH_MODE'
| 'ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS'
| 'ENABLE_QUERY_OPTIMIZER_HOTFIXES'
| 'FORCE_DEFAULT_CARDINALITY_ESTIMATION'
| 'FORCE_LEGACY_CARDINALITY_ESTIMATION'
| 'QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n'
| 'QUERY_PLAN_PROFILE'
}
논증
{ HASH | ORDER } GROUP
쿼리의 GROUP BY
또는 DISTINCT
절에서 설명하는 집계가 해시 또는 순서 지정을 사용하도록 지정합니다.
- 일반적으로 해시 기반 알고리즘은 크거나 복잡한 그룹화 집합을 포함하는 쿼리의 성능을 향상시킬 수 있습니다.
- 일반적으로 정렬 기반 알고리즘은 작거나 간단한 그룹화 집합을 포함하는 쿼리의 성능을 향상시킬 수 있습니다.
{ MERGE | HASH | CONCAT } UNION
모든 UNION
작업은 UNION
집합을 병합, 해시 또는 연결하여 실행되도록 지정합니다. 둘 이상의 UNION
힌트가 지정된 경우 쿼리 최적화 프로그램은 지정된 힌트에서 가장 저렴한 전략을 선택합니다.
- 일반적으로 병합 기반 알고리즘 작업은 정렬된 입력을 포함하는 쿼리의 성능을 향상시킬 수 있습니다.
- 일반적으로 해시 기반 알고리즘은 정렬되지 않거나 큰 입력을 포함하는 쿼리의 성능을 향상시킬 수 있습니다.
- 일반적으로 연결 기반 알고리즘은 고유하거나 작은 입력을 포함하는 쿼리의 성능을 향상시킬 수 있습니다.
{ LOOP | MERGE | HASH } JOIN
모든 조인 작업이 전체 쿼리에서 LOOP JOIN
, MERGE JOIN
또는 HASH JOIN
수행되도록 지정합니다. 둘 이상의 조인 힌트를 지정하는 경우 최적화 프로그램은 허용되는 조인 전략 중에서 가장 저렴한 조인 전략을 선택합니다.
특정 테이블 쌍에 대해 동일한 쿼리의 FROM
절에 조인 힌트를 지정하면 이 조인 힌트가 두 테이블의 조인에 우선합니다. 하지만 쿼리 힌트는 여전히 적용되어야 합니다. 테이블 쌍에 대한 조인 힌트는 쿼리 힌트에서 허용되는 조인 메서드의 선택만 제한할 수 있습니다. 자세한 내용은 조인 힌트참조하세요.
DISABLE_OPTIMIZED_PLAN_FORCING
적용 대상: SQL Server(SQL Server 2022(16.x)부터)
쿼리에 강제 최적화된 계획을 사용하지 않도록 설정합니다.
최적화된 계획 강제 실행은 강제 쿼리를 반복하기 위한 컴파일 오버헤드를 줄입니다. 쿼리 실행 계획이 생성되면 최적화 재생 스크립트로 다시 사용할 수 있는 특정 컴파일 단계가 저장됩니다. 최적화 재생 스크립트는 쿼리 저장소의 압축된 실행 계획 XML의 일부로 숨겨진 OptimizationReplay
특성에 저장됩니다.
보기 확장
인덱싱된 뷰가 확장됨을 지정합니다. 또한 쿼리 최적화 프로그램은 인덱싱된 뷰를 쿼리 파트의 대체 항목으로 간주하지 않음을 지정합니다. 뷰 정의가 쿼리 텍스트의 뷰 이름을 바꾸면 보기가 확장됩니다.
이 쿼리 힌트는 사실상 쿼리 계획의 인덱싱된 뷰에서 인덱싱된 뷰 및 인덱스를 직접 사용할 수 없습니다.
메모
쿼리의 SELECT
부분에 뷰에 대한 직접 참조가 있는 경우 인덱싱된 뷰는 압축된 상태로 유지됩니다.
WITH (NOEXPAND)
지정하거나 WITH (NOEXPAND, INDEX( <index_value> [ , *...n* ] ) )
경우 뷰도 압축된 상태로 유지됩니다. 쿼리 힌트 NOEXPAND
대한 자세한 내용은 NOEXPAND 사용하세요.
힌트는 INSERT
, UPDATE
, MERGE
및 DELETE
문의 뷰를 포함하여 문의 SELECT
부분의 뷰에만 영향을 줍니다.
FAST integer_value
쿼리가 첫 번째 integer_value 행 수를 빠르게 검색할 수 있도록 최적화되도록 지정합니다. 이 결과는 음수가 아닌 정수입니다. 첫 번째 integer_value 개수의 행이 반환되면 쿼리는 실행을 계속하고 전체 결과 집합을 생성합니다.
FORCE ORDER
쿼리 최적화 중에 쿼리 구문으로 표시된 조인 순서가 유지되도록 지정합니다.
FORCE ORDER
사용하면 쿼리 최적화 프로그램의 역할 반전 동작에 영향을 주지 않습니다.
FORCE ORDER
쿼리에 지정된 조인 순서를 유지하므로 복잡한 조인 조건 또는 힌트가 포함된 쿼리의 성능 또는 일관성이 향상될 수 있습니다.
메모
MERGE
문에서는 WHEN SOURCE NOT MATCHED
절을 지정하지 않는 한 대상 테이블 앞에 기본 조인 순서로 원본 테이블에 액세스합니다.
FORCE ORDER
지정하면 이 기본 동작이 유지됩니다.
{ FORCE | DISABLE } EXTERNALPUSHDOWN
Hadoop에서 정규식 계산의 푸시다운을 강제 또는 사용하지 않도록 설정합니다. PolyBase를 사용하는 쿼리에만 적용됩니다. Azure Storage로 푸시다운하지 않습니다.
{ FORCE | DISABLE } SCALEOUTEXECUTION
SQL Server 2019 빅 데이터 클러스터외부 테이블을 사용하는 PolyBase 쿼리의 스케일 아웃 실행을 강제 또는 사용하지 않도록 설정합니다. 이 힌트는 SQL 빅 데이터 클러스터의 마스터 인스턴스를 사용하는 쿼리에서만 적용됩니다. 스케일 아웃은 빅 데이터 클러스터의 컴퓨팅 풀에서 발생합니다.
계획 유지
임시 테이블에 다시 컴파일 임계값을 변경하고 영구 테이블의 임계값과 동일하게 만듭니다. 예상 다시 컴파일 임계값은 다음 문 중 하나를 실행하여 테이블에 인덱싱된 열의 예상 변경 횟수가 변경될 때 쿼리에 대한 자동 다시 컴파일을 시작합니다.
UPDATE
DELETE
MERGE
INSERT
KEEP PLAN
지정하면 테이블에 여러 업데이트가 있을 때 쿼리가 자주 다시 컴파일되지 않습니다.
KEEPFIXED 플랜
통계 변경으로 인해 쿼리 최적화 프로그램이 쿼리를 다시 컴파일하지 않도록 합니다.
KEEPFIXED PLAN
지정하면 기본 테이블의 스키마가 변경되거나 해당 테이블에 대해 sp_recompile
실행되는 경우에만 쿼리가 다시 컴파일됩니다.
IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX
적용: SQL Server(SQL Server 2012(11.x)부터)
쿼리가 비클러스터형 메모리 최적화 columnstore 인덱스를 사용하지 못하도록 합니다. columnstore 인덱스를 사용하지 않도록 쿼리 힌트와 columnstore 인덱스를 사용하기 위한 인덱스 힌트가 쿼리에 포함된 경우 힌트가 충돌하고 쿼리가 오류를 반환합니다.
MAX_GRANT_PERCENT = <numeric_value>
적용: SQL Server(SQL Server 2012(11.x) 서비스 팩 3부터, SQL Server 2014(12.x) 서비스 팩 2 및 Azure SQL Database.
구성된 메모리 제한의 PERCENT
최대 메모리 부여 크기입니다. 쿼리가 사용자 정의 리소스 풀에서 실행되는 경우 쿼리가 이 제한을 초과하지 않도록 보장됩니다. 이 경우 쿼리에 필요한 최소 메모리가 없으면 시스템에서 오류가 발생합니다. 쿼리가 시스템 풀(기본값)에서 실행 중인 경우 실행하는 데 필요한 최소 메모리를 가져옵니다. 리소스 관리자 설정이 이 힌트에 지정된 값보다 낮으면 실제 한도가 낮을 수 있습니다. 유효한 값은 0.0에서 100.0 사이입니다.
인덱스 만들기 또는 인덱스 다시 작성에는 메모리 부여 힌트를 사용할 수 없습니다.
MIN_GRANT_PERCENT = <numeric_value>
적용: SQL Server(SQL Server 2012(11.x) 서비스 팩 3부터, SQL Server 2014(12.x) 서비스 팩 2 및 Azure SQL Database.
구성된 메모리 제한의 PERCENT
최소 메모리 부여 크기입니다. 쿼리를 시작하는 데 적어도 필요한 메모리가 필요하기 때문에 쿼리가 MAX(required memory, min grant)
보장됩니다. 유효한 값은 0.0에서 100.0 사이입니다.
min_grant_percent 메모리 부여 옵션은 크기에 관계없이 sp_configure
옵션(쿼리당 최소 메모리(KB))을 재정의합니다. 인덱스 만들기 또는 인덱스 다시 작성에는 메모리 부여 힌트를 사용할 수 없습니다.
MAXDOP <integer_value>
적용: SQL Server(SQL Server 2008(10.0.x)부터) 및 Azure SQL Database.
sp_configure
최대 병렬 처리 수준 구성 옵션을 재정의합니다. 또한 이 옵션을 지정하는 쿼리에 대한 Resource Governor를 재정의합니다.
MAXDOP
쿼리 힌트는 sp_configure
구성된 값을 초과할 수 있습니다.
MAXDOP
Resource Governor로 구성된 값을 초과하면 데이터베이스 엔진은 ALTER WORKLOAD GROUP설명된 Resource Governor MAXDOP
값을 사용합니다.
MAXDOP
쿼리 힌트를 사용하는 경우 최대 병렬 처리 수준 구성 옵션과 함께 사용되는 모든 의미 체계 규칙이 적용됩니다. 자세한 내용은 최대 병렬 처리 수준 서버 구성 옵션구성을 참조하세요.
경고
MAXDOP
0으로 설정된 경우 서버는 최대 병렬 처리 수준을 선택합니다.
MAXRECURSION <integer_value>
이 쿼리에 허용되는 최대 재귀 횟수를 지정합니다. 숫자 0에서 32,767 사이의 양의 정수입니다. 0을 지정하면 제한이 적용되지 않습니다. 이 옵션을 지정하지 않으면 서버에 대한 기본 제한은 100입니다.
쿼리 실행 중에 MAXRECURSION
제한에 대해 지정된 번호 또는 기본 번호에 도달하면 쿼리가 종료되고 오류가 반환됩니다.
이 오류로 인해 문의 모든 효과가 롤백됩니다. 문이 SELECT
문인 경우 부분 결과 또는 결과가 반환되지 않을 수 있습니다. 반환되는 모든 부분 결과에는 지정된 최대 재귀 수준을 초과하는 재귀 수준의 모든 행이 포함되지 않을 수 있습니다.
자세한 내용은 WITH common_table_expression참조하세요.
NO_PERFORMANCE_SPOOL
적용: SQL Server(SQL Server 2016(13.x)부터) 및 Azure SQL Database.
스풀 연산자가 쿼리 계획에 추가되지 않도록 합니다(유효한 업데이트 의미 체계를 보장하기 위해 스풀이 필요한 경우 계획을 제외하고). 스풀 연산자는 일부 시나리오에서 성능을 줄일 수 있습니다. 예를 들어 스풀은 tempdb
사용하며 스풀 작업으로 실행되는 동시 쿼리가 많은 경우 tempdb
경합이 발생할 수 있습니다.
OPTIMIZE FOR ( @variable_name { UNKNOWN | = <literal_constant> } [ , ... n ] )
쿼리가 컴파일되고 최적화될 때 쿼리 최적화 프로그램에서 지역 변수에 특정 값을 사용하도록 지시합니다. 해당 값은 쿼리 최적화 중에만 사용되고 쿼리 실행 중에는 사용되지 않습니다.
@variable_name
쿼리에 사용되는 지역 변수의 이름으로,
OPTIMIZE FOR
쿼리 힌트와 함께 사용할 값을 할당할 수 있습니다.UNKNOWN
쿼리 최적화 프로그램에서 쿼리 최적화 중에 초기 값 대신 통계 데이터를 사용하여 지역 변수의 값을 결정하도록 지정합니다.
literal_constant
OPTIMIZE FOR
쿼리 힌트와 함께 사용할 @variable_name 할당할 리터럴 상수 값입니다. literal_constant 쿼리를 최적화하는 동안에만 사용되며 쿼리 실행 중에는 @variable_name 값으로 사용되지 않습니다. literal_constant 리터럴 상수로 표현할 수 있는 모든 SQL Server 시스템 데이터 형식일 수 있습니다. literal_constant 데이터 형식은 쿼리에서 참조를 @variable_name 데이터 형식으로 암시적으로 변환할 수 있어야 합니다.
OPTIMIZE FOR는 최적화 프로그램의 기본 매개 변수 검색 동작을 상쇄할 수 있습니다. 또한 계획 지침을 만들 때 OPTIMIZE FOR
사용합니다. 자세한 내용은 저장 프로시저 다시 컴파일을 참조하십시오.
알 수 없음에 최적화
쿼리를 컴파일하고 최적화할 때 런타임 매개 변수 값을 사용하는 대신 모든 열 값에서 조건자의 평균 선택성을 사용하도록 쿼리 최적화 프로그램에서 지시합니다.
동일한 쿼리 힌트에서 OPTIMIZE FOR @variable_name = <literal_constant>
및 OPTIMIZE FOR UNKNOWN
사용하는 경우 쿼리 최적화 프로그램은 특정 값에 지정된 literal_constant 사용합니다. 쿼리 최적화 프로그램은 나머지 변수 값에 UNKNOWN을 사용합니다. 값은 쿼리 최적화 중에만 사용되며 쿼리 실행 중에는 사용되지 않습니다.
PARAMETERIZATION { SIMPLE | FORCED }
SQL Server 쿼리 최적화 프로그램이 컴파일할 때 쿼리에 적용되는 매개 변수화 규칙을 지정합니다.
중요합니다
PARAMETERIZATION
쿼리 힌트는 계획 지침 내에서만 지정하여 PARAMETERIZATION
데이터베이스 SET
옵션의 현재 설정을 재정의할 수 있습니다. 쿼리 내에서 직접 지정할 수 없습니다.
자세한 내용은 계획 지침 사용하여 쿼리 매개 변수화 동작 지정참조하세요.
SIMPLE
쿼리 최적화 프로그램에서 간단한 매개 변수화를 시도하도록 지시합니다.
FORCED
쿼리 최적화 프로그램에서 강제 매개 변수화를 시도하도록 지시합니다. 자세한 내용은 쿼리 처리 아키텍처 가이드 강제 매개 변수화쿼리 처리 아키텍처 가이드간단한 매개 변수화를 참조하세요.
QUERYTRACEON <integer_value>
이 옵션을 사용하면 단일 쿼리 컴파일 중에만 계획에 영향을 주는 추적 플래그를 사용하도록 설정할 수 있습니다. 다른 쿼리 수준 옵션과 마찬가지로 계획 지침과 함께 사용하여 모든 세션에서 실행 중인 쿼리의 텍스트를 일치시키고 이 쿼리를 컴파일할 때 계획에 영향을 주는 추적 플래그를 자동으로 적용할 수 있습니다.
QUERYTRACEON
옵션은 쿼리 최적화 프로그램 추적 플래그에 대해서만 지원됩니다. 자세한 내용은 추적 플래그참조하세요.
지원되지 않는 추적 플래그 번호를 사용하는 경우 이 옵션을 사용하면 오류 또는 경고가 반환되지 않습니다. 지정된 추적 플래그가 쿼리 실행 계획에 영향을 주는 플래그가 아닌 경우 옵션은 자동으로 무시됩니다.
쿼리에서 둘 이상의 추적 플래그를 사용하려면 서로 다른 각 추적 플래그 번호에 대해 하나의 QUERYTRACEON
힌트를 지정합니다.
다시 컴파일하십시오
SQL Server 데이터베이스 엔진에 쿼리에 대한 새로운 임시 계획을 생성하고 쿼리 실행이 완료된 후 해당 계획을 즉시 삭제하도록 지시합니다. 생성된 쿼리 계획은 RECOMPILE
힌트 없이 동일한 쿼리가 실행될 때 캐시에 저장된 계획을 대체하지 않습니다. 데이터베이스 엔진은 RECOMPILE
지정하지 않고 쿼리 계획을 캐시하고 다시 사용합니다. 쿼리 계획이 컴파일되면 RECOMPILE
쿼리 힌트는 쿼리에 있는 모든 지역 변수의 현재 값을 사용합니다. 쿼리가 저장 프로시저 내에 있는 경우 현재 값이 매개 변수에 전달됩니다.
RECOMPILE
저장 프로시저를 만드는 데 유용한 대안입니다.
RECOMPILE
저장 프로시저 내의 쿼리 하위 집합만 전체 저장 프로시저 대신 다시 컴파일해야 하는 경우 WITH RECOMPILE
절을 사용합니다. 자세한 내용은 저장 프로시저 다시 컴파일을 참조하십시오.
RECOMPILE
계획 지침을 만들 때도 유용합니다.
강력한 계획
쿼리 최적화 프로그램에서 성능이 저하될 수 있는 최대 잠재적 행 크기에 대해 작동하는 계획을 강제로 시도합니다. 쿼리를 처리할 때 중간 테이블 및 연산자는 쿼리가 처리될 때 입력 행 중 하나보다 더 넓은 행을 저장하고 처리해야 할 수 있습니다. 행이 너무 넓어서 특정 연산자가 행을 처리할 수 없는 경우도 있습니다. 행이 너비가 넓은 경우 데이터베이스 엔진은 쿼리를 실행하는 동안 오류를 생성합니다.
ROBUST PLAN
사용하여 쿼리 최적화 프로그램에서 이 문제가 발생할 수 있는 쿼리 계획을 고려하지 않도록 지시합니다.
이러한 계획을 사용할 수 없는 경우 쿼리 최적화 프로그램은 오류 검색을 쿼리 실행으로 지연하는 대신 오류를 반환합니다. 행에는 가변 길이 열이 포함될 수 있습니다. 데이터베이스 엔진을 사용하면 데이터베이스 엔진에서 처리할 수 있는 능력을 초과하는 최대 잠재적 크기를 가진 행을 정의할 수 있습니다. 일반적으로 최대 잠재적 크기에도 불구하고 애플리케이션은 데이터베이스 엔진이 처리할 수 있는 제한 내에서 실제 크기가 있는 행을 저장합니다. 데이터베이스 엔진이 너무 긴 행에 오면 실행 오류가 반환됩니다.
USE HINT ( 'hint_name' )
적용: SQL Server(SQL Server 2016(13.x) SP1부터) 및 Azure SQL Database.
쿼리 프로세서에 하나 이상의 추가 힌트를 제공합니다. 추가 힌트는 작은따옴표 힌트 이름으로 지정됩니다.
팁 (조언)
힌트 이름은 대/소문자를 구분하지 않습니다.
지원되는 힌트 이름은 다음과 같습니다.
힌트 | 설명 |
---|---|
'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS'
|
SQL Server 2014(12.x) 이상 버전의 쿼리 최적화 프로그램 카디널리티 예측 모델에서 조인에 대한 기본 기본 포함 가정 대신 단순 포함 가정을 사용하여 쿼리 계획을 생성합니다. 이 힌트 이름은 추적 플래그 9476과 같습니다. |
'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES'
|
전체 상관 관계를 고려하여 필터에 대한 AND 조건자를 추정할 때 최소 선택성을 사용하여 계획을 생성합니다. 이 힌트 이름은 SQL Server 2012(11.x) 및 이전 버전의 카디널리티 추정 모델과 함께 사용되는 경우 추적 플래그 4137과 동일하며, 9471이 SQL Server 2014(12.x) 이상 버전의 카디널리티 예측 모델과 함께 사용될 때 추적 플래그 비슷한 효과가 있습니다. |
'ASSUME_FULL_INDEPENDENCE_FOR_FILTER_ESTIMATES' |
완전한 독립성을 고려하여 필터에 대한 AND 조건자를 추정할 때 최대 선택성을 사용하여 계획을 생성합니다. 이 힌트 이름은 SQL Server 2012(11.x) 및 이전 버전의 카디널리티 추정 모델의 기본 동작이며, SQL Server 2014(12.x) 이상 버전의 카디널리티 추정 모델과 함께 사용할 경우 추적 플래그 9472와 동일합니다. 적용: Azure SQL Database |
'ASSUME_PARTIAL_CORRELATION_FOR_FILTER_ESTIMATES' |
부분 상관 관계를 고려하여 필터에 대한 AND 조건자를 추정할 때 선택성을 가장 적게 사용하는 계획을 생성합니다. 이 힌트 이름은 SQL Server 2014(12.x) 이상 버전의 카디널리티 추정 모델의 기본 동작입니다. 적용: Azure SQL Database |
'DISABLE_BATCH_MODE_ADAPTIVE_JOINS' |
일괄 처리 모드 적응 조인을 사용하지 않도록 설정합니다. 자세한 내용은 Batch 모드 적응 조인참조하세요. 적용 대상: SQL Server 2017(14.x) 이상 버전 및 Azure SQL Database |
'DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK' |
일괄 처리 모드 메모리 부여 피드백을 사용하지 않도록 설정합니다. 자세한 내용은 Batch 모드 메모리 부여 피드백참조하세요. 적용 대상: SQL Server 2017(14.x) 이상 버전 및 Azure SQL Database |
'DISABLE_DEFERRED_COMPILATION_TV' |
테이블 변수 지연 컴파일을 사용하지 않도록 설정합니다. 자세한 내용은 테이블 변수 지연 컴파일을 참조하세요. 적용 대상: SQL Server 2019(15.x) 이상 버전 및 Azure SQL Database |
'DISABLE_INTERLEAVED_EXECUTION_TVF' |
다중 문 테이블 반환 함수에 대해 인터리브 실행을 사용하지 않도록 설정합니다. 자세한 내용은 다중 문 테이블 반환 함수 대한 인터리브 실행참조하세요. 적용 대상: SQL Server 2017(14.x) 이상 버전 및 Azure SQL Database |
'DISABLE_OPTIMIZED_NESTED_LOOP' |
쿼리 계획을 생성할 때 최적화된 중첩 루프 조인에 정렬 작업(일괄 정렬)을 사용하지 않도록 쿼리 프로세서에 지시합니다. 이 힌트 이름은 추적 플래그 2340과 같습니다. 이 힌트는 명시적 정렬 및 일괄 처리 정렬에도 적용됩니다. |
'DISABLE_OPTIMIZER_ROWGOAL'
|
SQL Server에서 다음 키워드가 포함된 쿼리에서 행 목표 수정을 사용하지 않는 계획을 생성합니다. - TOP - OPTION (FAST N) - IN - EXISTS 이 힌트 이름은 추적 플래그 4138과 같습니다. |
'DISABLE_PARAMETER_SNIFFING' |
하나 이상의 매개 변수를 사용하여 쿼리를 컴파일하는 동안 평균 데이터 분포를 사용하도록 쿼리 최적화 프로그램에서 지시합니다. 이 명령은 쿼리를 컴파일할 때 처음 사용된 매개 변수 값에 대해 쿼리 계획을 독립적으로 만듭니다. 이 힌트 이름은 추적 플래그 4136 또는 데이터베이스 범위 구성 설정 PARAMETER_SNIFFING = OFF 동일합니다. |
'DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK' |
행 모드 메모리 부여 피드백을 사용하지 않도록 설정합니다. 자세한 내용은 행 모드 메모리 부여 피드백참조하세요. 적용 대상: SQL Server 2019(15.x) 이상 버전 및 Azure SQL Database |
'DISABLE_TSQL_SCALAR_UDF_INLINING' |
스칼라 UDF 인라인을 사용하지 않도록 설정합니다. 자세한 내용은 스칼라 UDF 인라인참조하세요. 적용 대상: SQL Server 2019(15.x) 이상 버전 및 Azure SQL Database |
'DISALLOW_BATCH_MODE' |
일괄 처리 모드 실행을 사용하지 않도록 설정합니다. 자세한 내용은 실행 모드를 참조하세요. 적용 대상: SQL Server 2019(15.x) 이상 버전 및 Azure SQL Database |
'ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS' |
카디널리티 예측이 필요한 선행 인덱스 열에 대해 자동으로 생성된 빠른 통계(히스토그램 수정)를 사용하도록 설정합니다. 카디널리티를 예측하는 데 사용되는 히스토그램은 쿼리 컴파일 시간에 이 열의 실제 최대값 또는 최소값을 고려하여 조정됩니다. 이 힌트 이름은 추적 플래그 4139와 같습니다. |
'ENABLE_QUERY_OPTIMIZER_HOTFIXES' |
쿼리 최적화 프로그램 핫픽스(SQL Server 누적 업데이트 및 서비스 팩에서 릴리스된 변경 내용)를 사용하도록 설정합니다. 이 힌트 이름은 추적 플래그 4199 또는 데이터베이스 범위 구성 설정 QUERY_OPTIMIZER_HOTFIXES = ON 동일합니다. |
'FORCE_DEFAULT_CARDINALITY_ESTIMATION' |
쿼리 최적화 프로그램에서 현재 데이터베이스 호환성 수준에 해당하는 카디널리티 예측 모델을 사용하도록 합니다. 이 힌트를 사용하여 데이터베이스 범위 구성 설정 LEGACY_CARDINALITY_ESTIMATION = ON 또는 추적 플래그 9481을 재정의할 수 있습니다. |
'FORCE_LEGACY_CARDINALITY_ESTIMATION'
|
쿼리 최적화 프로그램이 SQL Server 2012(11.x) 및 이전 버전의 카디널리티 예측 모델을 사용하도록 합니다. 이 힌트 이름은 추적 플래그 9481 또는 데이터베이스 범위 구성 설정 LEGACY_CARDINALITY_ESTIMATION = ON 동일합니다. |
'QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n'
1 |
쿼리 수준에서 쿼리 최적화 프로그램 동작을 강제로 실행합니다. 이 동작은 쿼리가 n 데이터베이스 호환성 수준으로 컴파일된 것처럼 발생합니다. 여기서 n 지원되는 데이터베이스 호환성 수준입니다.
n대해 현재 지원되는 값 목록은 sys.dm_exec_valid_use_hints참조하세요. 적용: SQL Server 2017(14.x) CU 10 이상 버전 및 Azure SQL Database |
'QUERY_PLAN_PROFILE'
2 |
쿼리에 대해 간단한 프로파일링을 사용하도록 설정합니다. 이 새 힌트를 포함하는 쿼리가 완료되면 query_plan_profile 새 확장 이벤트가 발생합니다. 이 확장 이벤트는 query_post_execution_showplan 확장 이벤트와 유사하지만 새 힌트가 포함된 쿼리에 대해서만 실행 통계 및 실제 실행 계획 XML을 노출합니다.적용 : SQL Server 2016 (13.x) SP 2 CU 3, SQL Server 2017 (14.x) CU 11 이상 버전 |
1QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n
힌트는 데이터베이스 범위 구성, 추적 플래그 또는 QUERYTRACEON
같은 다른 쿼리 힌트를 통해 강제 적용하는 경우 기본 또는 레거시 카디널리티 예측 설정을 재정의하지 않습니다. 이 힌트는 쿼리 최적화 프로그램의 동작에만 영향을 줍니다. 특정 데이터베이스 기능의 가용성과 같이 데이터베이스 호환성 수준따라 달라질 수 있는 SQL Server의 다른 기능에는 영향을 주지 않습니다. 자세한 내용은 개발자 선택: 쿼리 실행 모델힌트를 참조하세요.
2query_post_execution_showplan
확장 이벤트 수집을 사용하도록 설정하면 표준 프로파일링 인프라가 서버에서 실행되는 모든 쿼리에 추가되므로 전체 서버 성능에 영향을 줄 수 있습니다.
query_thread_profile
확장 이벤트 컬렉션을 대신 경량 프로파일링 인프라를 사용하도록 설정하면 성능 오버헤드가 훨씬 줄어들지만 전체 서버 성능에도 영향을 줍니다.
query_plan_profile
확장 이벤트를 사용하도록 설정하면 query_plan_profile
사용하여 실행되었으므로 서버의 다른 워크로드에 영향을 주지 않는 쿼리에 대한 간단한 프로파일링 인프라만 사용할 수 있습니다. 이 힌트를 사용하여 서버 워크로드의 다른 부분에 영향을 주지 않고 특정 쿼리를 프로파일합니다. 간단한 프로파일링에 대한 자세한 내용은 쿼리 프로파일링 인프라참조하세요.
지원되는 모든 USE HINT
이름 목록은 동적 관리 뷰 sys.dm_exec_valid_use_hints사용하여 쿼리할 수 있습니다.
중요합니다
일부 USE HINT
힌트는 전역 또는 세션 수준에서 사용하도록 설정된 추적 플래그 또는 데이터베이스 범위 구성 설정과 충돌할 수 있습니다. 이 경우 쿼리 수준 힌트(USE HINT
)가 항상 우선합니다.
USE HINT
다른 쿼리 힌트 또는 쿼리 수준에서 설정된 추적 플래그(예: QUERYTRACEON
)와 충돌하는 경우 SQL Server는 쿼리를 실행하려고 할 때 오류를 생성합니다.
USE PLAN N'xml_plan'
쿼리 최적화 프로그램에서 xml_plan지정한 쿼리에 대해 기존 쿼리 계획을 사용하도록 합니다.
INSERT
, UPDATE
, MERGE
또는 DELETE
문을 사용하여 USE PLAN
지정할 수 없습니다.
이 기능에 의해 강제 적용된 결과 실행 계획은 강제 적용되는 계획과 동일하거나 유사합니다. 결과 계획이 USE PLAN
지정한 계획과 동일하지 않을 수 있으므로 계획의 성능은 다를 수 있습니다. 드문 경우에서 성능 차이는 중요하고 부정적일 수 있습니다. 이 경우 관리자는 강제 계획을 제거해야 합니다.
TABLE HINT ( exposed_object_name [ , <table_hint> [ , ] ... n ] ] )
exposed_object_name해당하는 테이블 또는 뷰에 지정된 테이블 힌트를 적용합니다. 테이블 힌트는 계획 지침의 컨텍스트에서 쿼리 힌트로만 사용하는 것이 좋습니다.
exposed_object_name 다음 참조 중 하나일 수 있습니다.
쿼리의 FROM 절에서 테이블 또는 뷰에 별칭을 사용하는 경우 exposed_object_name 별칭입니다.
별칭을 사용하지 않는 경우 exposed_object_name
FROM
절에서 참조되는 테이블 또는 뷰와 정확히 일치합니다. 예를 들어 테이블 또는 뷰가 두 부분으로 구성된 이름을 사용하여 참조되는 경우 exposed_object_name 두 부분으로 된 이름이 동일합니다.
테이블 힌트를 지정하지 않고 exposed_object_name 지정하면 쿼리에서 개체에 대한 테이블 힌트의 일부로 지정한 인덱스는 무시됩니다. 그런 다음 쿼리 최적화 프로그램에서 인덱스 사용을 결정합니다. 이 기술을 사용하여 원래 쿼리를 수정할 수 없는 경우 INDEX
테이블 힌트의 효과를 제거할 수 있습니다. 예제 J 참조하세요.
<table_hint>
NOEXPAND [ , INDEX ( index_value [ ,... n ] ) | INDEX = ( index_value ) ] | INDEX ( index_value [ ,... n ] ) | INDEX = ( index_value ) | FORCESEEK [ ( index_value ( index_column_name [,... ] ) ) ] | FORCESCAN | HOLDLOCK | NOLOCK | NOWAIT | PAGLOCK | READCOMMITTED | READCOMMITTEDLOCK | READPAST | READUNCOMMITTED | REPEATABLEREAD | ROWLOCK | SERIALIZABLE | SNAPSHOT | SPATIAL_WINDOW_MAX_CELLS = integer_value | TABLOCK | TABLOCKX | UPDLOCK | XLOCK
쿼리 힌트로 exposed_object_name 해당하는 테이블 또는 뷰에 적용할 테이블 힌트입니다. 이러한 힌트에 대한 설명은 테이블 힌트참조하세요.
쿼리에 테이블 힌트를 지정하는 WITH
절이 없는 한 INDEX
, FORCESCAN
및 FORCESEEK
이외의 테이블 힌트는 쿼리 힌트로 허용되지 않습니다. 자세한 내용은 섹션을 참조하세요.
주의
매개 변수를 사용하여 FORCESEEK
지정하면 매개 변수 없이 FORCESEEK
지정할 때보다 쿼리 최적화 프로그램에서 고려할 수 있는 계획 수가 제한됩니다. 이로 인해 더 많은 경우에 "계획을 생성할 수 없습니다" 오류가 발생할 수 있습니다.
타임스탬프의 경우 'point_in_time'
적용: Microsoft Fabric Data Warehouse
OPTION
절의 TIMESTAMP
구문을 사용하여 과거와 마찬가지로 Microsoft Fabric의 Synapse Data Warehouse 시간 이동 기능 중 일부인 데이터를 쿼리합니다.
yyyy-MM-ddTHH:mm:ss[.fff]
형식으로 point_in_time 지정하여 해당 시간에 나타난 대로 데이터를 반환합니다. 표준 시간대는 항상 UTC입니다.
스타일 126필요한 날짜/시간 형식에 CONVERT
구문을 사용합니다.
TIMESTAMP AS OF
힌트는 OPTION
절을 사용하여 한 번만 지정할 수 있습니다. 자세한 내용 및 제한 사항은 과거 존재했던쿼리 데이터를 참조하세요.
FORCE [ 단일 노드 | DISTRIBUTED ] PLAN
적용: Microsoft Fabric Data Warehouse
사용자가 쿼리 실행을 위해 단일 노드 계획 또는 분산 계획을 강제 적용할지 여부를 선택할 수 있습니다.
비고
문 내에서 SELECT
절을 사용하는 경우를 제외하고는 쿼리 힌트를 INSERT
문에 지정할 수 없습니다.
쿼리 힌트는 하위 쿼리가 아닌 최상위 쿼리에서만 지정할 수 있습니다. 테이블 힌트를 쿼리 힌트로 지정하면 최상위 쿼리 또는 하위 쿼리에서 힌트를 지정할 수 있습니다. 그러나 TABLE HINT
절의 exposed_object_name 지정된 값은 쿼리 또는 하위 쿼리에서 노출된 이름과 정확히 일치해야 합니다.
테이블 힌트를 쿼리 힌트로 지정
INDEX
, FORCESCAN
또는 FORCESEEK
테이블 힌트를 계획 가이드컨텍스트에서만 쿼리 힌트로 사용하는 것이 좋습니다. 계획 지침은 원래 쿼리를 수정할 수 없는 경우(예: 타사 애플리케이션이므로) 유용합니다. 계획 지침에 지정된 쿼리 힌트는 컴파일되고 최적화되기 전에 쿼리에 추가됩니다. 임시 쿼리의 경우 계획 지침 문을 테스트할 때만 TABLE HINT
절을 사용합니다. 다른 모든 임시 쿼리의 경우 이러한 힌트를 테이블 힌트로만 지정하는 것이 좋습니다.
쿼리 힌트로 지정하면 INDEX
, FORCESCAN
및 FORCESEEK
테이블 힌트가 다음 개체에 유효합니다.
- 테이블
- 조회수
- 인덱싱된 뷰
- 공통 테이블 식(결과 집합이 공통 테이블 식을 채우는
SELECT
문에 힌트를 지정해야 합니다.) - DMV(동적 관리 뷰)
- 명명된 하위 쿼리
INDEX
, FORCESCAN
및 FORCESEEK
테이블 힌트를 기존 테이블 힌트가 없는 쿼리에 대한 쿼리 힌트로 지정할 수 있습니다. 쿼리의 기존 INDEX
, FORCESCAN
또는 FORCESEEK
힌트를 각각 바꾸는 데 사용할 수도 있습니다.
쿼리에 테이블 힌트를 지정하는 WITH
절이 없는 한 INDEX
, FORCESCAN
및 FORCESEEK
이외의 테이블 힌트는 쿼리 힌트로 허용되지 않습니다. 이 경우 일치하는 힌트도 쿼리 힌트로 지정해야 합니다.
OPTION
절에서 TABLE HINT
사용하여 일치하는 힌트를 쿼리 힌트로 지정합니다. 이 사양은 쿼리의 의미 체계를 유지합니다. 예를 들어 쿼리에 테이블 힌트 NOLOCK
포함된 경우 계획 지침의 @hints 매개 변수에 있는 OPTION
절에도 NOLOCK
힌트가 포함되어야 합니다.
예제 K참조하세요.
쿼리 저장소 힌트를 사용하여 힌트 지정
쿼리 저장소 힌트 기능을 사용하여 코드를 변경하지 않고 쿼리 저장소를 통해 식별된 쿼리에 힌트를 적용할 수 있습니다. sys.sp_query_store_set_hints 저장 프로시저를 사용하여 쿼리에 힌트를 적용합니다. 예제 N을 참조하세요.
패브릭 데이터 웨어하우스의 쿼리 힌트 지원
Microsoft Fabric Data Warehouse 쿼리 힌트의 하위 집합을 지원합니다.
HASH GROUP
ORDER GROUP
MERGE UNION
HASH UNION
CONCAT UNION
FORCE ORDER
USE HINT
ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES
ASSUME_FULL_INDEPENDENCE_FOR_FILTER_ESTIMATES
ASSUME_PARTIAL_CORRELATION_FOR_FILTER_ESTIMATES
ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS
이러한 쿼리 힌트는 Microsoft Fabric Data Warehouse에만 적용됩니다.
-
FORCE SINGLE NODE PLAN
,FORCE DISTRIBUTED PLAN
예시
A. MERGE JOIN 사용
다음 예제에서는 쿼리에서 JOIN
작업을 실행하는 MERGE JOIN
지정합니다. 이 예제에서는 AdventureWorks2022
데이터베이스를 사용합니다.
SELECT *
FROM Sales.Customer AS c
INNER JOIN Sales.CustomerAddress AS ca ON c.CustomerID = ca.CustomerID
WHERE TerritoryID = 5
OPTION (MERGE JOIN);
GO
B. OPTIMIZE FOR 사용
다음 예제에서는 쿼리 최적화 프로그램에서 @city_name
'Seattle'
값을 사용하고 쿼리를 최적화할 때 @postal_code
모든 열 값에서 조건자의 평균 선택성을 사용하도록 지시합니다. 이 예제에서는 AdventureWorks2022
데이터베이스를 사용합니다.
CREATE PROCEDURE dbo.RetrievePersonAddress
@city_name NVARCHAR(30),
@postal_code NVARCHAR(15)
AS
SELECT * FROM Person.Address
WHERE City = @city_name AND PostalCode = @postal_code
OPTION ( OPTIMIZE FOR (@city_name = 'Seattle', @postal_code UNKNOWN) );
GO
C. MAXRECURSION 사용
MAXRECURSION
잘못 구성된 재귀 공통 테이블 식이 무한 루프에 들어가지 않도록 방지하는 데 사용할 수 있습니다. 다음 예제에서는 의도적으로 무한 루프를 만들고 MAXRECURSION
힌트를 사용하여 재귀 수준 수를 2로 제한합니다. 이 예제에서는 AdventureWorks2022
데이터베이스를 사용합니다.
--Creates an infinite loop
WITH cte (CustomerID, PersonID, StoreID) AS
(
SELECT CustomerID, PersonID, StoreID
FROM Sales.Customer
WHERE PersonID IS NOT NULL
UNION ALL
SELECT cte.CustomerID, cte.PersonID, cte.StoreID
FROM cte
JOIN Sales.Customer AS e
ON cte.PersonID = e.CustomerID
)
--Uses MAXRECURSION to limit the recursive levels to 2
SELECT CustomerID, PersonID, StoreID
FROM cte
OPTION (MAXRECURSION 2);
GO
코딩 오류가 수정되면 MAXRECURSION
더 이상 필요하지 않습니다.
D. MERGE UNION 사용
다음 예제에서는 MERGE UNION
쿼리 힌트를 사용합니다. 이 예제에서는 AdventureWorks2022
데이터베이스를 사용합니다.
SELECT *
FROM HumanResources.Employee AS e1
UNION
SELECT *
FROM HumanResources.Employee AS e2
OPTION (MERGE UNION);
GO
E. HASH GROUP 및 FAST 사용
다음 예제에서는 HASH GROUP
및 FAST
쿼리 힌트를 사용합니다. 이 예제에서는 AdventureWorks2022
데이터베이스를 사용합니다.
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (HASH GROUP, FAST 10);
GO
F. MAXDOP 사용
다음 예제에서는 MAXDOP
쿼리 힌트를 사용합니다. 이 예제에서는 AdventureWorks2022
데이터베이스를 사용합니다.
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (MAXDOP 2);
GO
G. INDEX 사용
다음 예제에서는 INDEX
힌트를 사용합니다. 첫 번째 예제에서는 단일 인덱스를 지정합니다. 두 번째 예제에서는 단일 테이블 참조에 대해 여러 인덱스를 지정합니다. 두 예제 모두 별칭을 사용하는 테이블에 INDEX
힌트를 적용하기 때문에 TABLE HINT
절은 노출된 개체 이름과 동일한 별칭도 지정해야 합니다. 이 예제에서는 AdventureWorks2022
데이터베이스를 사용합니다.
EXEC sp_create_plan_guide
@name = N'Guide1',
@stmt = N'SELECT c.LastName, c.FirstName, e.Title
FROM HumanResources.Employee AS e
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
WHERE e.ManagerID = 2;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT(e, INDEX (IX_Employee_ManagerID)))';
GO
EXEC sp_create_plan_guide
@name = N'Guide2',
@stmt = N'SELECT c.LastName, c.FirstName, e.Title
FROM HumanResources.Employee AS e
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
WHERE e.ManagerID = 2;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT(e, INDEX(PK_Employee_EmployeeID, IX_Employee_ManagerID)))';
GO
H. FORCESEEK 사용
다음 예제에서는 FORCESEEK
테이블 힌트를 사용합니다. 또한 TABLE HINT
절은 노출된 개체 이름과 동일한 두 부분으로 구성된 이름을 지정해야 합니다. 두 부분으로 구성된 이름을 사용하는 테이블에 INDEX
힌트를 적용할 때 이름을 지정합니다. 이 예제에서는 AdventureWorks2022
데이터베이스를 사용합니다.
EXEC sp_create_plan_guide
@name = N'Guide3',
@stmt = N'SELECT c.LastName, c.FirstName, HumanResources.Employee.Title
FROM HumanResources.Employee
JOIN Person.Contact AS c ON HumanResources.Employee.ContactID = c.ContactID
WHERE HumanResources.Employee.ManagerID = 3
ORDER BY c.LastName, c.FirstName;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT( HumanResources.Employee, FORCESEEK))';
GO
제1장 여러 테이블 힌트 사용
다음 예제에서는 한 테이블에 INDEX
힌트를 적용하고 FORCESEEK
힌트를 다른 테이블에 적용합니다. 이 예제에서는 AdventureWorks2022
데이터베이스를 사용합니다.
EXEC sp_create_plan_guide
@name = N'Guide4',
@stmt = N'SELECT e.ManagerID, c.LastName, c.FirstName, e.Title
FROM HumanResources.Employee AS e
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
WHERE e.ManagerID = 3;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT (e, INDEX( IX_Employee_ManagerID))
, TABLE HINT (c, FORCESEEK))';
GO
J. TABLE HINT를 사용하여 기존 테이블 힌트 재정의
다음 예제에서는 TABLE HINT
힌트를 사용하는 방법을 보여줍니다. 힌트를 지정하지 않고 힌트를 사용하여 쿼리의 FROM
절에서 지정한 INDEX
테이블 힌트 동작을 재정의할 수 있습니다. 이 예제에서는 AdventureWorks2022
데이터베이스를 사용합니다.
EXEC sp_create_plan_guide
@name = N'Guide5',
@stmt = N'SELECT e.ManagerID, c.LastName, c.FirstName, e.Title
FROM HumanResources.Employee AS e WITH (INDEX (IX_Employee_ManagerID))
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
WHERE e.ManagerID = 3;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT(e))';
GO
K. 의미 체계에 영향을 주는 테이블 힌트 지정
다음 예제에는 쿼리에 의미 체계에 영향을 주는 NOLOCK
및 의미 체계에 영향을 주지 않는 INDEX
두 개의 테이블 힌트가 포함되어 있습니다. 쿼리의 의미 체계를 유지하기 위해 계획 가이드의 OPTIONS
절에 NOLOCK
힌트가 지정됩니다.
NOLOCK
힌트와 함께 INDEX
및 FORCESEEK
힌트를 지정하고 문 컴파일 및 최적화 중에 쿼리에서 의미 체계에 영향을 주지 않는 INDEX
힌트를 바꿉니다. 이 예제에서는 AdventureWorks2022
데이터베이스를 사용합니다.
EXEC sp_create_plan_guide
@name = N'Guide6',
@stmt = N'SELECT c.LastName, c.FirstName, e.Title
FROM HumanResources.Employee AS e
WITH (NOLOCK, INDEX (PK_Employee_EmployeeID))
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
WHERE e.ManagerID = 3;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT (e, INDEX(IX_Employee_ManagerID), NOLOCK, FORCESEEK))';
GO
다음 예제에서는 쿼리의 의미 체계를 유지하고 최적화 프로그램에서 테이블 힌트에 지정된 인덱스 이외의 인덱스를 선택할 수 있도록 하는 대체 방법을 보여 줍니다.
OPTIONS
절에서 NOLOCK
힌트를 지정하여 최적화 프로그램에서 선택할 수 있도록 합니다. 의미 체계에 영향을 주므로 힌트를 지정합니다. 그런 다음 테이블 참조만 있고 INDEX
힌트가 없는 TABLE HINT
키워드를 지정합니다. 이 예제에서는 AdventureWorks2022
데이터베이스를 사용합니다.
EXEC sp_create_plan_guide
@name = N'Guide7',
@stmt = N'SELECT c.LastName, c.FirstName, e.Title
FROM HumanResources.Employee AS e
WITH (NOLOCK, INDEX (PK_Employee_EmployeeID))
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
WHERE e.ManagerID = 2;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT (e, NOLOCK))';
GO
L. Use USE HINT
다음 예제에서는 RECOMPILE
및 USE HINT
쿼리 힌트를 사용합니다. 이 예제에서는 AdventureWorks2022
데이터베이스를 사용합니다.
SELECT * FROM Person.Address
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (RECOMPILE, USE HINT ('ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES', 'DISABLE_PARAMETER_SNIFFING'));
GO
M. QUERYTRACEON HINT 사용
다음 예제에서는 QUERYTRACEON
쿼리 힌트를 사용합니다. 이 예제에서는 AdventureWorks2022
데이터베이스를 사용합니다. 다음 쿼리를 사용하여 특정 쿼리에 대해 추적 플래그 4199로 제어되는 모든 계획에 영향을 주는 핫픽스를 사용하도록 설정할 수 있습니다.
SELECT * FROM Person.Address
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (QUERYTRACEON 4199);
다음 쿼리와 같이 여러 추적 플래그를 사용할 수도 있습니다.
SELECT * FROM Person.Address
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (QUERYTRACEON 4199, QUERYTRACEON 4137);
N. 쿼리 저장소 힌트 사용
쿼리 저장소 힌트는 Azure SQL Database의 기능을 통해 애플리케이션 코드를 변경하지 않고 쿼리 계획을 셰이핑하는 데 사용하기 쉬운 방법을 제공합니다.
먼저 쿼리 저장소 카탈로그 뷰에서 이미 실행된 쿼리를 식별합니다. 예를 들면 다음과 같습니다.
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'%ORDER BY ListingPrice DESC%'
AND query_sql_text not like N'%query_store%';
GO
다음 예제에서는 힌트를 적용하여 레거시 카디널리티 추정기 쿼리 저장소에서 식별된 query_id 39로 강제 적용합니다.
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(USE HINT(''FORCE_LEGACY_CARDINALITY_ESTIMATION''))';
다음 예제에서는 쿼리 저장소에서 식별된 query_id
39에 구성된 메모리 제한의 PERCENT
최대 메모리 부여 크기를 적용하는 힌트를 적용합니다.
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(MAX_GRANT_PERCENT=10)';
다음 예제에서는 RECOMPILE
, MAXDOP 1
및 SQL Server 2012(11.x) 쿼리 최적화 프로그램 동작을 포함하여 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''))';
O. 특정 시점의 데이터 쿼리
적용: Microsoft Fabric의 Warehouse
OPTION
절의 TIMESTAMP
구문을 사용하여 Microsoft Fabric의 Synapse Data Warehouse에서 과거와 같이 데이터를 쿼리합니다. 다음 샘플 쿼리는 2024년 3월 13일 오후 7:39:35.28 UTC에 나타난 대로 데이터를 반환합니다. 표준 시간대는 항상 UTC입니다.
SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey
OPTION (FOR TIMESTAMP AS OF '2024-03-13T19:39:35.28');--March 13, 2024 at 7:39:35.28 PM UTC