2011-02-10 2 views
1

150K 행을 포함하는 웹 사용자로부터 파일을 가져올 예정이며 약 1.6M 항목이 데이터베이스에 추가됩니다.SQL 삽입을 방지하고 성능을 높이기 위해 대량 삽입 문에 매개 변수를 추가하려면 어떻게합니까?

지금은 기본 레코드를 먼저 추가 한 다음 첫 번째 레코드 다음에 제공된 키로 자식을 추가합니다.

쿼리를 미리 컴파일하고 다시 사용할 수는 있지만 많은 항목을 그룹화하고 싶습니다.하지만 그 시점에서 쿼리를 매개 변수화 할 수 없다는 걱정이 듭니다.

현재 쿼리 메서드를 통해 약 300 개의 행이나 3000 개의 쿼리 만 가져오고 있습니다.

+0

큰 데이터로드에서 성능을 확인하는 유일한 방법은 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx를 사용하는 것이지만이 방법은 유용하지 않습니다. 첫 번째 단계에서는 부모 행 삽입으로 외래 키 값을 생성합니다. 아이들 행에 도움이 될지 모르지만 –

+0

아마도 임시 테이블을 사용하여 그 문제를 해결할 생각을 가지고 있습니다.아마도 더 큰 세트에 행 인덱스를 추가하고 실제 테이블로 데이터를 이동할 시간이되면 실제 ID로 업데이트하십시오. 나는 그것이 효과가있을 것이라고 생각하지만 여전히 큰 문제를 해결하지는 못한다. – Middletone

답변

0

데이터를로드하는 방법에 대한 제약 조건이 무엇인지 잘 모르겠습니다 만 데이터베이스에 대량 가져 오기 속도를 높이려면 몇 가지 좋은 방법이 있습니다 .->Performing Bulk Copy Operations. 데이터 가져 오기 프로세스와 작업 할 때, 나는 항상 도움이되는 단계로 그것을 깰 발견

  1. 가져 오기 단계 - 상황에 따라 사용할 수있는 다양한 다른 대량 방법
  2. 준비 단계 - 공정 작업; 예 : 데이터 유효성 검사, 주요 관계 구축, 데이터 스크러빙 등
  3. "라이브"테이블에 마지막 삽입. (잘하면 설정을 기반으로 삽입)

어떤 논리 작업에 약간의와 첫 번째 패스에서 데이터까지 모두를 선택하는 것이 매우 효율적으로, 대량 엉 준비 영역으로 이동할 수 있습니다; 그 목적을 위해 임시 테이블 또는 영구 스테이징 테이블로 이동합니다. 그런 다음 실제 테이블의 최종 집에 대량으로 삽입하기 전에 데이터를 제대로 처리하고 정리할 수 있도록 모든 처리 작업을 수행 할 수 있습니다. 또한 하나 이상의 중간 단계를 통해 악의적 인 데이터 또는 SQL 주입 공격으로부터 단열을 제공 할 수 있습니다.

큰 분리 덤핑 지점으로 대량 가져 오기를 수행하는 데 필요한 로직이 거의 없기 때문에이 분리를 통해 대량 가져 오기 작업을 빠르게 수행 할 수 있습니다. 그런 다음 데이터를 슬라이스 업하는 데 필요한 논리를 적용 할 수 있지만 적절합니다. 또한 준비 단계에서 여러 단계를 수행해야하는 경우에는 더 많은 작은 단계가 필요하며 가장 큰/가장 느린 부분을 최적화하는 데 집중할 수 있습니다.

실제 상황과 일치하도록 준비 단계로 이동 한 후 데이터를 구성 할 수있는 방법이 있다면 상황을 하나의 큰 집합으로 삽입 할 수 있습니다. 최종 삽입 전에 준비 단계에서 PK-> ForeignKey 관계를 구축 할 수 있기 때문에 (다른 데이터 처리 작업도 처리 할 수 ​​있음) 반복 삽입에서 하나의 큰 대량 세트 삽입으로 이동할 수 있습니다. set based is usually a very good thing. 오, 물론, 당신의 시스템/제약이 그렇게 할 수 있다면 말입니다.

귀하의 상황에 해당되는지 여부는 확실하지 않습니다. 그러나 유용 할 수있는 뭔가가 있기를 바랍니다.

+0

개념이 정확하고 질문의 매개 변수를 설명하지 않더라도 반드시 따라야합니다. – Middletone

관련 문제