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

적용 대상: 예SQL Server(2008부터) 예Azure SQL Database 아니요Azure SQL Data Warehouse 아니요병렬 데이터 웨어하우스 APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database noAzure 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가 발생합니다.Error 8622 occurs if one or more query hints cause the query optimizer not to generate a valid plan.

주의

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

구문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 that the query's GROUP BY or DISTINCT clause describes should use hashing or ordering.

{ MERGE | HASH | CONCAT } UNION{ MERGE | HASH | CONCAT } UNION
UNION 집합을 병합, 해시 또는 연결하여 모든 UNION 연산을 실행하도록 지정합니다.Specifies that all UNION operations are run 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 all join operations are performed by LOOP JOIN, MERGE JOIN, or HASH JOIN in the whole query. 조인 힌트를 둘 이상 지정한 경우 최적화 프로그램에서는 허용되는 힌트 중 가장 부담이 적은 조인 방법을 선택합니다.If you specify more than one join hint, the optimizer selects the least expensive join strategy from the allowed ones.

같은 쿼리의 FROM 절에서 특정 테이블 쌍에 대해 조인 힌트를 지정하면 두 테이블의 조인에서 조인 힌트가 우선적으로 적용됩니다.If you specify a join hint in the same query's FROM clause for a specific table pair, this join hint takes precedence in the joining of the two tables. 하지만 쿼리 힌트도 계속 적용되어야 합니다.The query hints, though, must still be honored. 테이블 쌍에 대한 조인 힌트는 쿼리 힌트에서 허용되는 조인 방법의 선택만 제한하게 될 수 있습니다.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 the indexed views are expanded. 또한 쿼리 최적화 프로그램이 인덱싱된 뷰를 쿼리 부분을 대체하는 것으로 간주하도록 지정합니다.Also specifies the query optimizer won't consider any indexed view as a replacement for any query part. 뷰 정의가 쿼리 텍스트에 있는 뷰 이름을 대체하면 뷰가 확장됩니다.A view is expanded when the view definition replaces the view name in the query text.

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

인덱싱된 뷰는 쿼리의 SELECT 부분에서 뷰를 직접 참조하는 경우 축소되어 있습니다.The indexed view remains condensed if there's a direct reference to the view in the query's SELECT part. WITH (NOEXPAND) 또는 WITH (NOEXPAND, INDEX(index_value_ [ ,...n ] ) )를 지정하는 경우에도 뷰는 축소되어 있습니다.The view also remains condensed if you specify WITH (NOEXPAND) or WITH (NOEXPAND, INDEX(index_value_ [ ,...n ] ) ). 쿼리 힌트 NOEXPAND에 대한 자세한 내용은 NOEXPAND 사용을 참조하세요.For more information about the query hint NOEXPAND, see Using NOEXPAND.

힌트는 INSERT, UPDATE, MERGE 및 DELETE 문에 해당 뷰를 포함하여 문의 SELECT 부분에서만 뷰에 영향을 줍니다.The hint only affects the views in the statements' SELECT part, including those views in INSERT, UPDATE, MERGE, and DELETE statements.

FAST number_rowsFAST number_rows
첫 번째 _number_rows_를 빨리 검색하기 위해 쿼리를 최적화하도록 지정합니다.Specifies that the query is optimized for fast retrieval of the first number_rows. 이 결과는 음수가 아닌 정수입니다.This result 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 doesn't 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로 밀어내지 않습니다.Won't push down to Azure storage.

KEEP PLANKEEP PLAN
쿼리 최적화 프로그램에서 쿼리에 대한 예상 다시 컴파일 임계값을 완화하도록 합니다.Forces the query optimizer to relax the estimated recompile threshold for a query. 예상된 다시 컴파일 임계값은 테이블에 다음 문을 실행하여 인덱싱된 열을 예상 수만큼 변경했을 때 쿼리를 자동으로 다시 컴파일하기 시작합니다.The estimated recompile threshold starts an automatic recompile for the query when the estimated number of indexed column changes have been made to a table by running one of the following statements:

  • UPDATEUPDATE
  • DeleteDELETE
  • MERGEMERGE
  • INSERTINSERT

테이블이 자주 업데이트되는 경우 KEEP PLAN을 지정하면 쿼리가 지나치게 자주 다시 컴파일되지 않아 유용합니다.Specifying KEEP PLAN makes sure a query won't be recompiled as frequently when there are multiple updates to a table.

