2010-07-12 1 views
1

SQL Server 2008 및 .NET 코드에 대한 질문입니다.많은 양의 데이터를 채우기위한 SQL Server 쿼리 또는 저장 프로 시저의 성능

성능 측면에서 생각해 보면 트랜잭션을 사용하여 많은 데이터 (> 250,000 행, 5 "일반"열)를 삽입하는 두 가지 옵션 사이의 디자인이 궁금합니다.

  • a. C# 코드에 transact 문으로 둘러싸인 문을 삽입하십시오.

또는

  • 나. Insert 문을 transact 문으로 둘러싸인 C# 코드에서 잠시 동안 행별로 실행되는 저장 프로 시저에 삽입합니다.

또는

  • 다. C#에서 내 개체를 serialize하고 xml을 저장 프로 시저에 보냅니다. XML을 읽는 동안 저장 프로 시저가 잠시 동안 있습니다. while은 트랜잭션 문으로 둘러싸여 있습니다.

또한, 클라이언트와 서버 사이의 네트워크는

감사합니다 사전에 ... 아주 좋지 않다.

답변

0

이미 배치 확약을 처리했기 때문에 다음 호는 클라이언트에게 왕복하는 것입니다. 요구가 적 으면 적을수록 좋습니다. 첫 번째 옵션은 매우 나쁠 것입니다. 각 요청마다 하나의 행을 보내고 왕복 250k 번해야하기 때문입니다. 옵션 3은 특히 XML 처리가 지향적 인 경우 (XML을 .nodes() 메소드를 통해 테이블로 투영하고 전체 투영 된 테이블을 삽입하는 경우) 실행 가능합니다. 클라이언트에서 거대한 메모리 할당을 제외하고 SQL에 큰 XML을 보내는 방법에 대한 속임수는 How to I serialize a large graph of .NET object into a SQL Server BLOB without creating a large buffer을 참조하십시오.

언급하지 않았지만 이미 지적한 다른 옵션은 SqlBulkCopy입니다. 이것은 여러 가지 이유로 가장 빠른 방법 일 것입니다. 클라이언트에서 대용량 메모리 할당을 피하기 위해 행을 대량 복사하여 스트리밍 의미론 (IEnumerable의 yield 반환)을 표시하는 방법을 견뎌야 만합니다.

2

항상 코드를 프로파일해야하지만 SqlBulkCopy 클래스를 사용하는 것이 좋습니다.

+0

+1 이것은 많은 행의 데이터를 삽입하는 가장 빠른 방법입니다. SQL의 경우 bcp 명령 또는 BULK INSERT 문을 실행하는 .NET 방법입니다. –

+0

네, 맞습니다. SqlBulkCopy에 대해 생각하지 않았습니다. 나는이 명령을 사용하는 습관이 없다. – Dan

관련 문제