SQL Server 2005データベースに大量のデータを挿入するC#クライアントでパフォーマンスのボトルネックを起こしています。プロセスをスピードアップします。SQL Server(C#クライアント)に多数のデータを一括して一括して挿入する最も速い方法は何ですか
私はすでに、SqlClient.SqlBulkCopy(TDSに基づいています)を使用して、データ転送を高速化し、多くの手助けをしましたが、まだもっと探しています。
私はこのようになり、簡単なテーブルがあります。私はContainerIDのとBinId各チャンクに一定であり、シーケンス値が0、nが約300行を平均チャンクにデータを挿入してい
CREATE TABLE [BulkData](
[ContainerId] [int] NOT NULL,
[BinId] [smallint] NOT NULL,
[Sequence] [smallint] NOT NULL,
[ItemId] [int] NOT NULL,
[Left] [smallint] NOT NULL,
[Top] [smallint] NOT NULL,
[Right] [smallint] NOT NULL,
[Bottom] [smallint] NOT NULL,
CONSTRAINT [PKBulkData] PRIMARY KEY CLUSTERED
(
[ContainerIdId] ASC,
[BinId] ASC,
[Sequence] ASC
))
を値は主キーに基づいて事前ソートされます。
%Disk Timeパフォーマンスカウンタは100%で多くの時間を費やしているため、ディスクIOは主な問題ですが、私が得ているスピードはRAWファイルコピーよりも数桁小さいことは明らかです。
私があれば、それはどの助けるん:私は挿入をしていながら
- は、主キーを削除し、以降の
- DOは、同じスキーマに一時テーブルに挿入、それを再作成し、定期的にそれらを転送しますメインテーブルは、挿入が起こっているテーブルのサイズを小さく保つために小さい
- それ以外は何ですか?
- 私が得ているの応答に基づいて、私は少しを明確にしましょう:
ポートマン:私は、クラスタ化インデックスを使用していたデータがすべてインポートされたとき、私はデータにアクセスする必要がありますので、その順番で連続している。私は特に、データをインポートする際にインデックスがそこにある必要はありません。インポートのために制約を完全に削除するのではなく、挿入を実行している間にノンクラスタードPKインデックスを使用する利点はありますか?
Chopeen:データは他の多くのマシン上でリモートで生成されています(現在のSQLサーバーは現在約10個しか処理できませんが、これ以上追加できることが大好きです)。ローカルマシン上でプロセス全体を実行することは実用的ではありません。なぜなら、出力を生成するために50倍の入力データを処理する必要があるからです。
Jason:インポート処理中にテーブルに対して並行クエリを実行していないため、プライマリキーを削除して、それが役立つかどうかを確認します。
http://msdn.microsoft.com/en-us/library/ms174335.aspx – JohnB