SQL Server 2008과 다른 스키마를 사용하는 매우 큰 수 (예 : 30000)의 여러 xml 파일을 가져 오는 가장 좋은 방법은 무엇입니까?많은 XML 파일 가져 오기
현재 각 파일을 반복하면서 데이터를 datatable
에로드하고 SqlBulkCopy
을 사용하여 데이터를 삽입하고 있지만 시간이 많이 걸립니다 (약 1.5 시간).
SQL Server 2008과 다른 스키마를 사용하는 매우 큰 수 (예 : 30000)의 여러 xml 파일을 가져 오는 가장 좋은 방법은 무엇입니까?많은 XML 파일 가져 오기
현재 각 파일을 반복하면서 데이터를 datatable
에로드하고 SqlBulkCopy
을 사용하여 데이터를 삽입하고 있지만 시간이 많이 걸립니다 (약 1.5 시간).
이렇게 오래 걸리지 않아야합니다. 필자가 예상 한 바에 따르면 약 600MB의 데이터가 있습니다. 별다른 어려움없이 10MB/s 또는 최소 1MB/s에 접근 할 수 있어야합니다. 이는 1-10 분이 쉽게 달성 될 수 있음을 의미합니다.
가해야 할 일 : 당신이 범인는 자세한 내용이 없다면, 그것은 정확하게 어렵다, 그러나 나는 추측 할 수 있습니다 귀하의 삽입하지 병목 가능성이 있으므로
SqlBulkCopy
빠르고 보통이다. 당신은 datatable보다 조금 더 빠르게 할 수 있지만 아마 문제가 아닙니다.DataTable
에는 "인덱스"가있을 수 있습니다. 즉 기본 키 및 제약을 포함한다. 이것들은 매우 비효율적으로 구현됩니다 - 이것들은 확실히 문제를 일으킬 수 있습니다.SqlBulkCopy
이 빠르지 만 개가 많으며 행이 가장 좋습니다. SqlBulkCopy
당 하나의 파일 만 복사하는 경우 이는 데이터베이스 측에서 30000 회 및 아마도 30000 회 이상의 fsync를 의미합니다. SqlBulkCopy
하나만 사용해야합니다.XmlDocument
을 모두로드하고 비효율적 인 루프 및/또는 XPath가 많은 쿼리) CPU로드 문제가 발생할 수 있습니다., 나는
DataTable
들)SqlBulkCopy
인스턴스 - 하나 (스레드 당)를 사용이 순서는이 문제를 검사하는 것이 얼마나 어려운지에서 영감을 얻습니다. 디스크로드는 문제가되지는 않지만 확인하는 것은 쉽지 않으므로 그러한 가능성을 제거하여 시작할 수도 있습니다. 데이터베이스 스키마 문제는 그럴 것 같지는 않지만 식별 할 수있는 작업이 더 많습니다 (어떤 인덱스인지, 제거하여 다른 워크 플로에 영향을 줍니까?).
강아지 'Parallel.ForEach'. 그냥 MaxDegreeOfParallelism을 8이나 뭔가로 설정하십시오. –
30,000 개의 XML 파일이 있습니까? 얼마나 많은 행을 쓰고 있습니까? –
[this] (http://msdn.microsoft.com/en-us/library/ms171993(v=sql.100).aspx)를보십시오. –