대량 복사 일괄 처리 크기 관리
대량 복사 작업에서 일괄 처리의 주요 목적은 트랜잭션의 범위를 정의하는 것입니다. 일괄 처리 크기를 설정하지 않으면 대량 복사 함수에서 전체 대량 복사를 하나의 트랜잭션으로 간주합니다. 일괄 처리 크기를 설정하면 각 일괄 처리에서 일괄 처리가 완료될 때 커밋되는 하나의 트랜잭션이 구성됩니다.
일괄 처리 크기를 지정하지 않고 대량 복사를 수행하는 동안 오류가 발생하면 전체 대량 복사가 롤백됩니다. 장기 실행 대량 복사는 복구하는 데 오랜 시간이 걸릴 수 있습니다. 일괄 처리 크기를 설정하면 대량 복사에서 각 일괄 처리를 하나의 트랜잭션으로 간주하고 각 일괄 처리를 커밋합니다. 오류가 발생할 경우 처리 중인 마지막 일괄 작업만 롤백되면 됩니다.
일괄 처리 크기는 잠금 오버헤드에도 영향을 줄 수 있습니다. 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."