KEEPFIXED PLANKEEPFIXED PLAN
통계 변경 시에 최적화 프로그램이 쿼리를 다시 컴파일하지 않도록 합니다.Forces the query optimizer not to recompile a query because of changes in statistics. KEEPFIXED PLAN을 지정하면 원본으로 사용하는 테이블의 스키마가 바뀌거나 해당 테이블에 대해 sp_recompile이 실행되는 경우에만 쿼리를 다시 컴파일합니다.Specifying KEEPFIXED PLAN makes sure that a query recompiles only if the schema of the underlying tables changes or if sp_recompile runs 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 the 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. 리소스 관리자 설정이 이 힌트에 지정된 값보다 낮은 경우 실제 제한을 더 낮게 설정할 수 있습니다.The actual limit can be lower if the Resource Governor setting is lower than the value specified by this hint. 유효한 값은 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최대 병렬 처리 수준 구성 옵션을 재정의합니다.Overrides the max degree of parallelism configuration option of sp_configure. 또한 이 옵션을 지정하여 쿼리의 Resource Governor를 재정의합니다.Also overrides the 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 isn't 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 ends and an error returns.

이 오류로 인해 문의 모든 결과가 롤백됩니다.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). 일부 시나리오에서는 스풀 연산자로 인해 성능이 저하될 수 있습니다.The spool operator may reduce performance in some scenarios. 예를 들어 스풀 연산과 함께 여러 쿼리가 동시에 실행되는 경우 스풀이 사용하는 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_@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 optimizer's default parameter detection behavior. 계획 지침을 만들 경우에도 OPTIMIZE FOR를 사용합니다.Also use OPTIMIZE FOR 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. 이 최적화에는 강제 매개 변수화를 통해 만든 매개 변수가 포함됩니다.This optimization includes parameters created with forced parameterization.

같은 쿼리 힌트에서 OPTIMIZE FOR @variable_name = literal_constant 및 OPTIMIZE FOR UNKNOWN을 사용하면 쿼리 최적화 프로그램이 특정 값에는 지정된 _literal_constant_를 사용합니다.If you use OPTIMIZE FOR @variable_name = literal_constant and OPTIMIZE FOR UNKNOWN in the same query hint, the query optimizer will use the literal_constant specified for a specific value. 쿼리 최적화 프로그램은 나머지 변수 값에 UNKNOWN을 사용합니다.The query optimizer will use UNKNOWN for the rest of the 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's 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 can't 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 doesn't replace a plan stored in cache when the same query runs 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. 쿼리가 저장 프로시저 안에 있는 경우 매개 변수에 전달된 현재 값을 사용합니다.If the query is inside a stored procedure, the current values passed to any parameters.

RECOMPILE은 저장 프로시저를 만드는 유용한 대체 방법입니다.RECOMPILE is a useful alternative to creating a stored procedure. RECOMPILE은 전체 저장 프로시저가 아닌 저장 프로시저 내 쿼리의 하위 집합만 다시 컴파일해야 하는 경우 WITH RECOMPILE 절을 사용합니다.RECOMPILE 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 when the query is processed. 행이 너무 커서 특정 연산자가 행을 처리하지 못하는 경우도 있습니다.The rows may be so wide that, sometimes, the particular operator can't process the row. 행이 큰 경우 데이터베이스 엔진Database Engine에서는 쿼리 실행 중에 오류를 생성합니다.If rows are that wide, 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 run into this problem.

