대량 복사 작업에서 일괄 처리의 주요 목적은 트랜잭션의 범위를 정의하는 것입니다. 일괄 처리 크기가 설정되지 않은 경우 대량 복사 함수는 전체 대량 복사를 하나의 트랜잭션으로 간주합니다. 일괄 처리 크기를 설정하면 각 일괄 처리에서 일괄 처리가 완료될 때 커밋되는 하나의 트랜잭션이 구성됩니다.
일괄 처리 크기가 지정되지 않은 대량 복사가 수행되고 오류가 발생하면 전체 대량 복사가 롤백됩니다. 장기 실행 대량 복사를 복구하는 데 시간이 오래 걸릴 수 있습니다. 일괄 처리 크기가 설정되면 대량 복사는 각 일괄 처리를 트랜잭션으로 간주하고 각 일괄 처리를 커밋합니다. 오류가 발생하면 마지막 미해결 일괄 처리만 롤백해야 합니다.
일괄 처리 크기는 잠금 오버헤드에도 영향을 줄 수 있습니다. SQL Server에 대해 대량 복사를 수행하는 경우 행 잠금 대신 테이블 잠금을 획득하기 위해 bcp_control 사용하여 TABLOCK 힌트를 지정할 수 있습니다. 전체 대량 복사 작업에 대한 오버헤드를 최소화하면서 단일 테이블 잠금을 보유할 수 있습니다. TABLOCK을 지정하지 않으면 잠금이 개별 행에 유지되고 대량 복사 기간 동안 모든 잠금을 유지 관리하는 오버헤드로 인해 성능이 저하될 수 있습니다. 잠금은 트랜잭션 길이에 대해서만 유지되므로 일괄 처리 크기를 지정하면 현재 보유한 잠금을 해제하는 커밋을 주기적으로 생성하여 이 문제를 해결합니다.
일괄 처리를 구성하는 행의 수는 많은 수의 행을 대량 복사할 때 상당한 성능 영향을 미칠 수 있습니다. 일괄 처리 크기에 대한 권장 사항은 수행 중인 대량 복사 유형에 따라 달라집니다.
SQL Server로 대량 복사할 때 TABLOCK 대량 복사 힌트를 지정하고 큰 일괄 처리 크기를 설정합니다.
TABLOCK을 지정하지 않으면 일괄 처리 크기를 1,000개 미만의 행으로 제한합니다.
데이터 파일에서 대량 복사할 때 일괄 처리 크기는 bcp_exec 호출하기 전에 BCPBATCH 옵션을 사용하여 bcp_control 호출하여 지정됩니다. bcp_bind 및 bcp_sendrow 사용하여 프로그램 변수에서 대량 복사하는 경우 일괄 처리 크기는 bcp_sendrow x번 호출한 후 bcp_batch 호출하여 제어됩니다. 여기서 x는 일괄 처리의 행 수입니다.
트랜잭션 크기를 지정하는 것 외에도 일괄 처리는 행이 네트워크를 통해 서버로 전송되는 시기에 영향을 줍니다. 대량 복사 함수는 일반적으로 네트워크 패킷이 채워지도록 bcp_sendrow 행을 캐시한 다음 전체 패킷을 서버로 보냅니다. 그러나 애플리케이션이 bcp_batch 호출하면 현재 패킷이 채워졌는지 여부에 관계없이 서버로 전송됩니다. 매우 낮은 일괄 처리 크기를 사용하면 부분적으로 채워진 많은 패킷을 서버에 보내는 경우 성능이 저하될 수 있습니다. 예를 들어 bcp_sendrow 때마다 bcp_batch 호출하면 각 행이 별도의 패킷으로 전송되고 행이 매우 크지 않으면 각 패킷의 공간이 낭비됩니다. SQL Server에 대한 네트워크 패킷의 기본 크기는 4KB이지만 애플리케이션은 SQL_ATTR_PACKET_SIZE 특성을 지정하는 SQLSetConnectAttr를 호출하여 크기를 변경할 수 있습니다.
일괄 처리의 또 다른 부작용은 각 일괄 처리가 bcp_batch 완료될 때까지 미해결 결과 집합으로 간주된다는 것입니다. 일괄 처리가 처리되지 않는 동안 연결 핸들에서 다른 작업을 시도하는 경우 SQL Server Native Client ODBC 드라이버에서 SQLState = "HY000"과 다음 오류 메시지 문자열에 오류가 발생합니다.
"[Microsoft][SQL Server Native Client] Connection is busy with
results for another hstmt."