힌트(Transact-SQL) - 쿼리Hints (Transact-SQL) - Query

이 항목은 다음에 적용됩니다.예SQL Server(2008부터)예Azure SQL Database아니요Azure SQL Data Warehouse 아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

쿼리 힌트는 해당 힌트가 전체 쿼리에 사용해야 하는 힌트임을 나타냅니다.Query hints specify that the indicated hints should be used throughout the query. 문의 모든 연산자에 영향을 줍니다.They affect all operators in the statement. 기본 쿼리에 UNION이 포함된 경우 UNION 연산과 연관된 마지막 쿼리에만 OPTION 절을 포함할 수 있습니다.If UNION is involved in the main query, only the last query involving a UNION operation can have the OPTION clause. 쿼리 힌트는 OPTION 절의 일부로 지정됩니다.Query hints are specified as part of the OPTION clause. 하나 이상의 쿼리 힌트로 인해 쿼리 최적화 프로그램에서 유효한 계획을 생성할 수 없는 경우 8622 오류가 발생합니다.If one or more query hints cause the query optimizer not to generate a valid plan, error 8622 is raised.

주의

SQL ServerSQL Server 쿼리 최적화 프로그램은 일반적으로 쿼리에 대해 최적의 실행 계획을 선택하므로 힌트는 숙련된 개발자나 데이터베이스 관리자가 최후의 수단으로만 사용하는 것이 좋습니다.Because the SQL ServerSQL Server query optimizer typically selects the best execution plan for a query, we recommend only using hints as a last resort for experienced developers and database administrators.

적용 대상:Applies to:

DELETEDELETE

INSERTINSERT

SELECTSELECT

UPDATEUPDATE

MERGEMERGE

항목 링크 아이콘 Transact-SQL 구문 규칙Topic link icon Transact-SQL Syntax Conventions

구문Syntax

<query_hint > ::=   
{ { HASH | ORDER } GROUP   
  | { CONCAT | HASH | MERGE } UNION   
  | { LOOP | MERGE | HASH } JOIN   
  | EXPAND VIEWS   
  | FAST number_rows   
  | FORCE ORDER   
  | { FORCE | DISABLE } EXTERNALPUSHDOWN  
  | IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX  
  | KEEP PLAN   
  | KEEPFIXED PLAN  
  | MAX_GRANT_PERCENT = percent  
  | MIN_GRANT_PERCENT = percent  
  | MAXDOP number_of_processors   
  | MAXRECURSION number   
  | NO_PERFORMANCE_SPOOL   
  | OPTIMIZE FOR ( @variable_name { UNKNOWN | = literal_constant } [ , ...n ] )  
  | OPTIMIZE FOR UNKNOWN  
  | PARAMETERIZATION { SIMPLE | FORCED }  
  | RECOMPILE  
  | ROBUST PLAN   
  | USE HINT ( '<hint_name>' [ , ...n ] )
  | USE PLAN N'xml_plan'  | TABLE HINT ( exposed_object_name [ , <table_hint> [ [, ]...n ] ] )  
}  

<table_hint> ::=  
[ NOEXPAND ] {   
    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  
  | TABLOCK   
  | TABLOCKX   
  | UPDLOCK   
  | XLOCK  
}  

인수Arguments

{ HASH | ORDER } GROUP{ HASH | ORDER } GROUP
쿼리의 GROUP BY 또는 DISTINCT 절에 지정된 집계에서 해시나 정렬을 사용하도록 지정합니다.Specifies that aggregations described in the GROUP BY, or DISTINCT clause of the query should use hashing or ordering.

{ MERGE | HASH | CONCAT } UNION{ MERGE | HASH | CONCAT } UNION
UNION 집합을 병합, 해시 또는 연결하여 모든 UNION 연산을 수행하도록 지정합니다.Specifies that all UNION operations are performed by merging, hashing, or concatenating UNION sets. 둘 이상의 UNION 힌트를 지정한 경우 쿼리 최적화 프로그램에서는 지정한 힌트 중 가장 부담이 적은 전략을 선택합니다.If more than one UNION hint is specified, the query optimizer selects the least expensive strategy from those hints specified.

{ LOOP | MERGE | HASH } JOIN{ LOOP | MERGE | HASH } JOIN
전체 쿼리에서 모든 조인 연산이 LOOP JOIN, MERGE JOIN 또는 HASH JOIN에 의해 수행되도록 지정합니다.Specifies that all join operations are performed by LOOP JOIN, MERGE JOIN, or HASH JOIN in the whole query. 조인 힌트를 둘 이상 지정한 경우 최적화 프로그램에서는 허용되는 힌트 중 가장 부담이 적은 조인 방법을 선택합니다.If more than one join hint is specified, the optimizer selects the least expensive join strategy from the allowed ones.

같은 쿼리에서 특정 테이블 쌍에 대해 FROM 절에 조인 힌트도 지정한 경우 두 테이블의 조인에서 조인 힌트가 우선적으로 적용되지만 쿼리 힌트도 고려됩니다.If, in the same query, a join hint is also specified in the FROM clause for a specific pair of tables, this join hint takes precedence in the joining of the two tables, although the query hints still must be honored. 따라서 테이블 쌍에 대한 조인 힌트는 쿼리 힌트에서 허용되는 조인 방법의 선택만 제한하게 될 수도 있습니다.Therefore, the join hint for the pair of tables may only restrict the selection of allowed join methods in the query hint. 자세한 내용은 조인 힌트#40;Transact-SQL)를 참조하세요.For more information, see Join Hints (Transact-SQL).

EXPAND VIEWSEXPAND VIEWS
인덱싱된 뷰를 확장하고 쿼리 최적화 프로그램에서 인덱싱된 뷰를 쿼리 일부를 대체하는 것으로 간주하지 않도록 지정합니다.Specifies that the indexed views are expanded and the query optimizer will not consider any indexed view as a substitute for any part of the query. 쿼리 텍스트에 있는 뷰 정의에 의해 뷰 이름이 바뀌면 뷰가 확장됩니다.A view is expanded when the view name is replaced by the view definition in the query text.

이 쿼리 힌트는 쿼리 계획에서 인덱싱된 뷰와 인덱싱된 뷰의 인덱스를 직접 사용하도록 허용하지 않습니다.This query hint virtually disallows direct use of indexed views and indexes on indexed views in the query plan.

인덱싱된 뷰는 쿼리의 SELECT 부분에서 뷰를 직접 참조하고 WITH (NOEXPAND) 또는 WITH (NOEXPAND, INDEX( index_value [ ,...n ] ) )가 지정된 경우에만 확장되지 않습니다.The indexed view is not expanded only if the view is directly referenced in the SELECT part of the query and WITH (NOEXPAND) or WITH (NOEXPAND, INDEX( index_value [ ,...n ] ) ) is specified. 쿼리 힌트 WITH (NOEXPAND)에 대한 자세한 내용은 FROM을 참조하세요.For more information about the query hint WITH (NOEXPAND), see FROM.

