1

スキーマが異なる非常に多数(例:30000)の複数のxmlファイルをSQL Server 2008にインポートするための最良のアプローチは何ですか?

現在、各ファイルをループしてデータをロードし、データの挿入にdatatable使用SqlBulkCopyしていますが、時間がかかります(約1.5時間)。

4

1 に答える 1

3

これはそれほど長くはかからないはずです。私の見積もりでは、約600MBのデータがあります。10MB/秒または少なくとも1MB/秒に問題なく近づくことができるはずです。つまり、1〜10分は簡単に達成できるはずです。

何をすべきか:

  • どの部分に時間がかかっているかを特定します
  • 考えられるボトルネックの候補リストを作成する
  • 原因が見つかるまで、各理論をテストします
  • 回避策を実装します。

詳細がなければ、正確にするのは難しいですが、私は推測することができます:

  • SqlBulkCopy通常は高速なので、インサートはボトルネックではない可能性があります。データテーブルよりも少し速く実行できますが、おそらく問題ではありません。
  • DataTablesは「インデックス」を持つことができます。つまり、主キーと制約。これらは非常に非効率的に実装されています-これらは間違いなく問題を引き起こす可能性があります。
  • SqlBulkCopy高速ですが、行数が多い場合に最適ですごとに1つのファイルだけをコピーする場合SqlBulkCopy、これは30000の呼び出しを意味し、おそらくデータベース側で少なくとも30000のfsyncを実行します。を1つだけ使用する必要がありますSqlBulkCopy
  • データベースには、挿入した行にインデックスまたは制約がある場合があります。これらはパフォーマンスを大幅に制限する可能性があります-データベースの負荷を確認してください。
  • .NETのほとんどのxmlリーダーはかなり高速ですが、単一スレッドで10MB/秒でプッシュされる可能性があります。アクセスパターンが特に悪い場合(たとえば、完全XmlDocumentにロードして、多くの非効率的なループやXPathでクエリを実行する場合)、CPU負荷の問題が発生している可能性があります。
  • 20KBのファイルはかなり小さいです。これらをHDDから読み取る場合、1MB /秒を達成するには、1秒あたり50を読み取る必要があります。つまり、レイテンシは20ミリ秒です。これは、特にファイルがディスク上に連続して配置されていない場合に問題になる可能性があります。並列化は少し役立つかもしれませんが、SSDはもっと役立ちます(そして両方がより良いでしょう)。ただし、パフォーマンスはこれよりはるかに低いため、これが主なボトルネックではない可能性があります。

それを念頭に置いて、私はこの順序で以下を見ていきます

  • クライアントのディスク負荷(ディスク待機時間が長い場合は、SSDと同時実行性を検討してください)
  • CPU負荷-プロファイル(非効率的な解析または誤用DataTable
  • SqlBulkCopyインスタンス-(スレッドごとに)1つだけ使用します
  • データベースのロード(可能な場合はクラスター化インデックスを含め、可能なすべてのインデックスを削除します)

注文は、この問題をチェックするのがどれほど難しいかに触発されています。ディスクのロードに問題が発生する可能性は低いですが、確認するのは簡単なので、その可能性を排除することから始めたほうがよいでしょう。データベーススキーマの問題はそれほど起こりそうにありませんが、特定するのにはるかに手間がかかるので(どのインデックスであり、それを削除することで別のワークフローに影響を与えますか?)、最後に確認します。

于 2013-02-22T10:24:47.563 に答える