質問: Sql Server 2008とは異なるスキーマを持つ非常に大きな数(例:30000)の複数のxmlファイルをインポートする最良の方法は何ですか? 私は現在にデータをロードし、各ファイルをループしてい`datatable`および使用`SqlBulkCopy` 、データを挿入するために、それは時間(約1.5時間)の多くを取っています。
回答: これほど長い時間はかかりません。私の見積もりでは、約600MBのデータがあります。 10MB /秒以上、 *または* 1MB /秒*以上*に手を加えることができなければなりません。これは、1〜10分が簡単に達成できることを意味します。 何をすべきか: * どの部分が長くかかるのかを特定する * 可能なボトルネックの候補リストを作る * あなたが犯人を見つけるまで各理論をテストしてください * 回避策を実装してください。 詳細がなければ、正確ではありませんが、私は推測することができます: * `SqlBulkCopy`は通常は高速ですので、挿入がボトルネックではない可能性があります。あなたはdatatableよりも少し速くすることができますが、それはおそらく問題ではありません。 * `DataTable`は「インデックス」を持つことができ`DataTable` 。すなわち、主キーおよび制約。これらは非常に非効率的に実装されています - これらは間違いなく問題を引き起こす可能性があります。 * `SqlBulkCopy`は高速ですが、 *多くの*行で最適です。 `SqlBulkCopy`ごとに1つのファイルしかコピーしていない場合は、データベース側で30000コール、おそらく少なくとも30000 fsyncsを意味します。 `SqlBulkCopy`は1つだけ使用する必要があります。 * データベースには、挿入した行のインデックスや制約がある場合があります。これらはパフォーマンスを著しく制限する可能性があります - データベースの負荷をチェックしてください。 * .NETのほとんどのxmlリーダーはかなり速いですが、1つのスレッドで10MB / sがそれを押している可能性があります。あなたのアクセスパターンが特に悪い場合(例えば、完全な`XmlDocument`を読み込み、それに多くの非効率なループやXPathを照会するなど)、CPU負荷の問題にぶつかる可能性があります。 * 20KBのファイルはかなり小さいです。これらをHDDから読み取っている場合は、1MB /秒を達成するには、50秒、つまり20msのレイテンシを読み取る必要があります。これは問題です。特に、ディスク上にファイルが順番に配置されていない場合は問題です。並列化は少し助けになるかもしれませんが、SSDはより多くのものを助けます(そしてどちらも良いでしょう)。しかし、パフォーマンスがこれ*より*もはるかに*低い*と思われるため、これはおそらく主要なボトルネックではありません。 そのことを念頭に置いて、私はこの順番で以下を見ていきます * クライアントのディスク負荷(ディスク待ち時間が長い場合は、SSDと並行性を考慮してください) * CPU負荷プロファイル(非効率な解析または誤った`DataTable` ) * `SqlBulkCopy`インスタンス - スレッドを1つだけ使用する * データベースのロード(できるだけクラスタ化されたインデックスを含む可能なインデックスを取り除く) 注文は、この問題をチェックするのがどれほど難しいかに基づいています。ディスクの負荷は問題になる可能性は低いですが、チェックするのは簡単ではありません。その可能性を排除することから始めることもできます。データベーススキーマの問題はそれほど難しくありませんが、どちらのインデックスであるかを特定する作業が増えていますが、別のワークフローに影響を及ぼしていますか?