이 계획이 불가능할 경우 쿼리 최적화 프로그램은 쿼리 실행 시 오류를 검색하도록 지연시키지 않고 오류를 반환합니다.If such a plan isn't 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 comes across 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: 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. 추가 힌트는 작은따옴표 안의 힌트 이름으로 지정됩니다.The additional hints are specified by a hint name inside single quotation marks.

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

  • '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 hint name is parallel to trace flag 9476.

  • 'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES' 'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES'
    SQL ServerSQL Server가 상관 관계에 해당하는 필터에 대해 AND 조건자를 추정할 때 최소 선택을 사용하여 계획을 생성하게 합니다.Causes SQL ServerSQL 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 hint name is parallel 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_BATCH_MODE_ADAPTIVE_JOINS''DISABLE_BATCH_MODE_ADAPTIVE_JOINS'
    일괄 처리 모드 적응 조인을 사용 하지 않습니다.Disables batch mode adaptive joins. 자세한 내용은 일괄 처리 모드 적응 조인을 참조하세요.For more information, see Batch mode Adaptive Joins.

  • '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_DEFERRED_COMPILATION_TV''DISABLE_DEFERRED_COMPILATION_TV'
    테이블 변수 지연 컴파일을 사용하지 않도록 설정합니다.Disables table variable deferred compilation. 자세한 내용은 테이블 변수 지연 컴파일을 참조하세요.For more information, see Table variable deferred compilation.

  • '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_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 hint name is parallel to trace flag 2340.

  • 'DISABLE_OPTIMIZER_ROWGOAL' 'DISABLE_OPTIMIZER_ROWGOAL'
    SQL Server가 다음 키워드를 포함하는 쿼리에 행 목표 수정을 사용하지 않는 계획을 생성하게 합니다.Causes SQL Server to generate a plan that doesn't use row goal modifications with queries that contain these keywords:

    • 맨 위로 이동TOP
    • OPTION (FAST N)OPTION (FAST N)
    • ININ
    • EXISTSEXISTS

    이 힌트 이름은 추적 플래그 4138에 해당합니다.This hint name is parallel to trace flag 4138.

  • 'DISABLE_PARAMETER_SNIFFING''DISABLE_PARAMETER_SNIFFING'
    쿼리 최적화 프로그램이 하나 이상의 매개 변수가 있는 쿼리를 컴파일할 때 평균 데이터 분산을 사용하도록 지시합니다.Instructs query optimizer to use average data distribution while compiling a query with one or more parameters. 이 지시를 통해 쿼리 계획에서는 쿼리를 컴파일할 때 처음 사용된 매개 변수 값이 사용되지 않습니다.This instruction makes the query plan independent on the parameter value that was first used when the query was compiled. 이 힌트 이름은 추적 플래그 4136 또는 PARAMETER_SNIFFING=OFF를 설정하는 데이터베이스 범위 구성에 해당합니다.This hint name is parallel to trace flag 4136 or Database Scoped Configuration setting PARAMETER_SNIFFING=OFF.

  • 'DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK''DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK'
    행 모드 메모리 부여 피드백을 비활성화합니다.Disables row mode memory grant feedback. 자세한 내용은 행 모드 메모리 부여 피드백을 참조하세요.For more information, see Row mode memory grant feedback.

  • 'DISABLE_TSQL_SCALAR_UDF_INLINING''DISABLE_TSQL_SCALAR_UDF_INLINING'
    스칼라 UDF 인라인을 비활성화합니다.Disables scalar UDF inlining. 자세한 내용은 스칼라 UDF 인라인 처리를 참조하세요.For more information, see Scalar UDF Inlining.

  • 'DISALLOW_BATCH_MODE''DISALLOW_BATCH_MODE'
    일괄 처리 모드 실행을 사용하지 않도록 설정합니다.Disables batch mode execution. 자세한 내용은 실행 모드를 참조하세요.For more information, see Execution modes.

  • '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 hint name is parallel to trace flag 4139.

  • '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 hint name is parallel to trace flag 4199 or Database Scoped Configuration setting QUERY_OPTIMIZER_HOTFIXES=ON.

  • '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.

  • '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 hint name is parallel to trace flag 9481 or Database Scoped Configuration setting LEGACY_CARDINALITY_ESTIMATION=ON.

  • 'QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n'
    쿼리 수준에서 쿼리 최적화 프로그램 동작을 적용합니다.Forces the query optimizer behavior at a query level. 이 동작은 쿼리가 데이터베이스 호환성 수준 _n_으로 컴파일된 것처럼 나타납니다. 여기서 _n_은 지원되는 데이터베이스 호환성 수준입니다.This behavior happens as if the query was compiled with database compatibility level n, where n is a supported database compatibility level. _n_에 대해 현재 지원되는 값 목록은 sys.dm_exec_valid_use_hints를 참조하세요.Refer to sys.dm_exec_valid_use_hints for a list of currently supported values for n. 적용 대상: SQL ServerSQL Server (SQL Server 2017(14.x)SQL Server 2017 (14.x) CU10부터)Applies to: SQL ServerSQL Server (starting with SQL Server 2017(14.x)SQL Server 2017 (14.x) CU10).

    참고

    데이터베이스 범위 구성, 추적 플래그 또는 다른 쿼리 힌트(예: QUERYTRACEON)를 통해 적용되는 경우 QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n 힌트는 기본 또는 레거시 카디널리티 예상 설정을 재정의하지 않습니다.The QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n hint doesn't override default or legacy cardinality estimation setting, if it's forced through database scoped configuration, trace flag or another query hint such as QUERYTRACEON.
    이 힌트는 쿼리 최적화 프로그램의 동작에만 영향을 줍니다.This hint only affects the behavior of the query optimizer. 특정 데이터베이스 기능의 가용성과 같이, 데이터베이스 호환성 수준에 따라 달라질 수 있는 SQL ServerSQL Server의 다른 기능에는 영향을 주지 않습니다.It doesn't affect other features of SQL ServerSQL Server that may depend on the database compatibility level, such as the availability of certain database features.
    이 힌트에 대한 자세한 내용은 개발자 선택 사항: 힌트 쿼리 실행 모델을 참조하세요.To learn more about this hint, see Developer's Choice: Hinting Query Execution model.

  • 'QUERY_PLAN_PROFILE''QUERY_PLAN_PROFILE'
    쿼리에 대해 간단한 프로파일링을 사용합니다.Enables lightweight profiling for the query. 이 새 힌트가 포함된 쿼리가 완료되면 새 확장 이벤트 query_plan_profile이 발생합니다.When a query that contains this new hint finishes, a new Extended Event, query_plan_profile, is fired. 이 확장 이벤트는 query_post_execution_showplan 확장 이벤트와 유사한 실행 통계 및 실제 실행 계획 XML을 표시하지만 새 힌트가 포함된 쿼리에 대해서만 표시합니다.This extended event exposes execution statistics and actual execution plan XML similar to the query_post_execution_showplan extended event but only for queries that contains the new hint. 적용 대상: SQL ServerSQL Server (SQL Server 2016(13.x)SQL Server 2016 (13.x) SP2 CU3 및 SQL Server 2017(14.x)SQL Server 2017 (14.x) CU11부터 시작).Applies to: SQL ServerSQL Server (starting with SQL Server 2016(13.x)SQL Server 2016 (13.x) SP2 CU3 and SQL Server 2017(14.x)SQL Server 2017 (14.x) CU11).

    참고

    query_post_execution_showplan 확장 이벤트 수집을 사용하도록 설정하는 경우 서버에서 실행되는 모든 쿼리에 표준 프로파일링 인프라가 추가되므로 전체 서버 성능에 영향을 미칠 수 있습니다.If you enable collecting the query_post_execution_showplan extended event, this will add standard profiling infrastructure to every query that is running on the server and therefore may affect overall server performance.
    대신 query_thread_profile 확장 이벤트의 컬렉션을 사용하도록 설정하여 간단한 프로파일링 인프라를 사용하는 경우 성능 오버헤드가 훨씬 감소하지만 전체 서버 성능에는 여전히 영향을 미칩니다.If you enable the collection of query_thread_profile extended event to use lightweight profiling infrastructure instead, this will result in much less performance overhead but will still affect overall server performance.
    query_plan_profile 확장 이벤트를 사용하도록 설정하는 경우 QUERY_PLAN_PROFILE로 실행된 쿼리의 간단한 프로파일링 인프라만 사용하므로 서버의 다른 워크로드에는 영향을 미치지 않습니다.If you enable the query_plan_profile extended event, this will only enable the lightweight profiling infrastructure for a query that executed with the QUERY_PLAN_PROFILE and therefore will not affect other workloads on the server. 이 힌트를 사용하여 서버 워크로드의 다른 부분에 영향을 미치지 않고 특정 쿼리를 프로파일링하세요.Use this hint to profile a specific query without affecting other parts of the server workload. 간단한 프로파일링에 대한 자세한 내용은 쿼리 프로파일링 인프라를 참조하세요.To learn more about lightweight profiling, see Query Profiling Infrastructure.

