힌트(Transact-SQL) - 테이블Hints (Transact-SQL) - Table

적용 대상: 예SQL Server 예Azure SQL Database 아니요Azure Synapse Analytics(SQL DW) 아니요병렬 데이터 웨어하우스 APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

테이블 힌트는 잠금 메서드, 하나 이상의 인덱스, Table Scan 또는 Index Seek와 같은 쿼리 처리 연산이나 기타 옵션을 지정하여 DML(데이터 조작 언어) 문이 실행되는 동안 쿼리 최적화 프로그램의 기본 동작을 무시합니다.Table hints override the default behavior of the query optimizer for the duration of the data manipulation language (DML) statement by specifying a locking method, one or more indexes, a query-processing operation such as a table scan or index seek, or other options. 테이블 힌트는 DML 문의 FROM 절에서 지정하며 해당 절에서 참조되는 테이블이나 뷰에만 영향을 줍니다.Table hints are specified in the FROM clause of the DML statement and affect only the table or view referenced in that clause.

주의

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

적용 대상:Applies to:

DELETEDELETE

INSERTINSERT

SELECTSELECT

UPDATEUPDATE

MERGEMERGE

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

구문Syntax

WITH  ( <table_hint> [ [, ]...n ] )  
  
<table_hint> ::=   
[ NOEXPAND ] {   
    INDEX  ( index_value [ ,...n ] )   
  | INDEX =  ( index_value )      
  | FORCESEEK [( index_value ( index_column_name  [ ,... ] ) ) ]  
  | FORCESCAN  
  | FORCESEEK  
  | HOLDLOCK   
  | NOLOCK   
  | NOWAIT  
  | PAGLOCK   
  | READCOMMITTED   
  | READCOMMITTEDLOCK   
  | READPAST   
  | READUNCOMMITTED   
  | REPEATABLEREAD   
  | ROWLOCK   
  | SERIALIZABLE   
  | SNAPSHOT   
  | SPATIAL_WINDOW_MAX_CELLS = integer  
  | TABLOCK   
  | TABLOCKX   
  | UPDLOCK   
  | XLOCK   
}   
  
<table_hint_limited> ::=  
{  
    KEEPIDENTITY   
  | KEEPDEFAULTS   
  | HOLDLOCK   
  | IGNORE_CONSTRAINTS   
  | IGNORE_TRIGGERS   
  | NOLOCK   
  | NOWAIT  
  | PAGLOCK   
  | READCOMMITTED   
  | READCOMMITTEDLOCK   
  | READPAST   
  | REPEATABLEREAD   
  | ROWLOCK   
  | SERIALIZABLE   
  | SNAPSHOT   
  | TABLOCK   
  | TABLOCKX   
  | UPDLOCK   
  | XLOCK   
}   

인수Arguments

WITH ( <table_hint> ) [ [ , ]...n ]WITH ( <table_hint> ) [ [, ]...n ]
몇 가지 예외가 있지만 테이블 힌트는 WITH 키워드를 사용하여 힌트를 지정할 때만 FROM 절에서 지원됩니다.With some exceptions, table hints are supported in the FROM clause only when the hints are specified with the WITH keyword. 또한 테이블 힌트는 괄호로 묶어 지정해야 합니다.Table hints also must be specified with parentheses.

중요

WITH 키워드 생략은 더 이상 사용되지 않습니다. 이 기능은 유지 관리 모드에 있으며, Microsoft SQL Server의 이후 버전에서는 이 기능이 제거됩니다.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 애플리케이션은 수정하세요.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.Omitting the WITH keyword is a deprecated feature: 이 기능은 유지 관리 모드에 있으며, Microsoft SQL Server의 이후 버전에서는 이 기능이 제거됩니다.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 애플리케이션은 수정하세요.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

NOLOCK, READUNCOMMITTED, UPDLOCK, REPEATABLEREAD, SERIALIZABLE, READCOMMITTED, TABLOCK, TABLOCKX, PAGLOCK, ROWLOCK, NOWAIT, READPAST, XLOCK, SNAPSHOT 및 NOEXPAND 테이블 힌트를 WITH 키워드와 함께 또는 WITH 키워드 없이 사용할 수 있습니다.The following table hints are allowed with and without the WITH keyword: NOLOCK, READUNCOMMITTED, UPDLOCK, REPEATABLEREAD, SERIALIZABLE, READCOMMITTED, TABLOCK, TABLOCKX, PAGLOCK, ROWLOCK, NOWAIT, READPAST, XLOCK, SNAPSHOT, and NOEXPAND. 이러한 테이블 힌트를 WITH 키워드 없이 지정하는 경우 힌트를 단독으로 지정해야 합니다.When these table hints are specified without the WITH keyword, the hints should be specified alone. 예를 들어For example:

FROM t (TABLOCK)  

힌트를 다른 옵션과 함께 지정하는 경우 다음과 같이 힌트를 WITH 키워드로 지정해야 합니다.When the hint is specified with another option, the hint must be specified with the WITH keyword:

FROM t WITH (TABLOCK, INDEX(myindex))  

테이블 힌트 사이에는 쉼표를 사용하는 것이 좋습니다.We recommend using commas between table hints.

중요

힌트를 구분할 때 쉼표 대신 공백은 더 이상 사용할 수 없습니다. Microsoft SQL Server의 이후 버전에서는 이 기능이 제거됩니다.This feature will be removed in a future version of Microsoft SQL Server. 새 개발 작업에서는 이 기능을 사용하지 말고, 현재 이 기능을 사용하는 애플리케이션은 가능한 한 빨리 수정하세요.Do not use this feature in new development work, and modify applications that currently use this feature as soon as possible.Separating hints by spaces rather than commas is a deprecated feature: Microsoft SQL Server의 이후 버전에서는 이 기능이 제거됩니다.This feature will be removed in a future version of Microsoft SQL Server. 새 개발 작업에서는 이 기능을 사용하지 말고, 현재 이 기능을 사용하는 애플리케이션은 가능한 한 빨리 수정하세요.Do not use this feature in new development work, and modify applications that currently use this feature as soon as possible.

NOEXPANDNOEXPAND
쿼리 최적화 프로그램에서 쿼리를 처리할 때 기본 테이블에 액세스하기 위해 인덱싱된 뷰를 확장하지 않도록 지정합니다.Specifies that any indexed views are not expanded to access underlying tables when the query optimizer processes the query. 쿼리 최적화 프로그램은 뷰를 클러스터형 인덱스가 있는 테이블처럼 처리합니다.The query optimizer treats the view like a table with clustered index. NOEXPAND는 인덱싱된 뷰에만 적용됩니다.NOEXPAND applies only to indexed views. 자세한 내용은 NOEXPAND 사용을 참조하세요.For more information, see Using NOEXPAND.

INDEX ( index_value [ , ... n ] ) | INDEX = ( index_value )INDEX (index_value [,... n ] ) | INDEX = ( index_value)
INDEX() 구문은 쿼리 최적화 프로그램이 문을 처리할 때 사용할 인덱스 하나 이상의 이름이나 ID를 지정합니다.The INDEX() syntax specifies the names or IDs of one or more indexes to be used by the query optimizer when it processes the statement. 대체 INDEX = 구문은 단일 인덱스 값을 지정하며The alternative INDEX = syntax specifies a single index value. 테이블당 하나의 인덱스 힌트만 지정할 수 있습니다.Only one index hint per table can be specified.

클러스터형 인덱스가 있는 경우에는 INDEX(0)이 클러스터형 인덱스 검색을 강제 실행하고 INDEX(1)이 클러스터형 인덱스 검색 또는 찾기를 강제 실행합니다.If a clustered index exists, INDEX(0) forces a clustered index scan and INDEX(1) forces a clustered index scan or seek. 클러스터형 인덱스가 없는 경우 INDEX(0)은 테이블 검색을 강제 실행하고 INDEX(1)은 오류로 해석됩니다.If no clustered index exists, INDEX(0) forces a table scan and INDEX(1) is interpreted as an error.

단일 힌트 목록에서 여러 인덱스가 사용되는 경우에는 중복이 무시되고 나열된 인덱스 중 나머지를 사용하여 테이블의 행을 검색합니다.If multiple indexes are used in a single hint list, the duplicates are ignored and the rest of the listed indexes are used to retrieve the rows of the table. 이때 인덱스 힌트에 있는 인덱스의 순서가 중요합니다.The order of the indexes in the index hint is significant. 여러 인덱스 힌트는 또한 인덱스 AND 연산을 강제 실행하고 쿼리 최적화 프로그램은 액세스되는 각 인덱스에 대해 가능한 한 많은 조건을 적용합니다.A multiple index hint also enforces index ANDing, and the query optimizer applies as many conditions as possible on each index accessed. 인덱스 힌트 컬렉션에 쿼리에서 참조하는 모든 열이 포함되지 않은 경우 SQL Server 데이터베이스 엔진SQL Server Database Engine이 모든 인덱싱된 열을 검색한 후 인출을 수행하여 남은 열을 검색합니다.If the collection of hinted indexes do not include all columns referenced by the query, a fetch is performed to retrieve the remaining columns after the SQL Server 데이터베이스 엔진SQL Server Database Engine retrieves all the indexed columns.

