다음을 통해 공유


대량 복사 일괄 처리 크기 관리

대량 복사 작업에서 일괄 처리의 주요 목적은 트랜잭션의 범위를 정의하는 것입니다. 일괄 처리 크기를 설정하지 않으면 대량 복사 함수에서 전체 대량 복사를 하나의 트랜잭션으로 간주합니다. 일괄 처리 크기를 설정하면 각 일괄 처리에서 일괄 처리가 완료될 때 커밋되는 하나의 트랜잭션이 구성됩니다.

일괄 처리 크기를 지정하지 않고 대량 복사를 수행하는 동안 오류가 발생하면 전체 대량 복사가 롤백됩니다. 장기 실행 대량 복사는 복구하는 데 오랜 시간이 걸릴 수 있습니다. 일괄 처리 크기를 설정하면 대량 복사에서 각 일괄 처리를 하나의 트랜잭션으로 간주하고 각 일괄 처리를 커밋합니다. 오류가 발생할 경우 처리 중인 마지막 일괄 작업만 롤백되면 됩니다.

일괄 처리 크기는 잠금 오버헤드에도 영향을 줄 수 있습니다. SQL Server에 대해 대량 복사를 수행하는 경우 bcp_control로 TABLOCK 힌트를 지정하여 행 잠금 대신 테이블 잠금을 얻을 수 있습니다. 오버헤드를 최소화하여 전체 대량 복사 작업에 대해 단일 테이블 잠금을 보유할 수 있습니다. TABLOCK을 지정하지 않으면 개별 행에 잠금이 설정되고, 대량 복사 기간 동안 모든 잠금을 유지 관리하는 오버헤드로 인해 성능이 느려질 수 있습니다. 트랜잭션 기간 동안에만 잠금이 보유되므로 일괄 처리 크기를 지정하면 현재 보유된 잠금을 해제하는 커밋이 정기적으로 생성되어 이 문제가 해결됩니다.

많은 행을 대량 복사하는 경우 일괄 처리를 구성하는 행 수가 성능에 큰 영향을 줄 수 있습니다. 권장되는 일괄 처리 크기는 수행하는 대량 복사 유형에 따라 달라집니다.

  • SQL Server로 대량 복사하는 경우 TABLOCK 대량 복사 힌트를 지정하고 큰 일괄 처리 크기를 설정합니다.

  • TABLOCK이 지정되지 않은 경우 일괄 처리 크기를 1,000행 미만으로 제한합니다.

데이터 파일에서 대량 복사해 올 경우 bcp_exec를 호출하기 전에 BCPBATCH 옵션으로 bcp_control을 호출하여 일괄 처리 크기를 지정합니다. bcp_bindbcp_sendrow를 사용하여 프로그램 변수에서 대량 복사하는 경우 bcp_sendrowx회 호출한 후 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."