2013-02-22 5 views
1

SQL Server 2008과 다른 스키마를 사용하는 매우 큰 수 (예 : 30000)의 여러 xml 파일을 가져 오는 가장 좋은 방법은 무엇입니까?많은 XML 파일 가져 오기

현재 각 파일을 반복하면서 데이터를 datatable에로드하고 SqlBulkCopy을 사용하여 데이터를 삽입하고 있지만 시간이 많이 걸립니다 (약 1.5 시간).

+1

강아지 'Parallel.ForEach'. 그냥 MaxDegreeOfParallelism을 8이나 뭔가로 설정하십시오. –

+0

30,000 개의 XML 파일이 있습니까? 얼마나 많은 행을 쓰고 있습니까? –

+1

[this] (http://msdn.microsoft.com/en-us/library/ms171993(v=sql.100).aspx)를보십시오. –

답변

3

이렇게 오래 걸리지 않아야합니다. 필자가 예상 한 바에 따르면 약 600MB의 데이터가 있습니다. 별다른 어려움없이 10MB/s 또는 최소 1MB/s에 접근 할 수 있어야합니다. 이는 1-10 분이 쉽게 달성 될 수 있음을 의미합니다.

가해야 할 일 : 당신이 범인
  • 해결 방법을 구현을 발견 할 때까지

    • 가능한 병목 현상의 후보
    • 시험 각 이론을 확인 너무 오래 걸리는 어떤 부분 확인합니다.

    는 자세한 내용이 없다면, 그것은 정확하게 어렵다, 그러나 나는 추측 할 수 있습니다 귀하의 삽입하지 병목 가능성이 있으므로

    • SqlBulkCopy 빠르고 보통이다. 당신은 datatable보다 조금 더 빠르게 할 수 있지만 아마 문제가 아닙니다.
    • DataTable에는 "인덱스"가있을 수 있습니다. 즉 기본 키 및 제약을 포함한다. 이것들은 매우 비효율적으로 구현됩니다 - 이것들은 확실히 문제를 일으킬 수 있습니다.
    • SqlBulkCopy이 빠르지 만 개가 많으며 행이 가장 좋습니다. SqlBulkCopy 당 하나의 파일 만 복사하는 경우 이는 데이터베이스 측에서 30000 회 및 아마도 30000 회 이상의 fsync를 의미합니다. SqlBulkCopy 하나만 사용해야합니다.
    • 데이터베이스에 삽입 한 행에 대한 색인 또는 제약 조건이있을 수 있습니다. 이것들은 성능을 심각하게 제한 할 수 있습니다 - 데이터베이스로드를 확인하십시오.
    • .NET에서 대부분의 xml 리더는 비교적 빠르지 만 단일 스레드에서 10MB/s로 밀어 낼 수 있습니다. 액세스 패턴이 특히 좋지 않은 경우 (예 : XmlDocument을 모두로드하고 비효율적 인 루프 및/또는 XPath가 많은 쿼리) CPU로드 문제가 발생할 수 있습니다.
    • 20KB 파일은 상당히 작습니다. HDD에서이 값을 읽는다면 1MB/s 만 달성하려면 50 초를 읽어야합니다 (예 : 20ms 대기 시간). 특히 파일이 비 순차적으로 디스크에있는 경우 문제가 될 수 있습니다. 병렬화는 조금 도움이 될 수 있지만 SSD가 더 많은 도움이 될 것입니다. 그러나 성능이 많이 느껴지고 보다 낮은이므로 기본 병목 현상이 아닐 수도 있습니다.
    • 을 염두에두고

    , 나는

    • 디스크 부하 클라이언트에서이 순서대로 다음과 같은보고 싶은데
    • CPU (디스크 대기 시간이 높은 경우, SSD 및 동시성을 고려) 부하 - 프로파일 (비효율적 인 분석 또는 오용 DataTable들)
    • SqlBulkCopy 인스턴스 - 하나 (스레드 당)를 사용
    • 데이터베이스 부하 (가능한 클러스터 인덱스 경우를 포함하여, 당신이 할 수있는 모든 인덱스를 제거하기)

    이 순서는이 문제를 검사하는 것이 얼마나 어려운지에서 영감을 얻습니다. 디스크로드는 문제가되지는 않지만 확인하는 것은 쉽지 않으므로 그러한 가능성을 제거하여 시작할 수도 있습니다. 데이터베이스 스키마 문제는 그럴 것 같지는 않지만 식별 할 수있는 작업이 더 많습니다 (어떤 인덱스인지, 제거하여 다른 워크 플로에 영향을 줍니까?).