다음을 통해 공유


대량 가져오기를 위한 일괄 처리 관리

이 섹션에서는 대량 가져오기 작업을 위해 일괄 처리 크기를 결정하는 방법 관리에 대해 설명합니다. 기본적으로 데이터 파일의 모든 행은 하나의 트랜잭션에서 알 수 없는 크기의 단일 일괄 처리로 가져옵니다. 이 경우 가져오기 작업이 완료되기 전에 실패하면 전체 트랜잭션이 롤백되고 대상 테이블에 데이터가 추가되지 않습니다. 그러면 실패한 작업을 데이터 파일의 처음부터 다시 시작해야 합니다.

큰 데이터 파일을 단일 일괄 처리로 가져오는 경우 문제가 발생할 수 있으므로 bcp 및 BULK INSERT를 사용하여 각각 데이터 파일보다 작은 일련의 일괄 처리로 데이터를 가져올 수 있습니다. 각 일괄 처리는 별개의 트랜잭션으로 가져오고 기록되며 지정된 트랜잭션이 커밋된 후 해당 트랜잭션으로 가져온 행이 커밋됩니다. 작업이 실패하면 현재 일괄 처리에서 가져온 행만 롤백되며 데이터 파일의 처음부터가 아니라 실패한 일괄 처리의 처음부터 데이터 가져오기를 다시 시작할 수 있습니다.

[!참고]

일괄 처리 작동 방법은 일괄 처리을 참조하십시오.

또는 일괄 처리 크기를 제한하지 않을 경우 명령의 데이터 파일 크기를 예측하여 성능을 향상시킬 수 있습니다. 이 계산 값은 작업에 대한 쿼리 계획을 만들 때 쿼리 프로세서가 사용합니다.

[!참고]

일괄 처리 크기나 데이터 파일 크기를 지정할 경우 정확도는 중요하지 않습니다.

다음 표에서는 이러한 대체 방법을 지원하는 한정자에 대해 간략하게 설명합니다.

명령

일괄 처리 크기

일괄 처리당 보낸 행 수

일괄 처리당 보낸 KB 수

bcp1

-bbatch_size

-h "ROWS_PER_BATCH = bb"

-h "KILOBYTES_PER_BATCH = cc"

BULK INSERT2

BATCHSIZE = batch_size

ROWS_PER_BATCH = rows_per_batch

KILOBYTES_PER_BATCH = kilobytes_per_batch

참고참고
이 옵션에 BATCHSIZE를 사용하면 오류가 발생합니다.

INSERT ... SELECT * FROM OPENROWSET(BULK...)

—3

ROWS_PER_BATCH = rows_per_batch

—3

1bcp 명령에 -bbatch_size 스위치와 ROWS_PER_BATCH 또는 KILOBYTES_PER_BATCH 힌트를 함께 사용하지 마십시오. 이러한 요소를 함께 사용하면 오류가 발생합니다.

2 BULK INSERT 명령에 BATCHSIZE와 ROWS_PER_BATCH 또는 KILOBYTES_PER_BATCH를 사용할 경우 BATCHSIZE가 우선 적용됩니다.

3 OPENROWSET에는 BATCHSIZE 및 KILOBYTES_PER_BATCH 옵션이 둘 다 없습니다.

다음 섹션에서는 이러한 한정자 사용 방법에 대해 설명합니다.

일괄 처리의 대략적인 크기 지정

많은 수의 행을 가져올 경우 데이터를 일괄 처리로 분할하면 다음과 같은 여러 이점이 제공됩니다. 각 일괄 처리를 완료한 다음 트랜잭션이 기록됩니다. 어떤 이유에서든지 대량 가져오기 작업이 완료되기 전에 종료되면 현재 트랜잭션(일괄 처리)만 롤백됩니다.

[!참고]

대량 로그에는 트랜잭션 로그의 가져온 데이터 복사본이 포함됩니다. 이 작업을 통해 로그가 빠르게 증가할 수 있지만 각 일괄 처리 후에 해당 로그를 백업하여 로그 공간을 다시 사용할 수 있습니다.