INSERT, UPDATE, MERGE 및 DELETE 문을 비롯한 문의 SELECT 부분에 있는 뷰만 힌트의 영향을 받습니다.Only the views in the SELECT part of statements, including those in INSERT, UPDATE, MERGE, and DELETE statements are affected by the hint.

FAST number_rowsFAST number_rows
첫 번째 number_rows를 빨리 검색하기 위해 쿼리를 최적화하도록 지정합니다.Specifies that the query is optimized for fast retrieval of the first number_rows. 음수가 아닌 정수입니다.This is a nonnegative integer. 첫 번째 number_rows를 반환한 후에 쿼리는 계속 실행하여 전체 결과 집합을 만듭니다.After the first number_rows are returned, the query continues execution and produces its full result set.

FORCE ORDERFORCE ORDER
쿼리 구문에 지정된 조인 순서가 쿼리 최적화 시 유지되도록 지정합니다.Specifies that the join order indicated by the query syntax is preserved during query optimization. FORCE ORDER를 사용해도 쿼리 최적화 프로그램이 취할 수 있는 역할 반전 동작에는 영향을 미치지 않습니다.Using FORCE ORDER does not affect possible role reversal behavior of the query optimizer.

참고

MERGE 문에서 WHEN SOURCE NOT MATCHED 절이 지정되어 있지 않으면 원본 테이블은 기본 조인 순서에 따라 대상 테이블보다 먼저 액세스됩니다.In a MERGE statement, the source table is accessed before the target table as the default join order, unless the WHEN SOURCE NOT MATCHED clause is specified. FORCE ORDER를 지정하면 이러한 기본 동작이 유지됩니다.Specifying FORCE ORDER preserves this default behavior.

{ FORCE | DISABLE } EXTERNALPUSHDOWN{ FORCE | DISABLE } EXTERNALPUSHDOWN
Hadoop에서 조건에 맞는 식 계산을 강제로 밀어내거나 사용하지 않도록 설정합니다.Force or disable the pushdown of the computation of qualifying expressions in Hadoop. PolyBase를 사용한 쿼리에만 적용됩니다.Only applies to queries using PolyBase. Azure Storage로 밀어내지 않습니다.Will not push down to Azure storage.

KEEP PLANKEEP PLAN
쿼리 최적화 프로그램에서 쿼리에 대한 예상 다시 컴파일 임계값을 완화하도록 합니다.Forces the query optimizer to relax the estimated recompile threshold for a query. 예상된 다시 컴파일 임계값은 테이블에 UPDATE, DELETE, MERGE 또는 INSERT 문을 실행하여 인덱싱된 열을 예상 수만큼 변경했을 때 쿼리가 자동으로 다시 컴파일되는 시점입니다.The estimated recompile threshold is the point at which a query is automatically recompiled when the estimated number of indexed column changes have been made to a table by running UPDATE, DELETE, MERGE, or INSERT statements. 테이블이 자주 업데이트되는 경우 KEEP PLAN을 지정하면 쿼리가 지나치게 자주 다시 컴파일되지 않아 유용합니다.Specifying KEEP PLAN makes sure that a query will not be recompiled as frequently when there are multiple updates to a table.

KEEPFIXED PLANKEEPFIXED PLAN
통계 변경 시에는 최적화 프로그램이 쿼리를 다시 컴파일하지 않도록 합니다.Forces the query optimizer not to recompile a query due to changes in statistics. KEEPFIXED PLAN을 지정하면 원본으로 사용하는 테이블의 스키마가 바뀌거나 테이블에 대해 sp_recompile이 실행되는 경우에만 쿼리를 다시 컴파일합니다.Specifying KEEPFIXED PLAN makes sure that a query will be recompiled only if the schema of the underlying tables is changed or if sp_recompile is executed against those tables.