참고

여러 인덱스를 참조하는 인덱스 힌트가 스타 조인의 팩트 테이블에 사용되는 경우 최적화 프로그램은 인덱스 힌트를 무시하고 경고 메시지를 반환합니다.When an index hint referring to multiple indexes is used on the fact table in a star join, the optimizer ignores the index hint and returns a warning message. 또한 인덱스 힌트가 지정된 테이블에 대해서는 인덱스 OR 연산을 사용할 수 없습니다.Also, index ORing is not allowed for a table with an index hint specified.

테이블 힌트의 최대 인덱스 수는 비클러스터형 인덱스 250개입니다.The maximum number of indexes in the table hint is 250 nonclustered indexes.

KEEPIDENTITYKEEPIDENTITY
BULK 옵션이 OPENROWSET와 함께 사용되는 경우 INSERT 문에만 적용됩니다.Is applicable only in an INSERT statement when the BULK option is used with OPENROWSET.

가져온 데이터 파일의 ID 값이 ID 열에 사용되도록 지정합니다.Specifies that identity value or values in the imported data file are to be used for the identity column. KEEPIDENTITY를 지정하지 않는 경우 이 열의 ID 값을 확인하지만 가져오지는 않으며 쿼리 최적화 프로그램은 테이블 생성 중에 지정된 초기값 및 증가값에 따라 고유 값을 자동으로 할당합니다.If KEEPIDENTITY is not specified, the identity values for this column are verified but not imported and the query optimizer automatically assigns unique values based on the seed and increment values specified during table creation.

중요

데이터 파일의 테이블 또는 뷰에서 ID 열에 값이 없고 ID 열이 테이블의 마지막 열이 아닌 경우 ID 열을 건너뛰어야 합니다.If the data file does not contain values for the identity column in the table or view, and the identity column is not the last column in the table, you must skip the identity column. 자세한 내용은 서식 파일을 사용하여 데이터 필드 건너뛰기(SQL Server)를 참조하세요.For more information, see Use a Format File to Skip a Data Field (SQL Server). ID 열을 성공적으로 건너뛰면 쿼리 최적화 프로그램은 가져온 테이블 행에 ID 열의 고유 값을 자동으로 할당합니다.If an identity column is skipped successfully, the query optimizer automatically assigns unique values for the identity column into the imported table rows.

INSERT ... SELECT * FROM OPENROWSET(BULK...) 문에서 이 힌트를 사용하는 예제는 데이터 대량 가져오기 중 ID 값 유지(SQL Server)를 참조하세요.For an example that uses this hint in an INSERT ... SELECT * FROM OPENROWSET(BULK...) statement, see Keep Identity Values When Bulk Importing Data (SQL Server).

테이블에 대한 ID 값을 확인하는 방법에 대한 내용은 DBCC CHECKIDENT(Transact-SQL)를 참조하세요.For information about checking the identity value for a table, see DBCC CHECKIDENT (Transact-SQL).

KEEPDEFAULTSKEEPDEFAULTS
BULK 옵션이 OPENROWSET와 함께 사용되는 경우 INSERT 문에만 적용됩니다.Is applicable only in an INSERT statement when the BULK option is used with OPENROWSET.

데이터 레코드에 열의 값이 없는 경우 NULL 대신 테이블 열의 기본값(있는 경우)을 삽입하도록 지정합니다.Specifies insertion of a table column's default value, if any, instead of NULL when the data record lacks a value for the column.

INSERT ... SELECT * FROM OPENROWSET (BULK ...) 문에서 이 힌트를 사용하는 예제는 대량 가져오기 수행 중 Null 유지 또는 기본값 사용(SQL Server)을 참조하세요.For an example that uses this hint in an INSERT ... SELECT * FROM OPENROWSET(BULK...) statement, see Keep Nulls or Use Default Values During Bulk Import (SQL Server).

FORCESEEK [ ( index_value ( index_column_name [ , ... n ] )) ]FORCESEEK [ (index_value(index_column_name [ ,... n ] )) ]
쿼리 최적화 프로그램이 테이블 또는 뷰의 데이터에 대한 액세스 경로로 Index Seek 연산만 사용하도록 지정합니다.Specifies that the query optimizer use only an index seek operation as the access path to the data in the table or view.

참고

SQL Server 2008 R2SQL Server 2008 R2 SP1부터는 인덱스 매개 변수도 지정할 수 있습니다.Starting with SQL Server 2008 R2SQL Server 2008 R2 SP1, index parameters can also be specified. 이 경우 쿼리 최적화 프로그램이 최소 지정된 인덱스 열을 사용하여 지정된 인덱스 전체에서 Index Seek 연산만 고려합니다.In that case, the query optimizer considers only index seek operations through the specified index using at least the specified index columns.

index_valueindex_value
인덱스 이름 또는 인덱스 ID 값입니다.Is the index name or index ID value. 인덱스 ID 0(힙)은 지정할 수 없습니다.The index ID 0 (heap) cannot be specified. 인덱스 이름 또는 ID를 반환하려면 sys.indexes 카탈로그 뷰를 쿼리합니다.To return the index name or ID, query the sys.indexes catalog view.

index_column_nameindex_column_name
Seek 연산에 포함하려는 인덱스 열의 이름입니다.Is the name of the index column to include in the seek operation. 인덱스 매개 변수와 함께 FORCESEEK를 지정하는 것은 INDEX 힌트와 함께 FORCESEEK를 사용하는 것과 유사합니다.Specifying FORCESEEK with index parameters is similar to using FORCESEEK with an INDEX hint. 그러나 검색할 인덱스와 Seek 연산에서 고려하는 인덱스 열을 모두 지정하여 쿼리 최적화 프로그램에 사용되는 액세스 경로를 더 많이 제어할 수 있습니다.However, you can achieve greater control over the access path used by the query optimizer by specifying both the index to seek on and the index columns to consider in the seek operation. 최적화 프로그램은 필요할 경우 추가 열을 고려할 수도 있습니다.The optimizer may consider additional columns if needed. 예를 들어, 비클러스터형 인덱스가 지정될 경우 최적화 프로그램은 지정된 열과 함께 클러스터형 인덱스 키 열을 사용하도록 선택할 수도 있습니다.For example, if a nonclustered index is specified, the optimizer may choose to use clustered index key columns in addition to the specified columns.

FORCESEEK 힌트는 다음과 같은 방법으로 지정할 수 있습니다.The FORCESEEK hint can be specified in the following ways.

구문Syntax 예제Example 설명Description
인덱스 또는 INDEX 힌트 없이 사용Without an index or INDEX hint FROM dbo.MyTable WITH (FORCESEEK) 쿼리 최적화 프로그램이 Index Seek 연산만 고려하여 모든 관련 인덱스 전체에서 테이블 또는 뷰에 액세스합니다.The query optimizer considers only index seek operations to access the table or view through any relevant index.
INDEX 힌트와 함께 사용Combined with an INDEX hint FROM dbo.MyTable WITH (FORCESEEK, INDEX (MyIndex)) 쿼리 최적화 프로그램이 Index Seek 연산만 고려하여 지정된 인덱스 전체에서 테이블 또는 뷰에 액세스합니다.The query optimizer considers only index seek operations to access the table or view through the specified index.
인덱스 및 인덱스 열을 지정하여 매개 변수 있음Parameterized by specifying an index and index columns FROM dbo.MyTable WITH (FORCESEEK (MyIndex (col1, col2, col3))) 쿼리 최적화 프로그램이 최소 지정된 인덱스 열을 사용하여 지정된 인덱스 전체에서 Index Seek 연산만 고려하여 테이블 또는 뷰에 액세스합니다.The query optimizer considers only index seek operations to access the table or view through the specified index using at least the specified index columns.

FORCESEEK 힌트(인덱스 매개 변수와 함께 또는 없이)를 사용할 경우 다음 지침을 고려합니다.When using the FORCESEEK hint (with or without index parameters), consider the following guidelines:

  • 힌트는 테이블 힌트 또는 쿼리 힌트로 지정될 수 있습니다.The hint can be specified as a table hint or as a query hint. 쿼리 힌트에 대한 자세한 내용은 쿼리 힌트(Transact-SQL)를 참조하세요.For more information about query hints, see Query Hints (Transact-SQL).
  • FORCESEEK를 인덱싱된 뷰로 적용하려면 NOEXPAND 힌트도 지정해야 합니다.To apply FORCESEEK to an indexed view, the NOEXPAND hint must also be specified.
  • 힌트는 테이블 또는 뷰마다 최대 한 번 적용될 수 있습니다.The hint can be applied at most once per table or view.
  • 원격 데이터 원본에 대해서는 힌트를 지정할 수 없습니다.The hint cannot be specified for a remote data source. 오류 7377은 FORCESEEK가 인덱스 힌트와 함께 지정될 때 반환되고 오류 8180은 FORCESEEK가 인덱스 힌트 없이 사용될 때 반환됩니다.Error 7377 is returned when FORCESEEK is specified with an index hint and error 8180 is returned when FORCESEEK is used without an index hint.
  • FORCESEEK로 계획이 검색되지 않으면 오류 8622가 반환됩니다.If FORCESEEK causes no plan to be found, error 8622 is returned.

