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

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System(PDW)

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

일괄 처리 크기가 지정되지 않은 대량 복사가 수행되고 오류가 발생하면 전체 대량 복사가 롤백됩니다. 장기 실행 대량 복사를 복구하는 데 시간이 오래 걸릴 수 있습니다. 일괄 처리 크기가 설정되면 대량 복사는 각 일괄 처리를 트랜잭션으로 간주하고 각 일괄 처리를 커밋합니다. 오류가 발생하면 마지막 미해결 일괄 처리만 롤백해야 합니다.

일괄 처리 크기는 잠금 오버헤드에도 영향을 줄 수 있습니다. 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."  

참고 항목

대량 복사 작업 수행(ODBC)
데이터 대량 가져오기 및 내보내기(SQL Server)