일련의 대략적으로 지정된 크기의 일괄 처리를 통해 데이터 파일을 가져오려면 다음 한정자를 사용합니다.

  • bcp의 경우: -b

  • BULK INSERT의 경우: BATCHSIZE

행의 각 일괄 처리는 별도의 트랜잭션으로 삽입됩니다. 어떤 이유에서든지 대량 가져오기 작업이 완료되기 전에 종료되면 현재 트랜잭션만 롤백됩니다. 예를 들어 데이터 파일에 1000개의 행이 있고 일괄 처리 크기가 100일 때 MicrosoftSQL Server는 작업을 10개의 개별 트랜잭션으로 기록합니다. 각 트랜잭션은 대상 테이블에 100개의 행을 삽입합니다. 행 750을 로드하는 중 대량 가져오기 작업이 종료되면 SQL Server가 현재 트랜잭션을 롤백할 때 이전 49개의 행만 제거됩니다. 대상 테이블에는 여전히 처음 700개의 행이 있습니다.

SQL Server는 일괄 처리 크기 값에 따라 로드 작업을 자동으로 최적화하므로 성능이 향상됩니다. 일반적으로 일괄 처리 크기를 가능한 크게 만들어야 합니다. 대개 일괄 처리 크기가 클수록 대량 가져오기 작업의 성능이 향상됩니다. 그러나 일부 예외가 있습니다. 대상 테이블에 하나 이상의 인덱스가 있으면 더 큰 일괄 처리 크기로 인해 정렬 시 메모리 압력이 적용될 수 있습니다. TABLOCK 옵션을 사용하지 않고 병렬 로드를 수행할 때는 일괄 처리 크기가 클수록 차단이 증가할 수 있습니다.

[!참고]

SQL Server 인스턴스에서 데이터 파일로 데이터를 대량으로 가져올 때는 일괄 처리 크기를 사용할 수 없습니다.

데이터 파일의 대략적인 크기 지정

대량 가져오기 작업의 일괄 처리 크기를 지정하지 않으면 대략적인 크기의 데이터 파일을 지정하여 쿼리 프로세서가 쿼리 계획에 리소스를 효과적으로 할당할 수 있습니다. 대략적인 크기의 데이터 파일을 지정하려면 다음과 같이 행 수 또는 데이터의 KB 수를 계산합니다.

  • 일괄 처리당 행 수 계산

    행 수를 계산하려면 ROWS_PER_BATCH 힌트 또는 옵션을 사용합니다. 0보다 큰 값을 지정하면 쿼리 프로세서가 ROWS_PER_BATCH의 값을 힌트로 사용하여 리소스를 쿼리 계획에 할당합니다. 이 값은 실제 행 수와 순서가 같아야 합니다.

    데이터 파일의 모든 행이 한 번의 일괄 처리로 SQL Server 인스턴스에 복사되지만 bcp는 1000개 행마다 "1000개 행이 SQL Server로 전달되었습니다"라는 메시지를 표시합니다. 이 메시지는 정보 제공만을 위한 것으로 사용되는 일괄 처리 크기와는 관계없이 발생합니다.

  • 일괄 처리당 KB 수 계산

    데이터 파일 크기를 KB 단위로 계산하려면 KILOBYTES_PER_BATCH 힌트 또는 옵션을 사용합니다. SQL Server는 지정된 값에 따라 대량 가져오기 작업을 최적화합니다.

[!참고]

일괄 처리 크기를 지정하지 않거나 최소 로그 작업을 최적화하지 않고 대용량 데이터 파일을 대량으로 가져오면 대량 가져오기 작업이 완료되기 전에 트랜잭션 로그가 가득 찰 수 있습니다. 이러한 상황을 방지하기 위해 트랜잭션 로그를 늘리거나 자동으로 증가하게 할 수 있습니다.