테이블 수준 잠금으로 데이터를 병렬로 가져오기
MicrosoftSQL Server를 사용하면 여러 클라이언트에서 인덱싱되지 않은 단일 테이블로 데이터 병렬로 대량 가져오기 작업을 수행할 수 있습니다. 이렇게 하면 대량 가져오기 작업의 성능이 향상됩니다. 병렬 데이터 가져오기는 3가지 대량 가져오기 명령, 즉, bcp, BULK INSERT 및 INSERT ... SELECT * FROM OPENROWSET(BULK...)에서 지원합니다.
[!참고]
ODBC 기반 또는 SQL OLE DB 기반의 API를 사용하는 응용 프로그램만 단일 테이블로 병렬 데이터를 로드할 수 있습니다. bcp 유틸리티를 비롯하여 MicrosoftSQL Server 버전 6.5 또는 이전 버전에서 제공된 DB-Library 클라이언트 라이브러리를 기반으로 하는 모든 응용 프로그램에서는 SQL Server 인스턴스로 병렬 데이터를 로드할 수 없습니다.
TABLOCK 옵션/힌트를 지정하지 않는 경우 다중 동시 대량 가져오기 스트림은 테이블보다 낮은 수준의 세분성으로 잠금을 획득합니다. 데이터 배포에 따라 동시 대량 로드 스트림은 서로 차단될 수 있습니다. 따라서 인덱싱되지 않은 테이블에 병렬로 데이터를 대량으로 가져오는 작업은 일반적으로 TABLOCK으로 수행됩니다.
TABLOCK을 사용하여 SQL Server 인스턴스에 데이터를 병렬로 대량 가져오는 경우 다음을 고려하십시오.
데이터를 병렬로 가져오는 가장 간단한 시나리오는 데이터를 인덱싱되지 않은 테이블(힙)로 로드하는 것입니다.
테이블에 인덱스가 없는 경우 대량 가져오기 작업에 대해 TABLOCK 옵션을 지정합니다. 자세한 내용은 대량 가져오기를 위한 잠금 동작 제어를 참조하십시오.
[!참고]
인덱스가 테이블에 있으면 TABLOCK 옵션을 사용하여 병렬 로드 작업을 수행할 수 없습니다. 또한 TABLOCK을 지정하지 않으면 동시 스레드가 서로를 차단합니다. 대량 가져오기 작업 전에 테이블에서 인덱스를 제거하십시오. 인덱스 유지 또는 제거에 대한 자세한 내용은 대량 가져오기 최적화 지침을 참조하십시오.
클라이언트 사이에서 가져올 데이터를 클라이언트 수와 같은 데이터 파일 수로 나눕니다. 이 파일을 각 클라이언트마다 하나씩 배치합니다.
유용한 정보 프로세서를 가장 효율적으로 사용하려면 클라이언트 사이에 데이터를 균등하게 배포합니다. 여러 클라이언트에서 SQL Server 인스턴스로 데이터 파일을 병렬로 가져오려는 경우 데이터 파일의 크기가 서로 비슷해야 합니다. 그렇지 않으면 로드가 적은 클라이언트 스레드가 일찍 끝나므로 해당 클라이언트의 CPU를 비효율적으로 사용하게 됩니다.
최대 성능을 얻으려면 각 클라이언트에 대해 지정된 일괄 처리 크기가 클라이언트 데이터 파일의 크기와 같아야 합니다. 자세한 내용은 대량 가져오기를 위한 일괄 처리 관리를 참조하십시오.
테이블로 데이터를 대량으로 가져온 후에 다음과 같이 필요한 인덱스를 만들 수 있습니다.
단일 클라이언트에서 차례로 각 클러스터형 인덱스를 만듭니다. 자세한 내용은 클러스터형 인덱스 만들기를 참조하십시오.
비클러스터형 인덱스를 만듭니다. 이 인덱스는 다른 클라이언트에서 동시에 만들 수 있습니다. 자세한 내용은 비클러스터형 인덱스 만들기를 참조하십시오.
TABLOCK을 지정하지 않으면 대상에 있는 인덱스 수에 관계없이 병렬로 데이터를 대량 가져올 수 있습니다. 그러나 이 경우 대량 최적화가 불가능하며 개별 행이나 페이지에 대한 잠금을 획득할 때 차단이 발생할 수 있습니다.