ADO.netの挿入を劇的に高速化するためにできることがあるかどうかを探していますが、それでも複数のINSERT INTO table values (...)
コマンドで挿入を行います。独自のクエリ不可能なデータベース ファイルから SQL Server にデータをステージングしています。私が書いているユーティリティは、スクリプトから使用されます。
可能な限り最高のパフォーマンスを得るためにINSERT INTO
は、間違ったルートを追求することを理解していますが、試してみるべきADO.netまたはSQL Serverのアプローチがあるかどうかを知りたいです。
C# 2010 を使用して SQL Server 2008 に接続しています。Native Client 10.0 で Microsoft の ODBC 3.5 ドライバーを使用して SQL Server にデータを挿入する非管理コードとパフォーマンスを比較しています。ODBC のパフォーマンスに匹敵できると期待するのは合理的ですか?
宛先テーブルにはインデックスやその他の制約、トリガーはなく、単なるステージング テーブルです。ソース データは、一連の非標準データ型であり、文字列に変換する必要があります。
関連する詳細に取り除かれると、私のコードは次のとおりです。
SqlCommand comm = new SqlCommand;
SqlConnection conn = new SqlConnection(connectionString);
conn.Open();
SqlTransaction insertTransaction = conn.BeginTransaction();
comm.Connection = conn;
comm.Transaction = insertTransaction;
while(buffer.ReadNext()) // fill a buffer that I use to make my query
{
// form my insert statement and assign it
// It looks like: INSERT INTO myTable VALUES (5,'2016-02-16',NULL,3)
// A good fraction of the data is numeric with decimal points. A good
// fraction is dates. The parsing and string building,
// extravagantly inefficient as it is, is not the culprit.
// The INSERT INTO does not specify the column names
comm.CommandText = myStatement;
if (comm.ExecuteNonQuery() != 1) {throw...}
}
insertTransaction.commit;
さまざまな分離レベルを指定してみました。指定でき.Snapshot
ませんでした (それを許可するようにターゲット データベースを構成したくありません)。何も大きな違いはありませんでした。
INSERT ステートメントを形成するだけでスピンできるようにコメントアウトするcomm.ExecuteNoQuery
と、実際に何かを実行している場合に必要と思われる速度で実行されます。コメントを外すと、思ったよりも約 8 倍の時間がかかります。「『8倍』はどこから?」あなたが尋ねる。さて、私は Pervasive Data Integrator (ye olde Data Junction) で同様の操作 (エンド ツー エンドの同一操作) を行います。Pervasive がクラッシュしたときの診断から、私とINSERT INTO
同じように、プログラムが連続したステートメントを使用して挿入を行っていると思われます。INSERT INTO
私のプログラムよりも約 8 倍速くなり、実行しない場合にステートメントを 作成するよりもわずかに遅くなります。
Pervasive Integrator は ODBC を介して追加しており、ODBC ドライバーは Sql Native クライアントを使用するように設定されています。また、Data Integrator は .Net ソフトウェアではありません。私は実際にODBCを試したことはありません.ODBCを試してみることにします.
一括挿入を行う目的で dataTable を入力しようとしましたが、データセットの入力にも時間がかかりすぎました。一括挿入を使用する別の方法がそれを機能させるための最も速い方法であると思いますが、最終的に私のアプローチの使用をやめたとしても、INSERT INTO
なぜそんなに時間がかかるのか不思議です(私が思っているよりも)
挿入ステートメントはかなり長く、テーブルには約 350 列あります。