대량 가져오기를 위한 잠금 동작 제어
bcp 명령, BULK INSERT 문 및 INSERT ... SELECT * FROM OPENROWSET(BULK...) 문을 사용하면 대량 가져오기 작업을 수행하는 동안 테이블이 잠기도록 지정할 수 있습니다. 잠금은 SQL Server 데이터베이스 엔진에서 동일한 데이터에 대한 여러 사용자의 동시 액세스를 동기화하는 데 사용됩니다. 트랜잭션을 통해 데이터를 수정하는 경우 해당 트랜잭션이 끝날 때까지 잠금을 지속하여 수정 내용이 유지되도록 보호합니다. 대량 가져오기 작업에 대해 테이블 잠금을 지정하면 대량 가져오기 작업을 수행하는 동안 테이블에 BU(대량 업데이트) 잠금이 적용됩니다. BU 잠금을 사용하면 여러 스레드를 통해 데이터를 동시에 같은 테이블로 대량으로 가져올 수 있도록 허용하면서 데이터를 대량으로 가져오지 않는 다른 프로세스는 테이블에 액세스하지 못하도록 차단할 수 있습니다. 테이블 잠금을 사용하면 테이블의 잠금 경합을 줄여 대량 가져오기 작업의 성능을 향상시킬 수 있습니다.
테이블 잠금을 사용하지 않을 경우 table lock on bulk load 옵션이 on으로 설정되지 않으면 기본적으로 행 수준 잠금이 사용됩니다. sp_tableoption을 사용하여 table lock on bulk load 옵션을 설정하면 대량 가져오기 작업을 수행하는 동안 테이블에 대해 잠금 동작이 설정됩니다.
대량 가져오기의 테이블 잠금 |
테이블 잠금 동작 |
---|---|
Off |
행 수준 잠금 사용됨 |
On |
테이블 수준 잠금 사용됨 |
테이블 잠금이 지정되면 대량 가져오기 작업을 수행하는 동안 sp_tableoption으로 설정한 테이블의 기본 설정이 무시됩니다.
[!참고]
반드시 테이블 잠금을 사용하여 여러 클라이언트의 데이터를 병렬로 테이블에 대량으로 가져올 필요는 없지만 이렇게 하면 성능이 향상됩니다.
명령 한정자
다음 표에서는 다량 가져오기 명령에 테이블 잠금을 지정하기 위한 한정자를 요약합니다.
명령 |
한정자 |
한정자 유형 |
---|---|---|
bcp |
-h"TABLOCK" |
힌트 |
BULK INSERT |
TABLOCK |
인수 |
INSERT ... SELECT * FROM OPENROWSET(BULK...) |
WITH(TABLOCK) |
테이블 힌트 |
[!참고]
SQL Server 2005 이상 버전에서 클러스터형 인덱스가 있는 테이블에 TABLOCK을 지정하면 병렬로 데이터 대량 가져오기를 수행할 수 없습니다. 이 경우 병렬 대량 가져오기를 수행하려면 TABLOCK을 사용하지 마십시오. 병렬 대량 로드에 대한 자세한 내용은 대량 가져오기 최적화 지침을 참조하십시오.