2013-07-30 3 views
2

나는 급여 처리 소프트웨어를 작성하여 궁극적으로 SqlDataAdapter.Insert()을 사용하여 SQL Server 테이블에 데이터를 씁니다. (SqlCommandBuilder()으로 만든 기본 삽입 명령을 사용하고 있습니다.) Windows 7에서 .NET Framework 4를 사용하고 SQL Server 2008 R2가 아닌 표준 버전 x64 SP3에 쓰고 있습니다. 문제는 필자의 PC (Dell Optiplex 990 Core i7)에서 SQL Server (PC의 NIC 및 서버는 GB Enet이지만 약 100Mbps의 스위치가 불행한 병목 현상이 있음) 하지만 여전히 - 100Mbps). 내 PC에서 SQL Server가 실행되는 서버로 파일을 복사 할 수 있으며 처리량 문제가 없습니다. 100Mbps 처리량에 매우 근접 할 수 있습니다. 2008 R2를 실행하는 다른 LAN SQL Server에 데이터베이스를 저장하고 거기에서 5 Mbps 처리량을 얻을 수 있지만 여전히 - 매우 느립니다. Insert() 명령이 실행 중일 때 내 PC의 CPU가 거의 0입니다. 나는 패킷 크기 매개 변수를 SqlConnection.ConnectionString 속성으로 늘리거나 줄이려고 시도했지만 아무것도하지 않았습니다.SqlDataAdapter 불량한 성능 삽입

내 PC의 SSMS에서 해당 SQL Server로 SELECT * FROM <table>을 수행하면 약 45Mbps의 지속 처리량을 얻을 수 있습니다.

다음으로 범인을 찾을 곳이 확실하지 않습니다. 제안 사항에 감사드립니다.

+0

업데이트를 수행 할 때 몇 행이 수정 되었습니까? 갱신 명령은 변경된 행만을 처리합니다. 또한 왜 당신은'Select * from

'을하고 있지 않고'Select * from
where filterColumn = @ filter'를하고있는 것입니까? 네트워크 카드를 최대한 활용할 수있는 충분한 행을 쿼리하고 있다면 쿼리를 최적화 할 수 있습니다. –

+0

@ScottChamberlain - 거기서 총 뇌 동맥증 - 나는 정말로'Insert()'를 의미했습니다. 질문이 수정되었습니다. – Conrad

+0

좋아, 한 번에 몇 개의 행을 삽입하고 있습니까? –

답변

0

많은 레코드를 삽입하는 경우 SqlDataAdapter의 Insert는 레코드를 한 번에 하나씩 처리하므로 대신 삽입을 수행하는 오버 헤드를 완화하기 위해 SqlBulkCopy을 사용해야합니다.

using (SqlConnection destinationConnection = new SqlConnection(connectionString)) 
{ 
    destinationConnection.Open(); 
    using (SqlBulkCopy bulkCopy = 
       new SqlBulkCopy(destinationConnection)) 
    { 
     bulkCopy.DestinationTableName = destTableName; 
     bulkCopy.WriteToServer(sourceDataTable); 
    } 
} 
+0

고마워요. 정확히 내가 찾고있는 것이 었습니다. – Conrad