IGNORE_NONCLUSTERED_COLUMNSTORE_INDEXIGNORE_NONCLUSTERED_COLUMNSTORE_INDEX
적용 대상: SQL Server 2012(11.x)SQL Server 2012 (11.x) 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2012(11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017.

쿼리에 비클러스터형 메모리 액세스에 최적화된 columnstore 인덱스가 사용되지 않도록 방지합니다.Prevents the query from using a nonclustered memory optimized columnstore index. 쿼리에 Columnstore 인덱스 사용을 방지하기 위한 쿼리 힌트와 Columnstore 인덱스를 사용하기 위한 인덱스 힌트가 포함되어 있으면 힌트가 충돌하게 되고 오류가 반환됩니다.If the query contains the query hint to avoid use of the columnstore index and an index hint to use a columnstore index, the hints are in conflict and the query returns an error.

MAX_GRANT_PERCENT = percentMAX_GRANT_PERCENT = percent
PERCENT 단위의 최대 메모리 부여 크기입니다.The maximum memory grant size in PERCENT. 쿼리가 이 제한을 초과하지 않게 보장합니다.The query is guaranteed not to exceed this limit. Resource Governor 설정이 이보다 낮으면 실제 제한을 더 낮게 설정할 수 있습니다.The actual limit can be lower if the Resource Governor setting is lower than this. 유효한 값은 0.0에서 100.0 사이의 값입니다.Valid values are between 0.0 and 100.0.

적용 대상: SQL Server 2016(13.x)SQL Server 2016 (13.x) 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2016(13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017.

MIN_GRANT_PERCENT = percentMIN_GRANT_PERCENT = percent
PERCENT 단위의 최소 메모리 크기 = 기본 제한의 %.The minimum memory grant size in PERCENT = % of default limit. 쿼리를 시작하기 위해서는 최소한의 필수 메모리가 필요하기 때문에 이 쿼리는 MAX(필수 메모리, 최소 부여)를 가져오도록 보장됩니다.The query is guaranteed to get MAX(required memory, min grant) because at least required memory is needed to start a query. 유효한 값은 0.0에서 100.0 사이의 값입니다.Valid values are between 0.0 and 100.0.

적용 대상: SQL Server 2016(13.x)SQL Server 2016 (13.x) 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2016(13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017.

MAXDOP 숫자MAXDOP number
적용 대상: SQL Server 2008SQL Server 2008 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

이 옵션을 지정하는 쿼리에 대해 sp_configure 및 Resource Governor의 최대 병렬 처리 수준 구성 옵션을 무시합니다.Overrides the max degree of parallelism configuration option of sp_configure and Resource Governor for the query specifying this option. MAXDOP 쿼리 힌트는 sp_configure로 구성한 값을 초과할 수 있습니다.The MAXDOP query hint can exceed the value configured with sp_configure. MAXDOP가 Resource Governor로 구성한 값을 초과하면 데이터베이스 엔진Database EngineALTER WORKLOAD GROUP (Transact-SQL)에서 설명한 Resource Governor MAXDOP 값을 사용합니다.If MAXDOP exceeds the value configured with Resource Governor, the 데이터베이스 엔진Database Engine uses the Resource Governor MAXDOP value, described in ALTER WORKLOAD GROUP (Transact-SQL). 최대 병렬 처리 수준 구성 옵션에 사용된 모든 의미 체계 규칙을 MAXDOP 쿼리 힌트 사용 시 적용할 수 있습니다.All semantic rules used with the max degree of parallelism configuration option are applicable when you use the MAXDOP query hint. 자세한 내용은 max degree of parallelism 서버 구성 옵션 구성을 참조하세요.For more information, see Configure the max degree of parallelism Server Configuration Option.

경고

MAXDOP가 0으로 설정되면 서버는 최대 병렬 처리 수준을 선택합니다.If MAXDOP is set to zero, then the server chooses the max degree of parallelism.

MAXRECURSION 숫자 MAXRECURSION number
해당 쿼리에 대해 허용되는 최대 재귀 횟수를 지정합니다.Specifies the maximum number of recursions allowed for this query. 숫자는 0에서 32,767 사이의 음수가 아닌 정수입니다.number is a nonnegative integer between 0 and 32,767. 0을 지정하면 제한이 적용되지 않습니다.When 0 is specified, no limit is applied. 이 옵션을 지정하지 않은 경우 서버에 대한 기본 한도는 100입니다.If this option is not specified, the default limit for the server is 100.

쿼리 실행 중에 MAXRECURSION 한도로 지정된 횟수 또는 기본 횟수에 도달하면 쿼리가 종료되고 오류가 반환됩니다.When the specified or default number for MAXRECURSION limit is reached during query execution, the query is ended and an error is returned.

이 오류로 인해 문의 모든 결과가 롤백됩니다.Because of this error, all effects of the statement are rolled back. 문이 SELECT 문인 경우 결과의 일부가 반환되거나 아무런 결과도 반환되지 않을 수 있습니다.If the statement is a SELECT statement, partial results or no results may be returned. 반환된 일부 결과에는 지정한 최대 재귀 수준을 초과한 재귀 수준의 모든 행이 포함되지 않을 수 있습니다.Any partial results returned may not include all rows on recursion levels beyond the specified maximum recursion level.

자세한 내용은 WITH common_table_expression(Transact-SQL)을 참조하세요.For more information, see WITH common_table_expression (Transact-SQL).

NO_PERFORMANCE_SPOOLNO_PERFORMANCE_SPOOL
적용 대상: SQL Server 2016(13.x)SQL Server 2016 (13.x) 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2016(13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017.

스풀 연산자가 쿼리 계획에 추가되지 않게 합니다(유효한 업데이트 의미 체계를 보증하기 위해 스풀이 필요한 계획 제외).Prevents a spool operator from being added to query plans (except for the plans when spool is required to guarantee valid update semantics). 일부 시나리오에서는 스풀 연산자로 인해 성능이 저하될 수 있습니다.In some scenarios, the spool operator may reduce performance. 예를 들어 스풀 연산과 함께 여러 쿼리가 동시에 실행되는 경우 스풀이 사용하는 tempdb 및 tempdb 경합이 발생할 수 있습니다.For example, the spool uses tempdb and tempdb contention can occur if there are many concurrent queries running with the spool operations.

OPTIMIZE FOR ( @variable_name { UNKNOWN | = literal_constant } [ , ...n ] )OPTIMIZE FOR ( @variable_name { UNKNOWN | = literal_constant } [ , ...n ] )
쿼리가 컴파일되고 최적화될 때 쿼리 최적화 프로그램이 지역 변수에 대해 특정 값을 사용하도록 지시합니다.Instructs the query optimizer to use a particular value for a local variable when the query is compiled and optimized. 해당 값은 쿼리 최적화 중에만 사용되고 쿼리 실행 중에는 사용되지 않습니다.The value is used only during query optimization, and not during query execution.

@variable_name
쿼리에서 사용된 지역 변수의 이름이며 OPTIMIZE FOR 쿼리 힌트와 함께 사용하도록 값을 할당할 수 있습니다.Is the name of a local variable used in a query, to which a value may be assigned for use with the OPTIMIZE FOR query hint.

UNKNOWNUNKNOWN
쿼리 최적화 프로그램이 쿼리 최적화 동안 초기 값 대신 통계 데이터를 사용하여 지역 변수 값을 결정하도록 지정합니다.Specifies that the query optimizer uses statistical data instead of the initial value to determine the value for a local variable during query optimization.

literal_constantliteral_constant
OPTIMIZE FOR 쿼리 힌트와 함께 사용하도록 @variable_name을 할당할 리터럴 상수 값입니다.Is a literal constant value to be assigned @variable_name for use with the OPTIMIZE FOR query hint. literal_constant는 쿼리 최적화 중에만 사용되며 쿼리 실행 중에는 @variable_name의 값으로 사용되지 않습니다.literal_constant is used only during query optimization, and not as the value of @variable_name during query execution. literal_constant는 리터럴 상수로 표현할 수 있는 모든 SQL ServerSQL Server 시스템 데이터 형식이 될 수 있습니다.literal_constant can be of any SQL ServerSQL Server system data type that can be expressed as a literal constant. literal_constant의 데이터 형식은 쿼리에서 @variable_name이 참조하는 데이터 형식으로 암시적으로 변환될 수 있어야 합니다.The data type of literal_constant must be implicitly convertible to the data type that @variable_name references in the query.

OPTIMIZE FOR는 최적화 프로그램의 기본 매개 변수 감지 동작을 무효로 만들 수 있으며 계획 지침을 만들 때 사용할 수 있습니다.OPTIMIZE FOR can counteract the default parameter detection behavior of the optimizer or can be used when you create plan guides. 자세한 내용은 저장 프로시저 다시 컴파일을 참조하십시오.For more information, see Recompile a Stored Procedure.

OPTIMIZE FOR UNKNOWNOPTIMIZE FOR UNKNOWN
쿼리가 컴파일 및 최적화될 때 쿼리 최적화 프로그램이 강제 매개 변수화를 통해 만든 매개 변수를 비롯한 모든 지역 변수에 대해 초기 값 대신 통계 데이터를 사용하도록 지시합니다.Instructs the query optimizer to use statistical data instead of the initial values for all local variables when the query is compiled and optimized, including parameters created with forced parameterization.

같은 쿼리 힌트에서 OPTIMIZE FOR @variable_name = literal_constant 및 OPTIMIZE FOR UNKNOWN을 사용하면 쿼리 최적화 프로그램이 특정 값에는 지정된 literal_constant를 사용하고 나머지 변수 값에는 UNKNOWN을 사용합니다.If OPTIMIZE FOR @variable_name = literal_constant and OPTIMIZE FOR UNKNOWN are used in the same query hint, the query optimizer will use the literal_constant that is specified for a specific value and UNKNOWN for the remaining variable values. 해당 값은 쿼리 최적화 중에만 사용되고 쿼리 실행 중에는 사용되지 않습니다.The values are used only during query optimization, and not during query execution.

PARAMETERIZATION { SIMPLE | FORCED }PARAMETERIZATION { SIMPLE | FORCED }
SQL ServerSQL Server 쿼리 최적화 프로그램에서 쿼리 컴파일 시 적용하는 매개 변수화 규칙을 지정합니다.Specifies the parameterization rules that the SQL ServerSQL Server query optimizer applies to the query when it is compiled.

중요

PARAMETERIZATION 쿼리 힌트는 계획 지침 내에서 PARAMETERIZATION 데이터베이스 SET 옵션의 현재 설정을 재정의하도록 지정될 수 있습니다.The PARAMETERIZATION query hint can only be specified inside a plan guide to override the current setting of the PARAMETERIZATION database SET option. 쿼리 내에서 직접 지정할 수는 없습니다.It cannot be specified directly within a query.
자세한 내용은 계획 지침을 사용하여 쿼리 매개 변수화 동작 지정을 참조하세요.For more information, see Specify Query Parameterization Behavior by Using Plan Guides.

SIMPLE은 쿼리 최적화 프로그램이 단순 매개 변수화를 시도하도록 지시합니다.SIMPLE instructs the query optimizer to attempt simple parameterization. FORCED는 쿼리 최적화 프로그램이 강제 매개 변수화를 시도하도록 지시합니다.FORCED instructs the query optimizer to attempt forced parameterization. 자세한 내용은 쿼리 처리 아키텍처 가이드에서 강제 매개 변수화쿼리 처리 아키텍처 가이드에서 단순 매개 변수화를 참조하세요.For more information, see Forced Parameterization in the Query Processing Architecture Guide, and Simple Parameterization in the Query Processing Architecture Guide.

RECOMPILERECOMPILE
새로운 임시 쿼리 계획을 생성하고 쿼리 실행이 완료된 후 해당 계획을 즉시 무시하도록 SQL Server 데이터베이스 엔진SQL Server Database Engine에 지시합니다.Instructs the SQL Server 데이터베이스 엔진SQL Server Database Engine to generate a new, temporary plan for the query and immediately discard that plan after the query completes execution. 동일한 쿼리가 RECOMPILE 힌트 없이 실행될 경우 생성된 쿼리 계획은 캐시에 저장된 계획을 바꾸지 않습니다.The generated query plan does not replace a plan stored in cache when the the same query is executed without the RECOMPILE hint. RECOMPILE을 지정하지 않으면 데이터베이스 엔진Database Engine은 쿼리 계획을 캐시하여 다시 사용합니다.Without specifying RECOMPILE, the 데이터베이스 엔진Database Engine caches query plans and reuses them. 쿼리 계획을 컴파일할 때 RECOMPILE 쿼리 힌트는 쿼리에 있는 지역 변수의 현재 값을 사용하며 쿼리가 저장 프로시저 안에 있는 경우 매개 변수에 전달된 현재 값을 사용합니다.When compiling query plans, the RECOMPILE query hint uses the current values of any local variables in the query and, if the query is inside a stored procedure, the current values passed to any parameters.

RECOMPILE은 전체 저장 프로시저가 아닌 저장 프로시저 내 쿼리의 하위 집합만 다시 컴파일해야 하는 경우 WITH RECOMPILE 절을 사용하는 저장 프로시저를 만드는 데 유용합니다.RECOMPILE is a useful alternative to creating a stored procedure that uses the WITH RECOMPILE clause when only a subset of queries inside the stored procedure, instead of the whole stored procedure, must be recompiled. 자세한 내용은 저장 프로시저 다시 컴파일을 참조하십시오.For more information, see Recompile a Stored Procedure. RECOMPILE은 계획 지침을 만들 때도 유용합니다.RECOMPILE is also useful when you create plan guides.

ROBUST PLANROBUST PLAN
쿼리 최적화 프로그램에서 성능이 저하되더라도 잠재적 최대 행 크기를 정의할 수 있는 계획을 세우도록 합니다.Forces the query optimizer to try a plan that works for the maximum potential row size, possibly at the expense of performance. 쿼리가 처리될 때 중간 테이블 및 연산자가 입력 행보다 큰 행을 저장하고 처리해야 할 수 있습니다.When the query is processed, intermediate tables and operators may have to store and process rows that are wider than any one of the input rows. 행이 너무 커서 특정 연산자가 행을 처리하지 못하는 경우도 있습니다.The rows may be so wide that, sometimes, the particular operator cannot process the row. 이런 경우 데이터베이스 엔진Database Engine에서는 쿼리 실행 중에 오류를 생성합니다.If this occurs, the 데이터베이스 엔진Database Engine produces an error during query execution. ROBUST PLAN을 사용하면 쿼리 최적화 프로그램에서 이러한 문제가 발생할 수 있는 쿼리 계획을 고려하지 않도록 할 수 있습니다.By using ROBUST PLAN, you instruct the query optimizer not to consider any query plans that may encounter this problem.

이러한 계획이 불가능할 경우 쿼리 최적화 프로그램은 쿼리 실행 시 오류를 검색하도록 지연시키지 않고 오류를 반환합니다.If such a plan is not possible, the query optimizer returns an error instead of deferring error detection to query execution. 행에는 가변 길이 열이 포함될 수 있으며 데이터베이스 엔진Database Engine데이터베이스 엔진Database Engine에서 처리할 수 있는 범위 이상의 잠재적 최대 크기를 가진 행을 정의하도록 허용합니다.Rows may contain variable-length columns; the 데이터베이스 엔진Database Engine allows for rows to be defined that have a maximum potential size beyond the ability of the 데이터베이스 엔진Database Engine to process them. 그러나 대개 응용 프로그램은 데이터베이스 엔진Database Engine이 처리할 수 있는 한도 내의 실제 크기를 가진 행을 저장합니다.Generally, despite the maximum potential size, an application stores rows that have actual sizes within the limits that the 데이터베이스 엔진Database Engine can process. 너무 긴 행이 있으면 데이터베이스 엔진Database Engine에서 실행 오류를 반환합니다.If the 데이터베이스 엔진Database Engine encounters a row that is too long, an execution error is returned.

USE HINT ( 'hint_name' )USE HINT ( 'hint_name' )
적용 대상: SQL ServerSQL Server ( SQL Server 2016(13.x)SQL Server 2016 (13.x) SP1로 시작) 및 SQL DatabaseSQL Database에 적용됩니다.Applies to: Applies to SQL ServerSQL Server (starting with SQL Server 2016(13.x)SQL Server 2016 (13.x) SP1) and SQL DatabaseSQL Database.

힌트 이름 작은 따옴표 안에서 지정한 대로 쿼리 프로세서에 하나 이상의 추가 힌트를 제공합니다.Provides one or more additional hints to the query processor as specified by a hint name inside single quotation marks.

지원되는 힌트는 다음과 같습니다.The following hint names are supported:

  • 'DISABLE_OPTIMIZED_NESTED_LOOP''DISABLE_OPTIMIZED_NESTED_LOOP'
    쿼리 프로세서가 쿼리 계획을 생성할 때 최적화된 중첩 루프 조인을 위해 정렬 연산(일괄 처리 정렬)을 사용하지 않도록 지시합니다Instructs the query processor not to use a sort operation (batch sort) for optimized nested loop joins when generating a query plan. 이 설정은 추적 플래그 2340과 동일합니다.This is equivalent to trace flag 2340.
  • 'FORCE_LEGACY_CARDINALITY_ESTIMATION''FORCE_LEGACY_CARDINALITY_ESTIMATION'
    쿼리 최적화 프로그램이 SQL Server 2012(11.x)SQL Server 2012 (11.x) 및 이전 버전의 카디널리티 추정 모델을 사용하도록 강제 적용합니다.Forces the query optimizer to use Cardinality Estimation model of SQL Server 2012(11.x)SQL Server 2012 (11.x) and earlier versions. 추적 플래그 9481 또는 데이터베이스 범위 구성 설정 LEGACY_CARDINALITY_ESTIMATION=ON에 해당합니다.This is equivalent to trace flag 9481 or Database Scoped Configuration setting LEGACY_CARDINALITY_ESTIMATION=ON.
  • 'ENABLE_QUERY_OPTIMIZER_HOTFIXES''ENABLE_QUERY_OPTIMIZER_HOTFIXES'
    쿼리 최적화 프로그램 핫픽스(SQL Server 누적 업데이트 및 서비스 팩에서 릴리스된 변경 내용)를 사용하도록 설정합니다.Enables query optimizer hotfixes (changes released in SQL Server Cumulative Updates and Service Packs). 추적 플래그 4199 또는 데이터베이스 범위 구성 설정 QUERY_OPTIMIZER_HOTFIXES=ON에 해당합니다.This is equivalent to trace flag 4199 or Database Scoped Configuration setting QUERY_OPTIMIZER_HOTFIXES=ON.
  • 'DISABLE_PARAMETER_SNIFFING''DISABLE_PARAMETER_SNIFFING'
    쿼리 계획이 쿼리를 컴파일할 때 처음 사용된 매개 변수 값과 독립적이되도록, 쿼리 최적화 프로그램이 하나 이상의 매개 변수가 있는 쿼리를 컴파일할 때 평균 데이터 분산을 사용하도록 지시합니다.Instructs query optimizer to use average data distribution while compiling a query with one or more parameters, making the query plan independent on the parameter value which was first used when the query was compiled. 추적 플래그 4136 또는 데이터베이스 범위 구성 설정 PARAMETER_SNIFFING=OFF에 해당합니다.This is equivalent to trace flag 4136 or Database Scoped Configuration setting PARAMETER_SNIFFING=OFF.
  • 'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES''ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES'
    SQL Server가 상관 관계에 해당하는 필터에 대해 AND 조건자를 추정할 때 최소 선택을 사용하여 계획을 생성하게 합니다.Causes SQL Server to generate a plan using minimum selectivity when estimating AND predicates for filters to account for correlation. SQL Server 2012(11.x)SQL Server 2012 (11.x) 및 그 이전 버전의 카디널리티 추정 모델에 사용하던 추적 플래그 4137에 해당하며 추적 플래그 9471을 카디널리티 추정 모델 SQL Server 2014(12.x)SQL Server 2014 (12.x) 이상에서 사용할 때 결과가 비슷합니다.This is equivalent to trace flag 4137 when used with cardinality estimation model of SQL Server 2012(11.x)SQL Server 2012 (11.x) and earlier versions, and has similar effect when trace flag 9471 is used with cardinality estimation model of SQL Server 2014(12.x)SQL Server 2014 (12.x) or higher.
  • 'DISABLE_OPTIMIZER_ROWGOAL''DISABLE_OPTIMIZER_ROWGOAL'
    SQL Server가 TOP, OPTION (FAST N), IN 또는 EXISTS 키워드를 포함하는 쿼리에 행 목표 조정을 사용하지 않는 계획을 생성하게 합니다.Causes SQL Server to generate a plan that does not use row goal adjustments with queries that contain TOP, OPTION (FAST N), IN, or EXISTS keywords. 추적 플래그 4138과 동일합니다.This is equivalent to trace flag 4138.
  • 'ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS''ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS'
    카디널리티 추정이 필요한 모든 선행 인덱스 열에 대해 자동으로 생성된 빠른 통계(히스토그램 수정)를 사용합니다.Enables automatically generated quick statistics (histogram amendment) for any leading index column for which cardinality estimation is needed. 카디널리티 추정에 사용되는 히스토그램은 이 열의 실제 최댓값 또는 최솟값을 반영하기 위해 쿼리 컴파일 시점에 조정됩니다.The histogram used to estimate cardinality will be adjusted at query compile time to account for actual maximum or minimum value of this column. 이 설정은 추적 플래그 4139와 동일합니다.This is equivalent to trace flag 4139.
  • 'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS''ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS'
    SQL ServerSQL ServerSQL Server 2014(12.x)SQL Server 2014 (12.x) 이상의 쿼리 최적화 프로그램 카디널리티 추정 모델에서 조인에 기본 베이스 제약 가정 대신 단순 제약을 사용하여 쿼리를 생성하게 합니다.Causes SQL ServerSQL Server to generate a query plan using the Simple Containment assumption instead of the default Base Containment assumption for joins, under the query optimizer Cardinality Estimation model of SQL Server 2014(12.x)SQL Server 2014 (12.x) or newer. 이 설정은 추적 플래그 9476과 동일합니다.This is equivalent to trace flag 9476.
  • 'FORCE_DEFAULT_CARDINALITY_ESTIMATION''FORCE_DEFAULT_CARDINALITY_ESTIMATION'
    쿼리 최적화 프로그램이 현재 데이터베이스 호환성 수준에 해당하는 카디널리티 추정 모델을 사용하도록 강제 적용합니다.Forces the Query Optimizer to use Cardinality Estimation model that corresponds to the current database compatibility level. 이 힌트를 사용하여 데이터베이스 범위 구성 설정 LEGACY_CARDINALITY_ESTIMATION=ON 또는 추적 플래그 9481을 재정의합니다.Use this hint to override Database Scoped Configuration setting LEGACY_CARDINALITY_ESTIMATION=ON or trace flag 9481.
  • 'DISABLE_INTERLEAVED_EXECUTION_TVF''DISABLE_INTERLEAVED_EXECUTION_TVF'
    다중 명령문 테이블 반환 함수에 대한 인터리브 실행을 사용하지 않습니다.Disables interleaved execution for multi-statement table valued functions. 자세한 내용은 다중 명령문 테이블 반환 함수에 대한 인터리브 실행을 참조합니다.For more information, see Interleaved execution for multi-statement table valued functions.
  • 'DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK''DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK'
    일괄 처리 모드 메모리 부여 피드백을 사용하지 않습니다.Disables batch mode memory grant feedback. 자세한 내용은 일괄 처리 모드 메모리 부여 피드백을 참조합니다.For more information, see Batch mode memory grant feedback.
  • 'DISABLE_BATCH_MODE_ADAPTIVE_JOINS''DISABLE_BATCH_MODE_ADAPTIVE_JOINS'
    일괄 처리 모드 적응 조인을 사용 하지 않습니다.Disables batch mode adaptive joins. 자세한 내용은 일괄 처리 모드 적응 조인을 참조합니다.For more information, see Batch mode Adaptive Joins .

힌트 이름은 대/소문자를 구분하지 않습니다.Hint names are case-insensitive.

지원되는 모든 USE HINT 이름 목록은 동적 관리 뷰 sys.dm_exec_valid_use_hints를 사용하여 쿼리할 수 있습니다.The list of all supported USE HINT names can be queried using the dynamic management view sys.dm_exec_valid_use_hints.

중요

일부 USE HINT 힌트는 전역 또는 세션 수준에서 사용하는 추적 플래그나 데이터베이스 범위 구성 설정과 충돌할 수 있습니다.Some USE HINT hints may conflict with trace flags enabled at the global or session level, or database scoped configuration settings. 이 경우 쿼리 수준 힌트(USE HINT)가 항상 우선합니다.In this case, the query level hint (USE HINT) always takes precedence. USE HINT가 쿼리 수준에서 사용하는 다른 쿼리 힌트나 추적 플래그와 충돌하는 경우(예: QUERYTRACEON) SQL ServerSQL Server가 쿼리를 실행할 때 오류를 생성합니다.If a USE HINT conflicts with another query hint, or a trace flag enabled at the query level (such as by QUERYTRACEON), SQL ServerSQL Server will generate an error when trying to execute the query.

USE PLAN N 'xml_plan' USE PLAN N 'xml_plan'
쿼리 최적화 프로그램이 'xml_plan' 에 의해 지정된 쿼리에 대해 기존의 쿼리 계획을 사용하도록 합니다.Forces the query optimizer to use an existing query plan for a query that is specified by 'xml_plan'. USE PLAN은 INSERT, UPDATE, MERGE 또는 DELETE 문에서 지정할 수 없습니다.USE PLAN cannot be specified with INSERT, UPDATE, MERGE, or DELETE statements.

TABLE HINT (exposed_object_name [ , <table_hint> [ [, ]...n ] ] ) 지정된 테이블 힌트를 exposed_object_name에 해당하는 테이블 또는 뷰에 적용합니다.TABLE HINT (exposed_object_name [ , <table_hint> [ [, ]...n ] ] ) Applies the specified table hint to the table or view that corresponds to exposed_object_name. 테이블 힌트는 계획 지침의 컨텍스트에서 쿼리 힌트로만 사용하는 것이 좋습니다.We recommend using a table hint as a query hint only in the context of a plan guide.

exposed_object_name은 다음 참조 중 하나일 수 있습니다.exposed_object_name can be one of the following references:

  • 쿼리의 FROM 절에서 테이블 또는 뷰에 별칭을 사용하는 경우 exposed_object_name은 해당 별칭입니다.When an alias is used for the table or view in the FROM clause of the query, exposed_object_name is the alias.

  • 별칭을 사용하지 않는 경우 exposed_object_name은 FROM 절에서 참조되는 테이블 또는 뷰와 일치합니다.When an alias is not used, exposed_object_name is the exact match of the table or view referenced in the FROM clause. 예를 들어 테이블 또는 뷰가 두 부분으로 된 이름을 사용하여 참조되는 경우 exposed_object_name도 똑같이 두 부분으로 된 이름입니다.For example, if the table or view is referenced using a two-part name, exposed_object_name is the same two-part name.

    테이블 힌트는 지정하지 않고 exposed_object_name만 지정하면 쿼리에 개체에 대한 테이블 힌트의 일부로 지정된 인덱스가 모두 무시되고 쿼리 최적화 프로그램에서 인덱스 사용 여부를 결정합니다.When exposed_object_name is specified without also specifying a table hint, any indexes specified in the query as part of a table hint for the object are disregarded and index usage is determined by the query optimizer. 이 방법은 원래 쿼리를 수정할 수 없을 때 INDEX 테이블 힌트의 효과를 제거하는 데 이용할 수 있습니다.You can use this technique to eliminate the effect of an INDEX table hint when you cannot modify the original query. 자세한 내용은 예 10을 참조하세요.See Example J.

<table_hint> ::= { [ NOEXPAND ] { 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 | TABLOCK | TABLOCKX | UPDLOCK | XLOCK } exposed_object_name에 해당하는 테이블 또는 뷰에 쿼리 힌트로 적용하는 테이블 힌트<table_hint> ::= { [ NOEXPAND ] { 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 | TABLOCK | TABLOCKX | UPDLOCK | XLOCK } Is the table hint to apply to the table or view that corresponds to exposed_object_name as a query hint. 이러한 힌트에 대한 설명은 테이블 힌트 (Transact-SQL)을 참조하세요.For a description of these hints, see Table Hints (Transact-SQL).

쿼리에 테이블 힌트를 지정하는 WITH 절이 없다면 INDEX, FORCESCAN 및 FORCESEEK 이외의 테이블 힌트를 쿼리 힌트로 사용할 수 없습니다.Table hints other than INDEX, FORCESCAN, and FORCESEEK are disallowed as query hints unless the query already has a WITH clause specifying the table hint. 자세한 내용은 설명 부분을 참조하세요.For more information, see Remarks.

주의

매개 변수와 함께 FORCESEEK를 지정할 경우 매개 변수 없이 FORCESEEK를 지정할 때보다 최적화 프로그램에서 고려할 수 있는 계획 수가 더 제한됩니다.Specifying FORCESEEK with parameters limits the number of plans that can be considered by the optimizer more than when specifying FORCESEEK without parameters. 이로 인해 "계획을 생성할 수 없음" 오류가 많은 사례에서 발생하는 원인이 될 수도 있습니다.This may cause a "Plan cannot be generated" error to occur in more cases. 후속 릴리스에서는 더 많은 계획을 고려할 수 있도록 최적화 프로그램이 수정될 것입니다.In a future release, internal modifications to the optimizer may allow more plans to be considered.

RemarksRemarks

쿼리 힌트는 명령문 내에 SELECT 절이 사용되는 경우를 제외하고 INSERT 문에서 지정할 수 없습니다.Query hints cannot be specified in an INSERT statement, except when a SELECT clause is used inside the statement.

쿼리 힌트는 하위 쿼리가 아닌 최상위 쿼리에서만 지정할 수 있습니다.Query hints can be specified only in the top-level query, not in subqueries. 테이블 힌트를 쿼리 힌트로 지정하면 해당 힌트를 최상위 쿼리나 하위 쿼리에 지정할 수 있지만 TABLE HINT 절에서 exposed_object_name에 대해 지정한 값이 쿼리 또는 하위 쿼리의 표시 이름과 일치해야 합니다.When a table hint is specified as a query hint, the hint can be specified in the top-level query or in a subquery; however, the value specified for exposed_object_name in the TABLE HINT clause must match exactly the exposed name in the query or subquery.

테이블 힌트를 쿼리 힌트로 지정Specifying Table Hints as Query Hints

INDEX, FORCESCAN 또는 FORCESEEK 테이블 힌트는 계획 지침의 컨텍스트에서만 쿼리 힌트로 사용하는 것이 좋습니다.We recommend using the INDEX, FORCESCAN, or FORCESEEK table hint as a query hint only in the context of a plan guide. 계획 지침은 타사 응용 프로그램인 경우와 같이 원래 쿼리를 수정할 수 없을 때 유용합니다.Plan guides are useful when you cannot modify the original query, for example, because it is a third-party application. 계획 지침에 지정되어 있는 쿼리 힌트는 쿼리가 컴파일 및 최적화되기 전에 쿼리에 추가됩니다.The query hint specified in the plan guide is added to the query before it is compiled and optimized. 임시 쿼리의 경우 계획 지침 문을 테스트할 때에만 TABLE HINT 절을 사용하세요.For ad-hoc queries, use the TABLE HINT clause only when testing plan guide statements. 임시 쿼리 이외의 모든 경우 이러한 힌트를 테이블 힌트로만 지정하는 것이 좋습니다.For all other ad-hoc queries, we recommend specifying these hints only as table hints.

INDEX, FORCESCAN 및 FORCESEEK 테이블 힌트를 쿼리 힌트로 지정하는 경우 다음 개체에 대해서 유효합니다.When specified as a query hint, the INDEX, FORCESCAN, and FORCESEEK table hints are valid for the following objects:

  • 테이블Tables
  • Views
  • 인덱싱된 뷰Indexed views
  • 공통 테이블 식(공통 테이블 식을 채울 결과 집합을 위한 SELECT 문에 힌트를 지정해야 함)Common table expressions (the hint must be specified in the SELECT statement whose result set populates the common table expression)
  • 동적 관리 뷰Dynamic management views
  • 명명된 하위 쿼리Named subqueries

기존 테이블 힌트가 없는 쿼리에 대해 INDEX, FORCESCAN 및 FORCESEEK 테이블 힌트를 쿼리 힌트로 지정할 수 있습니다. 또는 INDEX 및 FORCESEEK 힌트를 사용하여 쿼리에 있는 기존 INDEX, FORCESCAN 또는 FORCESEEK 힌트를 각각 대체할 수 있습니다.The INDEX, FORCESCAN, and FORCESEEK table hints can be specified as query hints for a query that does not have any existing table hints, or they can be used to replace existing INDEX, FORCESCAN or FORCESEEK hints in the query, respectively. 쿼리에 테이블 힌트를 지정하는 WITH 절이 없다면 INDEX, FORCESCAN 및 FORCESEEK 이외의 테이블 힌트를 쿼리 힌트로 사용할 수 없습니다.Table hints other than INDEX, FORCESCAN, and FORCESEEK are disallowed as query hints unless the query already has a WITH clause specifying the table hint. 이 경우 OPTION 절에 TABLE HINT를 사용하여 일치하는 힌트를 쿼리 힌트로 지정함으로써 쿼리의 의미 체계를 유지해야 합니다.In this case, a matching hint must also be specified as a query hint by using TABLE HINT in the OPTION clause to preserve the semantics of the query. 예를 들어 쿼리에 테이블 힌트 NOLOCK이 있는 경우 계획 지침의 @hints 매개 변수에 있는 OPTION 절에도 NOLOCK 힌트가 있어야 합니다.For example, if the query contains the table hint NOLOCK, the OPTION clause in the @hints parameter of the plan guide must also contain the NOLOCK hint. 예 K를 참조하세요. 일치하는 쿼리 힌트 없이 OPTION 절에 TABLE HINT를 사용하여 INDEX, FORCESCAN 또는 FORCESEEK 이외의 테이블 힌트를 지정하거나 그 반대의 경우 OPTION 절로 인해 쿼리의 의미 체계가 변경되고 쿼리가 실패할 수 있음을 나타내는 오류 8702가 발생합니다.See Example K. When a table hint other than INDEX, FORCESCAN, or FORCESEEK is specified by using TABLE HINT in the OPTION clause without a matching query hint, or vice versa; error 8702 is raised (indicating that the OPTION clause can cause the semantics of the query to change) and the query fails.

Examples

1.A. MERGE JOIN 사용Using MERGE JOIN

다음 예에서는 쿼리의 JOIN 연산이 MERGE JOIN에 의해 수행되도록 지정합니다.The following example specifies that the JOIN operation in the query is performed by MERGE JOIN. 이 예에서는 AdventureWorks2012AdventureWorks2012 데이터베이스를 사용합니다.The example uses the AdventureWorks2012AdventureWorks2012 database.

SELECT *   
FROM Sales.Customer AS c  
INNER JOIN Sales.CustomerAddress AS ca ON c.CustomerID = ca.CustomerID  
WHERE TerritoryID = 5  
OPTION (MERGE JOIN);  
GO    

2.B. OPTIMIZE FOR 사용Using OPTIMIZE FOR

다음 예에서는 쿼리를 최적화할 때 쿼리 최적화 프로그램이 지역 변수 'Seattle'@city_name 값을 사용하고 통계 데이터를 사용하여 지역 변수 @postal_code의 값을 결정하도록 지시합니다.The following example instructs the query optimizer to use the value 'Seattle' for local variable @city_name and to use statistical data to determine the value for the local variable @postal_code when optimizing the query. 이 예에서는 AdventureWorks2012AdventureWorks2012 데이터베이스를 사용합니다.The example uses the AdventureWorks2012AdventureWorks2012 database.

DECLARE @city_name nvarchar(30);  
DECLARE @postal_code nvarchar(15);  
SET @city_name = 'Ascheim';  
SET @postal_code = 86171;  
SELECT * FROM Person.Address  
WHERE City = @city_name AND PostalCode = @postal_code  
OPTION ( OPTIMIZE FOR (@city_name = 'Seattle', @postal_code UNKNOWN) );  
GO  

3.C. MAXRECURSION 사용Using MAXRECURSION

잘못 구성된 재귀 공통 테이블 식이 무한 루프에 진입하는 것을 방지하는 데 MAXRECURSION을 사용할 수 있습니다.MAXRECURSION can be used to prevent a poorly formed recursive common table expression from entering into an infinite loop. 다음 예에서는 의도적으로 무한 루프를 만들고 MAXRECURSION 힌트를 사용하여 재귀 수준을 2로 제한하는 방법을 보여 줍니다.The following example intentionally creates an infinite loop and uses the MAXRECURSION hint to limit the number of recursion levels to two. 이 예에서는 AdventureWorks2012AdventureWorks2012 데이터베이스를 사용합니다.The example uses the AdventureWorks2012AdventureWorks2012 database.

--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이 필요하지 않습니다.After the coding error is corrected, MAXRECURSION is no longer required.

4.D. MERGE UNION 사용Using MERGE UNION

다음 예에서는 MERGE UNION 쿼리 힌트를 사용합니다.The following example uses the MERGE UNION query hint. 이 예에서는 AdventureWorks2012AdventureWorks2012 데이터베이스를 사용합니다.The example uses the AdventureWorks2012AdventureWorks2012 database.

SELECT *  
FROM HumanResources.Employee AS e1  
UNION  
SELECT *  
FROM HumanResources.Employee AS e2  
OPTION (MERGE UNION);  
GO  

5.E. HASH GROUP 및 FAST 사용Using HASH GROUP and FAST

다음 예에서는 HASH GROUP 및 FAST 쿼리 힌트를 사용합니다.The following example uses the HASH GROUP and FAST query hints. 이 예에서는 AdventureWorks2012AdventureWorks2012 데이터베이스를 사용합니다.The example uses the AdventureWorks2012AdventureWorks2012 database.

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    

6.F. MAXDOP 사용Using MAXDOP

다음 예에서는 MAXDOP 쿼리 힌트를 사용합니다.The following example uses the MAXDOP query hint. 이 예에서는 AdventureWorks2012AdventureWorks2012 데이터베이스를 사용합니다.The example uses the AdventureWorks2012AdventureWorks2012 database.

적용 대상: SQL Server 2008SQL Server 2008 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

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

7.G. INDEX 사용Using INDEX

다음 예에서는 INDEX 힌트를 사용합니다.The following examples use the INDEX hint. 첫 번째 예에서는 단일 인덱스를 지정하고,The first example specifies a single index. 두 번째 예에서는 단일 테이블 참조에 대해 여러 인덱스를 지정합니다.The second example specifies multiple indexes for a single table reference. 두 예에서 INDEX 힌트는 별칭을 사용하는 테이블에 적용되므로 TABLE HINT 절에서도 표시된 개체 이름과 동일한 별칭을 지정해야 합니다.In both examples, because the INDEX hint is applied on a table that uses an alias, the TABLE HINT clause must also specify the same alias as the exposed object name. 이 예에서는 AdventureWorks2012AdventureWorks2012 데이터베이스를 사용합니다.The example uses the AdventureWorks2012AdventureWorks2012 database.

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    

8.H. FORCESEEK 사용Using FORCESEEK

다음 예에서는 FORCESEEK 테이블 힌트를 사용합니다.The following example uses the FORCESEEK table hint. 이 예에서 INDEX 힌트는 두 부분으로 된 이름을 사용하는 테이블에 적용되므로 TABLE HINT 절에서도 표시된 개체 이름과 동일한 두 부분으로 된 이름을 지정해야 합니다.Because the INDEX hint is applied on a table that uses a two-part name, the TABLE HINT clause must also specify the same two-part name as the exposed object name. 이 예에서는 AdventureWorks2012AdventureWorks2012 데이터베이스를 사용합니다.The example uses the AdventureWorks2012AdventureWorks2012 database.

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    

9.I. 여러 테이블 힌트 사용Using multiple table hints

다음 예에서는 한 테이블에 INDEX 힌트를 적용하고 다른 테이블에 FORCESEEK 힌트를 적용합니다.The following example applies the INDEX hint to one table and the FORCESEEK hint to another. 이 예에서는 AdventureWorks2012AdventureWorks2012 데이터베이스를 사용합니다.The example uses the AdventureWorks2012AdventureWorks2012 database.

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  

10.J. TABLE HINT를 사용하여 기존 테이블 힌트 다시 정의Using TABLE HINT to override an existing table hint

다음 예에서는 힌트를 지정하지 않고 TABLE HINT 힌트를 사용하여 쿼리의 FROM 절에 지정된 INDEX 테이블의 동작을 다시 정의하는 방법을 보여 줍니다.The following example shows how to use the TABLE HINT hint without specifying a hint to override the behavior of the INDEX table hint specified in the FROM clause of the query. 이 예에서는 AdventureWorks2012AdventureWorks2012 데이터베이스를 사용합니다.The example uses the AdventureWorks2012AdventureWorks2012 database.

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    

11.K. 의미 체계에 영향을 주는 테이블 힌트 지정Specifying semantics-affecting table hints

다음 예의 쿼리에는 두 가지 테이블 힌트가 포함되어 있습니다. 하나는 의미 체계에 영향을 주는 NOLOCK이고 다른 하나는 의미 체계에 영향을 주지 않는 INDEX입니다.The following example contains two table hints in the query: NOLOCK, which is semantic-affecting, and INDEX, which is non-semantic-affecting. 쿼리의 의미 체계를 유지하기 위해 계획 지침의 OPTIONS 절에 NOLOCK 힌트가 지정됩니다.To preserve the semantics of the query, the NOLOCK hint is specified in the OPTIONS clause of the plan guide. NOLOCK 힌트 외에 INDEX 및 FORCESEEK 힌트가 지정되고 문을 컴파일 및 최적화할 때 쿼리에서 의미 체계에 영향을 주지 않는 INDEX 힌트를 대체합니다.In addition to the NOLOCK hint, the INDEX and FORCESEEK hints are specified and replace the non-semantic-affecting INDEX hint in the query when the statement is compiled and optimized. 이 예에서는 AdventureWorks2012AdventureWorks2012 데이터베이스를 사용합니다.The example uses the AdventureWorks2012AdventureWorks2012 database.

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    

다음 예에서는 최적화 프로그램에서 테이블 힌트에 지정된 인덱스 이외의 인덱스를 선택할 수 있도록 하면서 쿼리의 의미 체계를 유지하는 다른 방법을 보여 줍니다.The following example shows an alternative method to preserving the semantics of the query and allowing the optimizer to choose an index other than the index specified in the table hint. 이 작업은 의미 체계에 영향을 주는 NOLOCK 힌트를 OPTIONS 절에 지정하고 테이블 참조만 있고 INDEX 힌트는 없는 TABLE HINT 키워드를 지정하여 수행됩니다.This is done by specifying the NOLOCK hint in the OPTIONS clause (because it is semantic-affecting) and specifying the TABLE HINT keyword with only a table reference and no INDEX hint. 이 예에서는 AdventureWorks2012AdventureWorks2012 데이터베이스를 사용합니다.The example uses the AdventureWorks2012AdventureWorks2012 database.

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  

12.L. USE HINT 사용Using USE HINT

다음 예에서는 RECOMPILE 및 USE HINT 쿼리 힌트를 사용합니다.The following example uses the RECOMPILE and USE HINT query hints. 이 예에서는 AdventureWorks2012AdventureWorks2012 데이터베이스를 사용합니다.The example uses the AdventureWorks2012AdventureWorks2012 database.

적용 대상: Azure SQL 데이터베이스Azure SQL Database, SQL Server 2016(13.x)SQL Server 2016 (13.x)Applies to: Azure SQL 데이터베이스Azure SQL Database, SQL Server 2016(13.x)SQL Server 2016 (13.x).

SELECT * FROM Person.Address  
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (RECOMPILE, USE HINT ('ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES', 'DISABLE_PARAMETER_SNIFFING')); 
GO  

참고 항목See Also

힌트(Transact SQL) Hints (Transact-SQL)
sp_create_plan_guide(Transact-SQL) sp_create_plan_guide (Transact-SQL)
sp_control_plan_guide (Transact-SQL)sp_control_plan_guide (Transact-SQL)
추적 플래그Trace Flags