지원되는 모든 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.

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

중요

일부 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 can't 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 isn't 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 you specify exposed_object_name without also specifying a table hint, any indexes you specify in the query as part of a table hint for the object are disregarded. 쿼리 최적화 프로그램에서 인덱스 사용 여부를 결정합니다.The query optimizer then determines index usage. 이 방법은 원래 쿼리를 수정할 수 없을 때 INDEX 테이블 힌트의 효과를 제거하는 데 이용할 수 있습니다.You can use this technique to eliminate the effect of an INDEX table hint when you can't 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 can't 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. 테이블 힌트를 쿼리 힌트로 지정하면 해당 힌트를 최상위 쿼리나 하위 쿼리에 지정할 수 있습니다.When a table hint is specified as a query hint, the hint can be specified in the top-level query or in a subquery. 그러나 TABLE HINT 절에서 _exposed_object_name_에 대해 지정한 값이 쿼리 또는 하위 쿼리의 표시 이름과 일치해야 합니다.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 can't modify the original query, for example, because it's a third-party application. 계획 지침에 지정되어 있는 쿼리 힌트는 쿼리가 컴파일 및 최적화되기 전에 쿼리에 추가됩니다.The query hint specified in the plan guide is added to the query before it's 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 테이블 힌트를 지정할 수 있습니다.You can specify INDEX, FORCESCAN, and FORCESEEK table hints as query hints for a query that doesn't have any existing table hints. 이 테이블 힌트를 사용하여 각각 쿼리에 있는 기존 INDEX, FORCESCAN 또는 FORCESEEK 힌트를 바꿀 수도 있습니다.You can also use them 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. 이 경우 일치하는 힌트를 쿼리 힌트로 지정해야 합니다.In this case, a matching hint must also be specified as a query hint. OPTION 절에 TABLE HINT를 사용하여 일치하는 힌트를 쿼리 힌트로 지정합니다.Specify the matching hint as a query hint by using TABLE HINT in the OPTION clause. 이렇게 지정하면 쿼리의 의미 체계가 유지됩니다.This specification preserves the query's semantics. 예를 들어 쿼리에 테이블 힌트 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. 예 11을 참조하세요.See Example K.

