これは、私の最初の質問「“SQL” エクスポートを T-SQL に移植する 」のフォローアップです。
私は、自分では制御できず、変更できないサードパーティのプログラムを使用しています。このプログラムは、内部データベースを.sql
次の形式でそれぞれのセットにエクスポートします。
INSERT INTO [ExampleDB] ( [IntField] , [VarcharField], [BinaryField])
VALUES
(1 , 'Some Text' , 0x123456),
(2 , 'B' , NULL),
--(SNIP, it does this for 1000 records)
(999, 'E' , null);
(1000 , 'F' , null);
INSERT INTO [ExampleDB] ( [IntField] , [VarcharField] , BinaryField)
VALUES
(1001 , 'asdg', null),
(1002 , 'asdf' , 0xdeadbeef),
(1003 , 'dfghdfhg' , null),
(1004 , 'sfdhsdhdshd' , null),
--(SNIP 1000 more lines)
このパターンは、.sql
ファイルがエクスポート中に設定されたファイル サイズに達するまで続きます。エクスポート ファイルは次のようにグループ化されますEXPORT_PATH\%Table_Name%\Export#.sql
。# は 1 から始まるカウンターです。
現在、約 1.3GB のデータがあり、1MB のチャンクでエクスポートしています (26 個のテーブルにまたがる 1407 個のファイル、5 個を除くすべてのテーブルには 1 個のファイルしかなく、最大のテーブルには 207 個のファイルがあります)。
現在、各ファイルを ram に読み込み、 ExecuteNonQueryを呼び出す単純な C# プログラムがあります。問題は、平均 60 秒/ファイルです。つまり、エクスポート全体を実行するには約 23 時間かかります。
INSERT INTO の代わりに BULK INSERT でロードされるようにファイルをフォーマットする方法があれば、はるかに高速になると思います。これを行う簡単な方法はありますか、それともある種の検索と置換を作成し、いくつかのコーナーケースで失敗してデータを爆破しないように指を交差させておく必要がありますか?
挿入を高速化する方法に関する他の提案もいただければ幸いです。
アップデート:
私は解析に行き、 SqlBulkCopy メソッドを実行しました。1ファイル/分からでした。~1ファイル/秒。