FORCESEEK가 인덱스 매개 변수와 함께 지정된 경우 다음 지침과 제한이 적용됩니다.When FORCESEEK is specified with index parameters, the following guidelines and restrictions apply:

  • INSERT, UPDATE 또는 DELETE 문의 대상인 테이블에는 힌트를 지정할 수 없습니다.The hint cannot be specified for a table that is the target of an INSERT, UPDATE, or DELETE statement.
  • 힌트는 INDEX 힌트 또는 기타 FORCESEEK 힌트와 함께 지정할 수 없습니다.The hint cannot be specified in combination with either an INDEX hint or another FORCESEEK hint.
  • 최소 하나의 열이 지정되어야 하고 선행 키 열이어야 합니다.At least one column must be specified and it must be the leading key column.
  • 추가 인덱스 열을 지정할 수 있지만 키 열은 건너뛸 수 없습니다.Additional index columns can be specified, however, key columns cannot be skipped. 예를 들어 지정된 인덱스가 키 열을 포함할 경우 a, b, c 및 유효한 구문은 FORCESEEK (MyIndex (a))FORCESEEK (MyIndex (a, b)를 포함합니다.For example, if the specified index contains the key columns a, b, and c, valid syntax would include FORCESEEK (MyIndex (a)) and FORCESEEK (MyIndex (a, b). 유효하지 않은 구문은 FORCESEEK (MyIndex (c))FORCESEEK (MyIndex (a, c)를 포함합니다.Invalid syntax would include FORCESEEK (MyIndex (c)) and FORCESEEK (MyIndex (a, c).
  • 힌트에서 지정한 열 이름 순서는 반드시 참조된 인덱스에 있는 열 순서와 일치해야 합니다.The order of column names specified in the hint must match the order of the columns in the referenced index.
  • 인덱스 키 정의에 없는 열은 지정할 수 없습니다.Columns that are not in the index key definition cannot be specified. 예를 들어 비클러스터형 인덱스에서는 정의된 인덱스 키 열만 지정할 수 있습니다.For example, in a nonclustered index, only the defined index key columns can be specified. 인덱스에 자동으로 포함된 클러스터형 키 열은 지정될 수 없지만 최적화 프로그램에서 사용될 수 있습니다.Clustered key columns that are automatically included in the index cannot be specified, but may be used by the optimizer.
  • xVelocity 메모리 액세스에 최적화된 columnstore 인덱스는 인덱스 매개 변수로 지정할 수 없습니다.An xVelocity memory optimized columnstore index cannot be specified as an index parameter. 오류 366이 반환됩니다.Error 366 is returned.
  • 열을 추가하거나 제거하여 인덱스 정의를 수정하려면 해당 인덱스를 참조하는 쿼리를 수정해야 할 수도 있습니다.Modifying the index definition (for example, by adding or removing columns) may require modifications to the queries that reference that index.
  • 힌트는 최적화 프로그램이 테이블의 모든 공간 또는 XML 인덱스를 고려하지 않도록 합니다.The hint prevents the optimizer from considering any spatial or XML indexes on the table.
  • 힌트는 FORCESCAN 힌트와 함께 지정할 수 없습니다.The hint cannot be specified in combination with the FORCESCAN hint.
  • 분할된 인덱스의 경우 SQL ServerSQL Server에서 암시적으로 추가된 분할 열은 FORCESEEK 힌트에 지정할 수 없습니다.For partitioned indexes, the partitioning column implicitly added by SQL ServerSQL Server cannot be specified in the FORCESEEK hint.

주의

매개 변수와 함께 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. 이로 인해 더 많은 사례에서 Plan cannot be generated 오류가 발생할 수 있습니다.This may cause a Plan cannot be generated error to occur in more cases. 후속 릴리스에서는 더 많은 계획을 고려할 수 있도록 쿼리 최적화 프로그램이 수정될 것입니다.In a future release, internal modifications to the query optimizer may allow more plans to be considered.

FORCESCAN 적용 대상: SQL Server 2008 R2SQL Server 2008 R2 SP1 이상FORCESCAN Applies to: SQL Server 2008 R2SQL Server 2008 R2 SP1 and later. 쿼리 최적화 프로그램이 참조된 테이블 또는 뷰의 액세스 경로로 인덱스 검색 작업만 사용하도록 지정합니다.Specifies that the query optimizer use only an index scan operation as the access path to the referenced table or view. FORCESCAN 힌트는 최적화 프로그램이 영향을 받는 행의 수를 과소평가하고 검색 작업 대신 Seek 연산을 선택하는 경우 쿼리에 유용할 수 있습니다.The FORCESCAN hint can be useful for queries in which the optimizer underestimates the number of affected rows and chooses a seek operation rather than a scan operation. 이러한 경우 작업에 할당되는 메모리 양이 적으며 쿼리 성능에도 영향을 줍니다.When this occurs, the amount of memory granted for the operation is too small and query performance is impacted.

FORCESCAN은 인덱스 힌트와 함께 또는 인덱스 힌트 없이 지정할 수 있습니다.FORCESCAN can be specified with or without an INDEX hint. 인덱스 힌트와 함께 사용할 경우(INDEX = index_name, FORCESCAN) 쿼리 최적화 프로그램은 참조 테이블에 액세스할 때 지정된 인덱스 전체에서 검색 액세스 경로만 고려합니다.When combined with an index hint, (INDEX = index_name, FORCESCAN), the query optimizer considers only scan access paths through the specified index when accessing the referenced table. 기본 테이블에 대해 테이블 검색 작업이 강제로 수행되도록 하기 위해 FORCESCAN을 인덱스 힌트 INDEX(0)와 함께 지정할 수 없습니다.FORCESCAN can be specified with the index hint INDEX(0) to force a table scan operation on the base table.

분할된 테이블과 인덱스의 경우 FORCESCAN은 파티션이 쿼리 조건자 평가를 통해 제거된 이후에 적용됩니다.For partitioned tables and indexes, FORCESCAN is applied after partitions have been eliminated through query predicate evaluation. 즉, 검색은 전체 테이블이 아니라 나머지 파티션에만 적용됩니다.This means that the scan is applied only to the remaining partitions and not to the entire table.

FORCESCAN 힌트는 다음과 같은 제한 사항이 있습니다.The FORCESCAN hint has the following restrictions:

  • INSERT, UPDATE 또는 DELETE 문의 대상인 테이블에는 힌트를 지정할 수 없습니다.The hint cannot be specified for a table that is the target of an INSERT, UPDATE, or DELETE statement.
  • 힌트를 두 개 이상의 인덱스 힌트와 함께 사용할 수 없습니다.The hint cannot be used with more than one index hint.
  • 힌트는 최적화 프로그램이 테이블의 모든 공간 또는 XML 인덱스를 고려하지 않도록 합니다.The hint prevents the optimizer from considering any spatial or XML indexes on the table.
  • 원격 데이터 원본에 대해서는 힌트를 지정할 수 없습니다.The hint cannot be specified for a remote data source.
  • 힌트는 FORCESEEK 힌트와 함께 지정할 수 없습니다.The hint cannot be specified in combination with the FORCESEEK hint.

HOLDLOCKHOLDLOCK
SERIALIZABLE과 동일합니다.Is equivalent to SERIALIZABLE. 자세한 내용은 이 항목의 뒷부분에 나오는 SERIALIZABLE을 참조하세요.For more information, see SERIALIZABLE later in this topic. HOLDLOCK은 이 옵션이 지정된 테이블 또는 뷰에 대해 이 옵션이 사용된 문이 정의한 트랜잭션이 완료될 때까지만 적용됩니다.HOLDLOCK applies only to the table or view for which it is specified and only for the duration of the transaction defined by the statement that it is used in. HOLDLOCK은 FOR BROWSE 옵션이 포함된 SELECT 문에 사용할 수 없습니다.HOLDLOCK cannot be used in a SELECT statement that includes the FOR BROWSE option.

IGNORE_CONSTRAINTSIGNORE_CONSTRAINTS
BULK 옵션이 OPENROWSET와 함께 사용되는 경우 INSERT 문에만 적용됩니다.Is applicable only in an INSERT statement when the BULK option is used with OPENROWSET.

대량 가져오기 작업에서 테이블의 모든 제약 조건을 무시하도록 지정합니다.Specifies that any constraints on the table are ignored by the bulk-import operation. 기본적으로 INSERT는 Unique 제약 조건 및 Check 제약 조건Primary Key 및 Foreign Key 제약 조건을 검사합니다.By default, INSERT checks Unique Constraints and Check Constraints and Primary and Foreign Key Constraints. 대량 가져오기 작업에 IGNORE_CONSTRAINTS가 지정된 경우 INSERT는 대상 테이블의 이러한 제약 조건을 무시해야 합니다.When IGNORE_CONSTRAINTS is specified for a bulk-import operation, INSERT must ignore these constraints on a target table. UNIQUE, PRIMARY KEY 또는 NOT NULL 제약 조건은 비활성화할 수 없습니다.Note that you cannot disable UNIQUE, PRIMARY KEY, or NOT NULL constraints.

입력 데이터에 제약 조건을 위반하는 행이 포함된 경우에는 CHECK 및 FOREIGN KEY 제약 조건을 비활성화할 수 있습니다.You might want to disable CHECK and FOREIGN KEY constraints if the input data contains rows that violate constraints. CHECK 및 FOREIGN KEY 제약 조건을 비활성화하여 데이터를 가져온 다음 Transact-SQLTransact-SQL 문을 사용하여 데이터를 정리할 수 있습니다.By disabling the CHECK and FOREIGN KEY constraints, you can import the data and then use Transact-SQLTransact-SQL statements to clean up the data.

그러나 CHECK 및 FOREIGN KEY 제약 조건이 무시되는 경우, 테이블에서 무시된 각 제약 조건은 작업 후에 sys.check_constraints 또는 sys.foreign_keys 카탈로그 뷰에서 is_not_trusted로 표시됩니다.However, when CHECK and FOREIGN KEY constraints are ignored, each ignored constraint on the table is marked as is_not_trusted in the sys.check_constraints or sys.foreign_keys catalog view after the operation. 어느 시점에서는 전체 테이블의 제약 조건을 확인해야 합니다.At some point, you should check the constraints on the whole table. 대량 가져오기 작업을 수행하기 전에 테이블이 비어 있지 않으면 제약 조건의 유효성을 다시 검사하는 비용이 증분 데이터에 CHECK 및 FOREIGN KEY 제약 조건을 적용하는 비용을 초과할 수 있습니다.If the table was not empty before the bulk import operation, the cost of revalidating the constraint may exceed the cost of applying CHECK and FOREIGN KEY constraints to the incremental data.

IGNORE_TRIGGERSIGNORE_TRIGGERS
BULK 옵션이 OPENROWSET와 함께 사용되는 경우 INSERT 문에만 적용됩니다.Is applicable only in an INSERT statement when the BULK option is used with OPENROWSET.

대량 가져오기 작업에서 테이블에 정의된 모든 트리거를 무시하도록 지정합니다.Specifies that any triggers defined on the table are ignored by the bulk-import operation. 기본적으로 INSERT는 트리거를 적용합니다.By default, INSERT applies triggers.

애플리케이션이 트리거에 의존하지 않으며 성능을 최대화해야 하는 경우에만 IGNORE_TRIGGERS를 사용하세요.Use IGNORE_TRIGGERS only if your application does not depend on any triggers and maximizing performance is important.

NOLOCKNOLOCK
READUNCOMMITTED와 동일합니다.Is equivalent to READUNCOMMITTED. 자세한 내용은 이 항목의 뒷부분에 나오는 READUNCOMMITTED를 참조하세요.For more information, see READUNCOMMITTED later in this topic.

참고

UPDATE 또는 DELETE 문의 경우: 이 기능은 유지 관리 모드에 있으며, Microsoft SQL Server의 이후 버전에서는 이 기능이 제거됩니다.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 애플리케이션은 수정하세요.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.For UPDATE or DELETE statements: 이 기능은 유지 관리 모드에 있으며, Microsoft SQL Server의 이후 버전에서는 이 기능이 제거됩니다.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 애플리케이션은 수정하세요.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

NOWAITNOWAIT
테이블에 잠금이 있으면 데이터베이스 엔진Database Engine에서 바로 메시지를 반환하도록 지정합니다.Instructs the 데이터베이스 엔진Database Engine to return a message as soon as a lock is encountered on the table. NOWAIT는 특정 테이블에 SET LOCK_TIMEOUT 0을 지정하는 것과 동일합니다.NOWAIT is equivalent to specifying SET LOCK_TIMEOUT 0 for a specific table. TABLOCK 힌트도 포함되어 있는 경우 NOWAIT 힌트가 작동하지 않습니다.The NOWAIT hint does not work when the TABLOCK hint is also included. TABLOCK 힌트를 사용할 때 기다리지 않고 쿼리를 종료하려면 쿼리 앞에 SETLOCK_TIMEOUT 0;을 대신 추가하세요.To terminate a query without waiting when using the TABLOCK hint, preface the query with SETLOCK_TIMEOUT 0; instead.

PAGLOCKPAGLOCK
일반적으로 행 또는 키에 개별 잠금이 사용되거나 일반적으로 단일 테이블 잠금이 사용되는 곳에서 페이지 잠금을 사용합니다.Takes page locks either where individual locks are ordinarily taken on rows or keys, or where a single table lock is ordinarily taken. 기본적으로 작업에 적합한 잠금 모드를 사용합니다.By default, uses the lock mode appropriate for the operation. SNAPSHOT 격리 수준에서 작동하는 트랜잭션에 지정하는 경우 UPDLOCK 및 HOLDLOCK과 같은 잠금이 필요한 다른 테이블 힌트와 함께 PAGLOCK을 사용하지 않으면 페이지 잠금이 수행되지 않습니다.When specified in transactions operating at the SNAPSHOT isolation level, page locks are not taken unless PAGLOCK is combined with other table hints that require locks, such as UPDLOCK and HOLDLOCK.

READCOMMITTEDREADCOMMITTED
읽기 작업이 잠금 또는 행 버전 관리를 사용하여 READ COMMITTED 격리 수준에 대한 규칙을 따르도록 지정합니다.Specifies that read operations comply with the rules for the READ COMMITTED isolation level by using either locking or row versioning. READ_COMMITTED_SNAPSHOT 데이터베이스 옵션이 OFF인 경우 데이터베이스 엔진Database Engine은 데이터를 읽을 때 공유 잠금을 획득하고 읽기 작업이 완료되면 잠금을 해제합니다.If the database option READ_COMMITTED_SNAPSHOT is OFF, the 데이터베이스 엔진Database Engine acquires shared locks as data is read and releases those locks when the read operation is completed. READ_COMMITTED_SNAPSHOT 데이터베이스 옵션이 ON인 경우 데이터베이스 엔진Database Engine은 잠금을 획득하지 않고 행 버전 관리를 사용합니다.If the database option READ_COMMITTED_SNAPSHOT is ON, the 데이터베이스 엔진Database Engine does not acquire locks and uses row versioning. 격리 수준에 대한 자세한 내용은 SET TRANSACTION ISOLATION LEVEL(Transact-SQL)을 참조하세요.For more information about isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

참고

UPDATE 또는 DELETE 문의 경우: 이 기능은 유지 관리 모드에 있으며, Microsoft SQL Server의 이후 버전에서는 이 기능이 제거됩니다.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 애플리케이션은 수정하세요.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.For UPDATE or DELETE statements: 이 기능은 유지 관리 모드에 있으며, Microsoft SQL Server의 이후 버전에서는 이 기능이 제거됩니다.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 애플리케이션은 수정하세요.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

READCOMMITTEDLOCKREADCOMMITTEDLOCK
읽기 작업이 잠금을 사용하여 READ COMMITTED 격리 수준에 대한 규칙을 따르도록 지정합니다.Specifies that read operations comply with the rules for the READ COMMITTED isolation level by using locking. 데이터베이스 엔진Database Engine은 READ_COMMITTED_SNAPSHOT 데이터베이스 옵션의 설정에 관계없이 데이터를 읽을 때 공유 잠금을 획득하고 읽기 작업이 완료되면 잠금을 해제합니다.The 데이터베이스 엔진Database Engine acquires shared locks as data is read and releases those locks when the read operation is completed, regardless of the setting of the READ_COMMITTED_SNAPSHOT database option. 격리 수준에 대한 자세한 내용은 SET TRANSACTION ISOLATION LEVEL(Transact-SQL)을 참조하세요.For more information about isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL). INSERT 문의 대상 테이블에는 힌트를 지정할 수 없습니다. 지정할 경우 4140 오류가 반환됩니다.This hint cannot be specified on the target table of an INSERT statement; error 4140 is returned.

READPASTREADPAST
데이터베이스 엔진Database Engine이 다른 트랜잭션에 의해 잠긴 행을 읽지 않도록 지정합니다.Specifies that the 데이터베이스 엔진Database Engine not read rows that are locked by other transactions. READPAST가 지정되면 행 수준 잠금은 건너뛰지만, 페이지 수준 잠금은 건너뛰지 않습니다.When READPAST is specified, row-level locks are skipped but page-level locks are not skipped. 즉, 데이터베이스 엔진Database Engine은 잠금이 해제될 때까지 현재 트랜잭션을 차단하는 대신 행을 건너뜁니다.That is, the 데이터베이스 엔진Database Engine skips past the rows instead of blocking the current transaction until the locks are released. 예를 들어 T1 테이블에 값이 1, 2, 3, 4, 5인 단일 정수 열이 있다고 가정합니다.For example, assume table T1 contains a single integer column with the values of 1, 2, 3, 4, 5. 트랜잭션 A가 값 3을 8로 변경했으나 아직 커밋하지 않은 경우 SELECT * FROM T1 (READPAST)는 1, 2, 4, 5 값을 생성합니다.If transaction A changes the value of 3 to 8 but has not yet committed, a SELECT * FROM T1 (READPAST) yields values 1, 2, 4, 5. READPAST는 주로 SQL ServerSQL Server 테이블을 사용하는 작업 큐를 구현할 때 잠금 경합을 줄이는 데 사용됩니다.READPAST is primarily used to reduce locking contention when implementing a work queue that uses a SQL ServerSQL Server table. READPAST를 사용하는 큐 판독기는 다른 트랜잭션에 의해 잠긴 큐 항목이 있으면 다른 트랜잭션이 잠금을 해제할 때까지 기다리지 않고 사용 가능한 다음 큐 항목으로 건너뜁니다.A queue reader that uses READPAST skips past queue entries locked by other transactions to the next available queue entry, without having to wait until the other transactions release their locks.

READPAST는 UPDATE 또는 DELETE 문에서 참조되는 테이블과 FROM 절에서 참조되는 테이블에 지정할 수 있습니다.READPAST can be specified for any table referenced in an UPDATE or DELETE statement, and any table referenced in a FROM clause. UPDATE 문에 지정되는 경우 READPAST는 문에서 지정된 위치와 관계없이 데이터를 읽어 업데이트할 레코드를 식별하는 경우에만 적용됩니다.When specified in an UPDATE statement, READPAST is applied only when reading data to identify which records to update, regardless of where in the statement it is specified. READPAST는 INSERT 문의 INTO 절에서 테이블에 대해 지정할 수 없습니다.READPAST cannot be specified for tables in the INTO clause of an INSERT statement. READPAST를 사용하는 업데이트 또는 삭제 작업은 외래 키 또는 인덱싱된 뷰를 읽거나 보조 인덱스를 수정할 때 차단될 수 있습니다.Update or delete operations that use READPAST may block when reading foreign keys or indexed views, or when modifying secondary indexes.

READPAST는 READ COMMITTED 또는 REPEATABLE READ 격리 수준에서 작동하는 트랜잭션에만 지정할 수 있습니다.READPAST can only be specified in transactions operating at the READ COMMITTED or REPEATABLE READ isolation levels. SNAPSHOT 격리 수준에서 작동하는 트랜잭션에 지정하는 경우 UPDLOCK 및 HOLDLOCK과 같은 잠금이 필요한 다른 테이블 힌트와 함께 READPAST를 사용해야 합니다.When specified in transactions operating at the SNAPSHOT isolation level, READPAST must be combined with other table hints that require locks, such as UPDLOCK and HOLDLOCK.

READ_COMMITTED_SNAPSHOT 데이터베이스 옵션이 ON으로 설정되어 있고 다음 조건 중 하나에 해당하는 경우에는 READPAST 테이블 힌트를 지정할 수 없습니다.The READPAST table hint cannot be specified when the READ_COMMITTED_SNAPSHOT database option is set to ON and either of the following conditions is true:

  • 세션의 트랜잭션 격리 수준이 READ COMMITTED입니다.The transaction isolation level of the session is READ COMMITTED.
  • READCOMMITTED 테이블 힌트가 쿼리에도 지정되어 있습니다.The READCOMMITTED table hint is also specified in the query.

이러한 경우 READPAST 힌트를 지정하려면 READCOMMITTED 테이블 힌트가 있으면 이를 제거하고 쿼리에 READCOMMITTEDLOCK 테이블 힌트를 포함합니다.To specify the READPAST hint in these cases, remove the READCOMMITTED table hint if present, and include the READCOMMITTEDLOCK table hint in the query.

READUNCOMMITTEDREADUNCOMMITTED
더티 읽기를 허용하도록 지정합니다.Specifies that dirty reads are allowed. 다른 트랜잭션이 현재 트랜잭션의 데이터 읽기를 수정하지 못하도록 하는 공유 잠금이 실행되지 않으며 다른 트랜잭션에 의해 설정된 배타적 잠금은 현재 트랜잭션의 잠긴 데이터 읽기를 차단하지 않습니다.No shared locks are issued to prevent other transactions from modifying data read by the current transaction, and exclusive locks set by other transactions do not block the current transaction from reading the locked data. 더티 읽기를 허용하면 동시성이 높아질 수 있지만 다른 트랜잭션이 데이터 수정 내용을 읽고 롤백할 가능성이 있습니다.Allowing dirty reads can cause higher concurrency, but at the cost of reading data modifications that then are rolled back by other transactions. 이 경우 트랜잭션에 대한 오류가 생성되거나 사용자에게 커밋되지 않은 데이터가 제공될 수 있습니다. 또한 사용자에게 레코드가 두 번 표시되거나 전혀 표시되지 않을 수도 있습니다.This may generate errors for your transaction, present users with data that was never committed, or cause users to see records twice (or not at all).

READUNCOMMITTED 및 NOLOCK 힌트는 데이터 잠금에만 적용됩니다.READUNCOMMITTED and NOLOCK hints apply only to data locks. READUNCOMMITTED 및 NOLOCK 힌트가 있는 쿼리를 포함하여 모든 쿼리는 컴파일 및 실행 중에 Sch-S(스키마 안정성) 잠금을 획득합니다.All queries, including those with READUNCOMMITTED and NOLOCK hints, acquire Sch-S (schema stability) locks during compilation and execution. 이 때문에 동시 트랜잭션이 테이블에 대해 Sch-M(스키마 수정) 잠금을 유지하면 쿼리가 차단됩니다.Because of this, queries are blocked when a concurrent transaction holds a Sch-M (schema modification) lock on the table. 예를 들어 DDL(데이터 정의 언어) 작업은 테이블의 스키마 정보를 수정하기 전에 Sch-M 잠금을 획득합니다.For example, a data definition language (DDL) operation acquires a Sch-M lock before it modifies the schema information of the table. READUNCOMMITTED 또는 NOLOCK 힌트를 사용하여 실행되는 쿼리를 포함하여 Sch-S 잠금을 획득하려고 시도하는 동시 쿼리는 모두 차단됩니다.Any concurrent queries, including those running with READUNCOMMITTED or NOLOCK hints, are blocked when attempting to acquire a Sch-S lock. 반대로 Sch-S 잠금을 유지하는 쿼리는 Sch-M 잠금을 획득하려고 시도하는 동시 트랜잭션을 차단합니다.Conversely, a query holding a Sch-S lock blocks a concurrent transaction that attempts to acquire a Sch-M lock.

삽입, 업데이트 또는 삭제 작업으로 수정된 테이블에 대해서는 READUNCOMMITTED와 NOLOCK을 지정할 수 없습니다.READUNCOMMITTED and NOLOCK cannot be specified for tables modified by insert, update, or delete operations. SQL ServerSQL Server 쿼리 최적화 프로그램은 UPDATE 또는 DELETE 문의 대상 테이블에 적용되는 FROM 절의 READUNCOMMITTED 및 NOLOCK 힌트를 무시합니다.The SQL ServerSQL Server query optimizer ignores the READUNCOMMITTED and NOLOCK hints in the FROM clause that apply to the target table of an UPDATE or DELETE statement.

참고

UPDATE 또는 DELETE 문의 대상 테이블에 적용되는 FROM 절의 READUNCOMMITTED 및 NOLOCK 힌트 사용 지원은 SQL ServerSQL Server의 이후 버전에서 제거될 예정입니다.Support for use of the READUNCOMMITTED and NOLOCK hints in the FROM clause that apply to the target table of an UPDATE or DELETE statement will be removed in a future version of SQL ServerSQL Server. 새 개발 작업에서는 이 컨텍스트에서 이러한 힌트를 사용하지 않도록 하고 현재 이 힌트를 사용하는 애플리케이션은 수정하세요.Avoid using these hints in this context in new development work, and plan to modify applications that currently use them.

다음 중 하나를 사용하여 트랜잭션에서 커밋되지 않은 데이터 수정 내용에 대해 더티 읽기를 수행할 수 없도록 하여 잠금 경합을 최소화할 수도 있습니다.You can minimize locking contention while protecting transactions from dirty reads of uncommitted data modifications by using either of the following:

  • READ_COMMITTED_SNAPSHOT 데이터베이스 옵션이 ON으로 설정된 READ COMMITTED 격리 수준The READ COMMITTED isolation level with the READ_COMMITTED_SNAPSHOT database option set ON.
  • SNAPSHOT 격리 수준The SNAPSHOT isolation level.

격리 수준에 대한 자세한 내용은 SET TRANSACTION ISOLATION LEVEL(Transact-SQL)을 참조하세요.For more information about isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

참고

READUNCOMMITTED를 지정할 때 오류 메시지 601이 표시되면 교착 상태 오류(1205)를 해결하는 방법으로 오류를 해결하고 문을 다시 시도하세요.If you receive the error message 601 when READUNCOMMITTED is specified, resolve it as you would a deadlock error (1205), and retry your statement.

REPEATABLEREADREPEATABLEREAD
REPEATABLE READ 격리 수준에서 실행되는 트랜잭션과 동일한 잠금 기능으로 검색이 수행되도록 지정합니다.Specifies that a scan is performed with the same locking semantics as a transaction running at REPEATABLE READ isolation level. 격리 수준에 대한 자세한 내용은 SET TRANSACTION ISOLATION LEVEL(Transact-SQL)을 참조하세요.For more information about isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

ROWLOCKROWLOCK
페이지 또는 테이블 잠금이 일반적으로 사용될 때 행 잠금을 사용하도록 지정합니다.Specifies that row locks are taken when page or table locks are ordinarily taken. SNAPSHOT 격리 수준에서 작동하는 트랜잭션에 지정하는 경우 UPDLOCK 및 HOLDLOCK과 같은 잠금이 필요한 다른 테이블 힌트와 함께 ROWLOCK을 사용하지 않으면 행 잠금이 수행되지 않습니다.When specified in transactions operating at the SNAPSHOT isolation level, row locks are not taken unless ROWLOCK is combined with other table hints that require locks, such as UPDLOCK and HOLDLOCK.

SERIALIZABLESERIALIZABLE
HOLDLOCK과 동일합니다.Is equivalent to HOLDLOCK. 필요한 테이블 또는 데이터 페이지가 더 이상 필요 없을 때 트랜잭션의 완료 여부와 관계없이 즉시 공유 잠금을 해제하지 않고 트랜잭션 완료 시까지 유지함으로써 공유 잠금을 더욱 제한적으로 만듭니다.Makes shared locks more restrictive by holding them until a transaction is completed, instead of releasing the shared lock as soon as the required table or data page is no longer needed, whether the transaction has been completed or not. SERIALIZABLE 격리 수준에서 실행되는 트랜잭션과 동일한 잠금 기능으로 검색이 수행됩니다.The scan is performed with the same semantics as a transaction running at the SERIALIZABLE isolation level. 격리 수준에 대한 자세한 내용은 SET TRANSACTION ISOLATION LEVEL(Transact-SQL)을 참조하세요.For more information about isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

SNAPSHOTSNAPSHOT
적용 대상: SQL Server 2014(12.x)SQL Server 2014 (12.x) 이상Applies to: SQL Server 2014(12.x)SQL Server 2014 (12.x) and later.

메모리 최적화 테이블은 SNAPSHOT 격리로 액세스됩니다.The memory-optimized table is accessed under SNAPSHOT isolation. SNAPSHOT은 메모리 최적화 테이블에서만 사용할 수 있습니다(디스크 기반 테이블에서 사용할 수 없음).SNAPSHOT can only be used with memory-optimized tables (not with disk-based tables). 자세한 내용은 메모리 액세스에 최적화된 테이블 소개를 참조하세요.For more information, see Introduction to Memory-Optimized Tables.

SELECT * FROM dbo.Customers AS c   
WITH (SNAPSHOT)   
LEFT JOIN dbo.[Order History] AS oh   
    ON c.customer_id=oh.customer_id;  

SPATIAL_WINDOW_MAX_CELLS = integerSPATIAL_WINDOW_MAX_CELLS = integer
적용 대상: SQL Server 2012(11.x)SQL Server 2012 (11.x) 이상Applies to: SQL Server 2012(11.x)SQL Server 2012 (11.x) and later.
geometry 또는 geography 개체의 공간 분할(tessellation)에 사용할 최대 셀 개수를 지정합니다.Specifies the maximum number of cells to use for tessellating a geometry or geography object. number는 1과 8192 사이의 값입니다.number is a value between 1 and 8192.

이 옵션을 사용하면 기본 및 보조 필터 실행 시간을 서로 조정하여 쿼리 실행 시간을 미세 조정할 수 있습니다.This option allows for fine-tuning of query execution time by adjusting the tradeoff between primary and secondary filter execution time. 숫자가 클수록 보조 필터 실행 시간은 줄어들고 기본 실행 필터 시간은 늘어나며 숫자가 작을수록 기본 필터 실행 시간은 줄어들고 보조 필터 실행은 늘어납니다.A larger number reduces secondary filter execution time, but increases primary execution filter time and a smaller number decreases primary filter execution time, but increase secondary filter execution. 밀도가 높은 공간 데이터의 경우 숫자가 높을수록 기본 필터로 더 정확한 근사값을 제공하여 실행 시간이 빨라지고 보조 필터 실행 시간이 줄어듭니다.For denser spatial data, a higher number should produce a faster execution time by giving a better approximation with the primary filter and reducing secondary filter execution time. 스파스 데이터의 경우 숫자가 낮을수록 기본 필터 실행 시간이 줄어듭니다.For sparser data, a lower number will decrease the primary filter execution time.

수동 및 자동 표 공간 분할에 모두 이 옵션을 사용할 수 있습니다.This option works for both manual and automatic grid tessellations.

TABLOCKTABLOCK
획득한 잠금이 테이블 수준에 적용되도록 지정합니다.Specifies that the acquired lock is applied at the table level. 획득한 잠금 유형은 실행 중인 문에 따라 달라집니다.The type of lock that is acquired depends on the statement being executed. 예를 들어 SELECT 문에서는 공유 잠금을 획득할 수 있습니다.For example, a SELECT statement may acquire a shared lock. TABLOCK을 지정하여 공유 잠금을 행 또는 페이지 수준 대신 전체 테이블에 적용할 수 있습니다.By specifying TABLOCK, the shared lock is applied to the entire table instead of at the row or page level. HOLDLOCK도 함께 지정한 경우에는 트랜잭션이 끝날 때까지 테이블 잠금이 유지됩니다.If HOLDLOCK is also specified, the table lock is held until the end of the transaction.

INSERT INTO <target_table> SELECT <columns> FROM <source_table> 문을 사용하여 힙으로 데이터를 가져오는 경우, 대상 테이블에 대해 TABLOCK 힌트를 지정하여 명령문에 최적화된 잠금과 로깅을 사용하도록 설정할 수 있습니다.When importing data into a heap by using the INSERT INTO <target_table> SELECT <columns> FROM <source_table> statement, you can enable optimized logging and locking for the statement by specifying the TABLOCK hint for the target table. 또한 데이터베이스의 복구 모델은 단순 또는 대량으로 지정해야 합니다.In addition, the recovery model of the database must be set to simple or bulk-logged. 자세한 내용은 INSERT(Transact-SQL)를 참조하세요.For more information, see INSERT (Transact-SQL).

OPENROWSET 대량 행 집합 공급자와 함께 TABLOCK을 사용하여 테이블로 데이터를 가져오는 경우, 여러 클라이언트에서 로깅 및 잠금이 최적화된 상태에서 대상 테이블로 데이터를 동시에 로드할 수 있습니다.When used with the OPENROWSET bulk rowset provider to import data into a table, TABLOCK enables multiple clients to concurrently load data into the target table with optimized logging and locking. 자세한 내용은 대량 가져오기의 최소 로깅을 위한 필수 조건을 참조하세요.For more information, see Prerequisites for Minimal Logging in Bulk Import.

TABLOCKXTABLOCKX
테이블을 배타적으로 잠그도록 지정합니다.Specifies that an exclusive lock is taken on the table.

UPDLOCKUPDLOCK
업데이트 잠금을 사용하고 트랜잭션이 완료될 때까지 유지하도록 지정합니다.Specifies that update locks are to be taken and held until the transaction completes. UPDLOCK은 읽기 작업을 위해 행 수준 또는 페이지 수준에서만 업데이트 잠금을 사용합니다.UPDLOCK takes update locks for read operations only at the row-level or page-level. UPDLOCK이 TABLOCK과 함께 사용되는 경우 또는 테이블 수준 잠금이 여러 이유로 인해 사용되는 경우, 배타(X) 잠금이 대신 사용됩니다.If UPDLOCK is combined with TABLOCK, or a table-level lock is taken for some other reason, an exclusive (X) lock will be taken instead.

UPDLOCK이 지정된 경우 READCOMMITTED 및 READCOMMITTEDLOCK 격리 수준 힌트는 무시됩니다.When UPDLOCK is specified, the READCOMMITTED and READCOMMITTEDLOCK isolation level hints are ignored. 예를 들어 세션의 격리 수준이 SERIALIZABLE로 설정되고 쿼리가 (UPDLOCK, READCOMMITTED)를 지정할 경우 READCOMMITTED 힌트는 무시되고 트랜잭션은 SERIALIZABLE 격리 수준을 사용하여 실행됩니다.For example, if the isolation level of the session is set to SERIALIZABLE and a query specifies (UPDLOCK, READCOMMITTED), the READCOMMITTED hint is ignored and the transaction is run using the SERIALIZABLE isolation level.

XLOCKXLOCK
배타적 잠금을 사용하고 트랜잭션이 완료될 때까지 유지하도록 지정합니다.Specifies that exclusive locks are to be taken and held until the transaction completes. ROWLOCK, PAGLOCK 또는 TABLOCK과 함께 지정한 경우에는 배타적 잠금이 적절한 세분성 수준에 적용됩니다.If specified with ROWLOCK, PAGLOCK, or TABLOCK, the exclusive locks apply to the appropriate level of granularity.

RemarksRemarks

테이블을 쿼리 계획으로 액세스하지 않는 경우에는 테이블 힌트가 무시됩니다.The table hints are ignored if the table is not accessed by the query plan. 최적화 프로그램의 선택에 의해 테이블 자체를 액세스하지 않거나 테이블 대신 인덱싱된 뷰를 액세스하기로 하는 경우 등이 해당됩니다.This may be caused by the optimizer choosing not to access the table at all, or because an indexed view is accessed instead. 후자의 경우에 OPTION(EXPAND VIEWS) 쿼리 힌트를 사용하여 인덱싱된 뷰 액세스를 금지할 수도 있습니다.In the latter case, accessing an indexed view can be prevented by using the OPTION (EXPAND VIEWS) query hint.

모든 잠금 힌트는 뷰에서 참조되는 테이블과 뷰를 포함하여 쿼리 계획에서 액세스하는 모든 테이블과 뷰로 전달됩니다.All lock hints are propagated to all the tables and views that are accessed by the query plan, including tables and views referenced in a view. 또한 SQL ServerSQL Server는 해당되는 잠금 일관성 검사를 수행합니다.Also, SQL ServerSQL Server performs the corresponding lock consistency checks.

행 수준의 잠금을 획득하는 잠금 힌트 ROWLOCK, UPDLOCK 및 XLOCK은 실제 데이터 행이 아닌 인덱스 키에 잠금을 설정합니다.Lock hints ROWLOCK, UPDLOCK, AND XLOCK that acquire row-level locks may place locks on index keys rather than the actual data rows. 예를 들어 테이블에 비클러스터형 인덱스가 있고 잠금 힌트를 사용하는 SELECT 문이 포함 인덱스에 의해 처리되는 경우 잠금은 기본 테이블의 데이터 행이 아닌 포함 인덱스의 인덱스 키에서 획득됩니다.For example, if a table has a nonclustered index, and a SELECT statement using a lock hint is handled by a covering index, a lock is acquired on the index key in the covering index rather than on the data row in the base table.

다른 테이블에 있는 열에 액세스하는 식 또는 함수에 의해 계산되는 계산 열이 테이블에 있는 경우 테이블 힌트는 해당 테이블에서 사용되지 않으며 전파되지 않습니다.If a table contains computed columns that are computed by expressions or functions accessing columns in other tables, the table hints are not used on those tables and are not propagated. 예를 들어 NOLOCK 테이블 힌트는 쿼리의 테이블에 지정됩니다.For example, a NOLOCK table hint is specified on a table in the query. 이 테이블에는 다른 테이블에 있는 열에 액세스하는 식과 함수의 조합에 의해 계산되는 계산 열이 있습니다.This table has computed columns that are computed by a combination of expressions and functions that access columns in another table. 이러한 식과 함수에 의해 참조되는 테이블은 액세스될 때 NOLOCK 테이블 힌트를 사용하지 않습니다.The tables referenced by the expressions and functions do not use the NOLOCK table hint when accessed.

SQL ServerSQL Server는 FROM 절의 각 테이블에 대해 다음 각 그룹에서 두 개 이상의 테이블 힌트를 허용하지 않습니다.does not allow for more than one table hint from each of the following groups for each table in the FROM clause:

  • 세분성 힌트: PAGLOCK, NOLOCK, READCOMMITTEDLOCK, ROWLOCK, TABLOCK 또는 TABLOCKXGranularity hints: PAGLOCK, NOLOCK, READCOMMITTEDLOCK, ROWLOCK, TABLOCK, or TABLOCKX.
  • 격리 수준 힌트: HOLDLOCK, NOLOCK, READCOMMITTED, REPEATABLEREAD, SERIALIZABLEIsolation level hints: HOLDLOCK, NOLOCK, READCOMMITTED, REPEATABLEREAD, SERIALIZABLE.

필터링된 인덱스 힌트Filtered Index Hints

필터링된 인덱스는 테이블 힌트로 사용될 수 있지만 쿼리가 선택한 모든 행을 포함하지 않을 경우 쿼리 최적화 프로그램에서 오류 8622가 발생합니다.A filtered index can be used as a table hint, but will cause the query optimizer to generate error 8622 if it does not cover all of the rows that the query selects. 다음은 잘못된 필터링된 인덱스 힌트에 대한 예입니다.The following is an example of an invalid filtered index hint. 이 예에서는 필터링된 인덱스 FIBillOfMaterialsWithComponentID를 만든 다음 이를 SELECT 문에 대한 인덱스 힌트로 사용합니다.The example creates the filtered index FIBillOfMaterialsWithComponentID and then uses it as an index hint for a SELECT statement. 필터링된 인덱스 조건자에는 ComponentID 533, 324 및 753의 데이터 행이 포함됩니다.The filtered index predicate includes data rows for ComponentIDs 533, 324, and 753. 쿼리 조건자에도 ComponentID 533, 324 및 753의 데이터 행이 포함되지만 필터링된 인덱스에 없는 ComponentID 855 및 924도 포함하도록 결과 집합이 확장되어 있습니다.The query predicate also includes data rows for ComponentIDs 533, 324, and 753 but extends the result set to include ComponentIDs 855 and 924, which are not in the filtered index. 따라서 쿼리 최적화 프로그램에서는 필터링된 인덱스 힌트를 사용할 수 없으며 오류 8622가 발생합니다.Therefore, the query optimizer cannot use the filtered index hint and generates error 8622. 자세한 내용은 Create Filtered Indexes을(를) 참조하세요.For more information, see Create Filtered Indexes.

IF EXISTS (SELECT name FROM sys.indexes  
    WHERE name = N'FIBillOfMaterialsWithComponentID'   
    AND object_id = OBJECT_ID(N'Production.BillOfMaterials'))  
DROP INDEX FIBillOfMaterialsWithComponentID  
    ON Production.BillOfMaterials;  
GO  
CREATE NONCLUSTERED INDEX "FIBillOfMaterialsWithComponentID"  
    ON Production.BillOfMaterials (ComponentID, StartDate, EndDate)  
    WHERE ComponentID IN (533, 324, 753);  
GO  
SELECT StartDate, ComponentID FROM Production.BillOfMaterials  
    WITH( INDEX (FIBillOfMaterialsWithComponentID) )  
    WHERE ComponentID in (533, 324, 753, 855, 924);  
GO  

쿼리 최적화 프로그램은 SET 옵션에 필터링된 인덱스에 대한 필수 값이 없으면 인덱스 힌트를 인식하지 않습니다.The query optimizer will not consider an index hint if the SET options do not have the required values for filtered indexes. 자세한 내용은 CREATE INDEX(Transact-SQL)를 참조하세요.For more information, see CREATE INDEX (Transact-SQL).

NOEXPAND 사용Using NOEXPAND

NOEXPAND는 인덱싱된 뷰에만 적용됩니다.NOEXPAND applies only to indexed views. 인덱싱된 뷰란 고유한 클러스터형 인덱스가 만들어져 있는 뷰를 의미합니다.An indexed view is a view with a unique clustered index created on it. 인덱싱된 뷰와 기본 테이블 모두에 있는 열에 대한 참조가 포함된 쿼리의 경우 쿼리 최적화 프로그램이 쿼리를 실행하는 데 인덱싱된 뷰를 사용하는 것이 최상의 방법이라고 결정하면 뷰의 인덱스를 사용합니다.If a query contains references to columns that are present both in an indexed view and base tables, and the query optimizer determines that using the indexed view provides the best method for executing the query, the query optimizer uses the index on the view. 이 기능은 인덱싱된 뷰 일치라고 합니다.This functionality is called indexed view matching. SQL Server 2016(13.x)SQL Server 2016 (13.x) SP1 이전에는 쿼리 최적화 프로그램에서 인덱싱된 뷰를 자동으로 사용하는 것은 SQL ServerSQL Server의 특정 버전에서만 지원됩니다.Prior to SQL Server 2016(13.x)SQL Server 2016 (13.x) SP1, automatic use of an indexed view by the query optimizer is supported only in specific editions of SQL ServerSQL Server. SQL ServerSQL Server버전에서 지원되는 기능 목록은 SQL Server 2016 버전에서 지원하는 기능을 참조하세요.For a list of features that are supported by the editions of SQL ServerSQL Server, see Features Supported by the Editions of SQL Server 2016.

단, 최적화 프로그램에서 일치시킬 인덱싱된 뷰를 고려하거나 NOEXPAND 힌트로 참조된 인덱싱된 뷰를 사용하려면 다음 SET 옵션을 ON으로 설정해야 합니다.However, for the optimizer to consider indexed views for matching, or use an indexed view that is referenced with the NOEXPAND hint, the following SET options must be set to ON.

참고

Azure SQL DatabaseAzure SQL Database는 NOEXPAND 힌트를 지정하지 않고도 인덱싱된 뷰를 자동으로 사용할 수 있도록 지원합니다.supports automatic use of indexed views without specifying the NOEXPAND hint.

ANSI_NULLSANSI_NULLS ANSI_WARNINGSANSI_WARNINGS CONCAT_NULL_YIELDS_NULLCONCAT_NULL_YIELDS_NULL
ANSI_PADDINGANSI_PADDING ARITHABORT1ARITHABORT1 QUOTED_IDENTIFIERQUOTED_IDENTIFIER

1 ANSI_WARNINGS가 ON으로 설정되면 ARITHABORT가 암시적으로 ON으로 설정됩니다.1 ARITHABORT is implicitly set to ON when ANSI_WARNINGS is set to ON. 따라서 이 설정을 수동으로 조정할 필요가 없습니다.Therefore, you do not have to manually adjust this setting.

또한 NUMERIC_ROUNDABORT 옵션은 OFF로 설정해야 합니다.Also, the NUMERIC_ROUNDABORT option must be set to OFF.

최적화 프로그램이 인덱싱된 뷰에 대한 인덱스를 강제로 사용하게 하려면 NOEXPAND 옵션을 지정합니다.To force the optimizer to use an index for an indexed view, specify the NOEXPAND option. 이 힌트는 뷰가 쿼리에서도 명명되어 있는 경우에만 사용할 수 있습니다.This hint can be used only if the view is also named in the query. SQL ServerSQL Server는 FROM 절에서 직접 뷰를 명명하지 않는 쿼리에서 특정 인덱싱된 뷰를 강제로 사용하도록 힌트를 제공하지 않지만 쿼리 최적화 프로그램은 쿼리에서 직접 참조되지 않은 경우에도 인덱싱된 뷰의 사용을 고려합니다.does not provide a hint to force a particular indexed view to be used in a query that does not name the view directly in the FROM clause; however, the query optimizer considers using indexed views, even if they are not referenced directly in the query. NOEXPAND 테이블 힌트를 사용하는 경우 SQL Server는 인덱싱된 보기의 통계만 자동으로 만듭니다.SQL Server will only automatically create statistics on an indexed view when a NOEXPAND table hint is used. 이 힌트를 생략하면 수동으로 통계를 생성하여 확인할 수 없는 누락된 통계에 대한 실행 계획 경고가 발생할 수 있습니다.Omitting this hint can lead to execution plan warnings about missing statistics that cannot be resolved by creating statistics manually. 쿼리 최적화 중 SQL ServerSQL Server는 쿼리가 보기를 직접 참조하고 NOEXPAND 힌트를 사용할 때 자동 또는 수동으로 생성된 보기 통계를 사용합니다.During query optimization SQL ServerSQL Server will use view statistics that were created automatically or manually when the query references the view directly and the NOEXPAND hint is used.

테이블 힌트를 쿼리 힌트로 사용Using a Table Hint as a Query Hint

테이블 힌트는 OPTION (TABLE HINT) 절을 사용하여 쿼리 힌트로 지정할 수도 있습니다.Table hints can also be specified as a query hint by using the OPTION (TABLE HINT) clause. 테이블 힌트는 계획 지침의 컨텍스트에서 쿼리 힌트로만 사용하는 것이 좋습니다.We recommend using a table hint as a query hint only in the context of a plan guide. 다른 임시 쿼리의 경우에는 이러한 힌트를 테이블 힌트로만 지정합니다.For ad-hoc queries, specify these hints only as table hints. 자세한 내용은 쿼리 힌트(Transact-SQL)를 참조하세요.For more information, see Query Hints (Transact-SQL).

사용 권한Permissions

KEEPIDENTITY, IGNORE_CONSTRAINTS 및 IGNORE_TRIGGERS 힌트를 사용하려면 테이블에 대한 ALTER 권한이 필요합니다.The KEEPIDENTITY, IGNORE_CONSTRAINTS, and IGNORE_TRIGGERS hints require ALTER permissions on the table.

Examples

1.A. TABLOCK 힌트를 사용하여 잠금 방법 지정Using the TABLOCK hint to specify a locking method

다음 예에서는 AdventureWorks2012AdventureWorks2012 데이터베이스의 Production.Product 테이블에 공유 잠금을 사용하고 UPDATE 문이 끝날 때까지 유지하도록 지정합니다.The following example specifies that a shared lock is taken on the Production.Product table in the AdventureWorks2012AdventureWorks2012 database and is held until the end of the UPDATE statement.

UPDATE Production.Product  
WITH (TABLOCK)  
SET ListPrice = ListPrice * 1.10  
WHERE ProductNumber LIKE 'BK-%';  
GO  

2.B. FORCESEEK 힌트를 사용하여 Index Seek 연산 지정Using the FORCESEEK hint to specify an index seek operation

다음 예에서는 인덱스를 지정하지 않고 FORCESEEK 힌트를 사용하여 쿼리 최적화 프로그램이 AdventureWorks2012AdventureWorks2012 데이터베이스의 Sales.SalesOrderDetail 테이블에서 Index Seek 연산을 수행하도록 지정합니다.The following example uses the FORCESEEK hint without specifying an index to force the query optimizer to perform an index seek operation on the Sales.SalesOrderDetail table in the AdventureWorks2012AdventureWorks2012 database.

SELECT *  
FROM Sales.SalesOrderHeader AS h  
INNER JOIN Sales.SalesOrderDetail AS d WITH (FORCESEEK)  
    ON h.SalesOrderID = d.SalesOrderID   
WHERE h.TotalDue > 100  
AND (d.OrderQty > 5 OR d.LineTotal < 1000.00);  
GO  
  

다음 예에서는 인덱스와 함께 FORCESEEK 힌트를 사용하여 쿼리 최적화 프로그램이 지정된 인덱스 및 인덱스 열에서 Index Seek 연산을 수행하도록 지정합니다.The following example uses the FORCESEEK hint with an index to force the query optimizer to perform an index seek operation on the specified index and index column.

SELECT h.SalesOrderID, h.TotalDue, d.OrderQty  
FROM Sales.SalesOrderHeader AS h  
    INNER JOIN Sales.SalesOrderDetail AS d   
    WITH (FORCESEEK (PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID (SalesOrderID)))   
    ON h.SalesOrderID = d.SalesOrderID   
WHERE h.TotalDue > 100  
AND (d.OrderQty > 5 OR d.LineTotal < 1000.00);   
GO  
  

C.C. FORCESCAN 힌트를 사용하여 Index Scan 연산 지정Using the FORCESCAN hint to specify an index scan operation

다음 예에서는 FORCESCAN 힌트를 사용하여 쿼리 최적화 프로그램이 AdventureWorks2012AdventureWorks2012 데이터베이스의 Sales.SalesOrderDetail 테이블에서 검색 작업을 수행하도록 지정합니다.The following example uses the FORCESCAN hint to force the query optimizer to perform a scan operation on the Sales.SalesOrderDetail table in the AdventureWorks2012AdventureWorks2012 database.

SELECT h.SalesOrderID, h.TotalDue, d.OrderQty  
FROM Sales.SalesOrderHeader AS h  
    INNER JOIN Sales.SalesOrderDetail AS d   
    WITH (FORCESCAN)   
    ON h.SalesOrderID = d.SalesOrderID   
WHERE h.TotalDue > 100  
AND (d.OrderQty > 5 OR d.LineTotal < 1000.00);  

참고 항목See Also

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