몇 가지 시나리오에서는 오류 8072가 발생합니다.Error 8072 occurs in a couple of scenarios. 한 가지 시나리오는 일치하는 쿼리 힌트 없이 OPTION 절에 TABLE HINT를 사용하여 INDEX, FORCESCAN 또는 FORCESEEK 이외의 테이블 힌트를 지정하는 경우입니다.One is when you specify a table hint other than INDEX, FORCESCAN, or FORCESEEK by using TABLE HINT in the OPTION clause without a matching query hint. 두 번째 시나리오는 그 반대의 경우입니다.The second scenario is the other way around. 이 오류는 OPTION 절로 인해 쿼리의 의미 체계가 변경되고 쿼리가 실패할 수 있음을 나타냅니다.This error indicates the OPTION clause can cause the semantics of the query to change, and the query fails.

Examples

1.A. MERGE JOIN 사용Using MERGE JOIN

다음 예에서는 MERGE JOIN이 쿼리에서 조인 작업을 실행하도록 지정합니다.The following example specifies that MERGE JOIN runs the JOIN operation in the query. 이 예에서는 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  

C.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.

D.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  

E.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    

F.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

G.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 you apply the INDEX hint 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    

H.H. FORCESEEK 사용Using FORCESEEK

다음 예에서는 FORCESEEK 테이블 힌트를 사용합니다.The following example uses the FORCESEEK table hint. TABLE HINT 절에서도 표시된 개체 이름과 동일한 두 부분으로 된 이름을 지정해야 합니다.The TABLE HINT clause must also specify the same two-part name as the exposed object name. 두 부분으로 된 이름을 사용하는 테이블에서 INDEX 힌트를 적용할 때 이름을 지정합니다.Specify the name when you apply the INDEX hint on a table that uses a two-part 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  

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

다음 예에서는 TABLE HINT 힌트를 사용하는 방법을 보여 줍니다.The following example shows how to use the TABLE HINT hint. 힌트를 지정하지 않고 힌트를 사용하여 쿼리의 FROM 절에서 지정하는 INDEX 테이블 힌트 동작을 재정의할 수 있습니다.You can use the hint without specifying a hint to override the INDEX table hint behavior you specify 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 힌트를 대체합니다.Along with the NOLOCK hint, specify the INDEX and FORCESEEK hints and replace the non-semantic-affecting INDEX hint in the query during statement compilation and optimization. 이 예에서는 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. OPTIONS 절에서 NOLOCK 힌트를 지정하여 최적화 프로그램이 선택할 수 있도록 합니다.Allow the optimizer to choose by specifying the NOLOCK hint in the OPTIONS clause. 의미 체계에 영향을 주기 때문에 힌트를 지정합니다.You specify the hint because it's semantic-affecting. 그런 다음, INDEX 힌트 없이 테이블 참조만 사용하여 TABLE HINT 키워드를 지정합니다.Then, specify 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
Transact-SQL 구문 표기 규칙Transact-SQL Syntax Conventions