2016-12-05 15 views
1

構造化されたテーブルの挿入と一括コピーの間にパフォーマンスの違いがあるかどうかは疑問です。 私はそれを実装し始める前にパフォーマンスが良いかもしれません。私はSpring.netを使ってデータベース層の呼び出しを行っています。SQLの一括コピーと構造化テーブルの挿入

のSQL一括挿入

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(this.connectionstring) 
{ 
bulkCopy.DestinationTableName = "BulkDataTable"; 
bulkCopy.WriteToServer(dataTable); 
} 

SQL構造型インサート は、データテーブルにマップするデータ・タイプを作成し、一括して挿入されるすべての行でのデータテーブルを渡します。

DataTable dataTable = this.dataTableRef.Value.Clone(); 
// add rows the the binary data table 
SqlParameter insertParam = new SqlParameter(); 
insertParam.ParameterName = "DataTableInput"; 
insertParam.SqlDbType = SqlDbType.Structured; 
insertParam.TypeName = "dbo.DataTableType"; 
insertParam.Value = dataTable; 
insertParams.AddParameter(insertParam); 
AdoTemplate.ExecuteNonQuery(CommandType.Text, "INSERT INTO <table_name> SELECT * FROM @DataTableInput", insertParams); 

答えて

2

実際には、一括挿入するデータの量と、SQL Serverインスタンスの回復モードの設定方法によって異なります。 SqlBulkCopyは、データベースが単純回復または一括回復の場合、状況によっては最小限しか記録されない挿入を提供します。データベースがフル・リカバリーの場合、パフォーマンスの差はほとんどありません。

MSDNから

さらなる比較:テーブル値パラメータを用い

が セットベースの変数を使用する他の方法に匹敵します。ただし、テーブル値のパラメータを頻繁に使用すると、大きなデータセットの方が高速になる場合があります( )。 がテーブル値のパラメータよりも起動コストが高い一括操作に比べて、テーブル値の パラメータは1000行未満の挿入に適しています。

一時テーブル のキャッシングを利用して再利用されるテーブル値パラメータ。このテーブルキャッシングは、同等の BULK INSERT操作よりも優れたスケーラビリティを実現します。小さな行挿入操作を使用すると、BULK INSERT操作またはテーブル値の パラメータの代わりに、パラメータリストまたは バッチステートメントを使用することで、小さな のパフォーマンス上の利点が得られる場合があります。ただし、これらのメソッドはプログラムするのにはあまり便利ではなく、行が増えるにつれてパフォーマンスが急速に低下します( )。

テーブル値のパラメーターは、同等のパラメーター 配列の実装と同等またはそれ以上の性能を発揮します。

関連する問題