2012-01-06 9 views
3

現在、ユーザーセッションごとに特定のテーブルに5〜10,000行以上のデータを生成するアプリケーションを開発中です。現時点では、sqlテキストコマンドを使用して一度に各行のデータを挿入するため、保存操作には最大1分かかる場合があります。私たちはSqlBulkInsertsを使用して遊んでいて、時間が500ms以下になるのを見ました。多くのユーザーがシステムを使用するプロダクションアプリケーションでSqlBulkInsertsを使用することに異論はありますか?本番アプリケーションでのSqlBulkInsertの使用

答えて

6

SqlBulkCopyでtableLockオプションが設定され、別のユーザーがブロックされているという問題が発生したことはありません。 TableLockオプションは、多くの人が話したことからインサートの効率を高め、それを使っているだけで私に見せてくれました。

私の典型的な方法:そのため、当社のデータベースが構成されている方法の

public void Bulk(String connectionString, DataTable data, String destinationTable) 
{ 
    using (SqlConnection connection = new SqlConnection(connectionString)) 
    { 
     using (SqlBulkCopy bulkCopy = 
      new SqlBulkCopy 
      (
      connection, 
      SqlBulkCopyOptions.TableLock | 
      SqlBulkCopyOptions.FireTriggers | 
      SqlBulkCopyOptions.UseInternalTransaction, 
      null 
      )) 
     { 
      bulkCopy.BatchSize = data.Rows.Count; 
      bulkCopy.DestinationTableName = String.Format("[{0}]", destinationTable); 
      connection.Open(); 
      bulkCopy.WriteToServer(data); 
     } 
    } 
} 
1

アプリケーションが本当にセッションごとに多くのレコードを生成する必要がある場合は、適切な方法だと思います。

+0

、我々はSqlBulkCopyを使用している間、我々はデッドロックエラーを取得し、このために、単一のトランザクションでのデータを格納している12個のテーブルを持っています。 SqlBulkCopyOptions.TableLockを設定することにより、デッドロックがなくなりました。バルクインサートを行うためにテーブルをロックするのに不利な点はありますか?同時にトランザクションを実行しようとしている他のユーザーを傷つけるでしょうか? – PCG

+0

あなたは麻痺錠を持っていることを除いてはどういう意味ですか?次にデッドロックは別のことであり、プログラミングの悪影響を受けていることを示しています - 発生した問題を修正し、悪いコードを悪用して症状を悪化させないでください。 – TomTom

+0

私はあなたが私の背中を叫ぶプロダクトマネージャーを持っていなかった場合、私は完全に同意するでしょう、多分いくつかのインデックスを除いてデータベーススキーマについての1つの事を変えずに、私は完全な状況によって完全に困惑した。 – PCG

2

SqlBulkInsertを使用して実装する前に、このように見えるように動的にINSERTクエリを作成してみてください:

insert into MyTable (Column1, Column2) 
select 123, 'abc' 
union all 
select 124, 'def' 
union all 
select 125, 'yyy' 
union all 
select 126, 'zzz' 

これは、はるかに迅速に実行する必要がある唯一のデータベース呼び出しになります。 SQL文字列連結の場合は、StringBuilderクラスを使用してください。

+0

私はこのアイデアを歓迎しましたが、このアプローチの問題は、自己参照テーブルなので階層ツリーを構築しているときにプライマリキー用に作成されたID値がサーバー上に戻ってくる必要があることです。 – PCG

+0

だから何ですか?このtotlalyはSqlBulkCopyの使用も除外しています。サーバー生成IDが必要な場合は、バルク挿入をどのように行いますか?答えは妥当であり、あなたの褒賞はあなたの声明と矛盾します。 – TomTom

+0

あなたの権利と私はばかです。 SqlBulkCopyの実装では、ツリーの各レベルで挿入したばかりのデータのリストを取得して、生成されたIDのリストを取得していました。私は、あなたが上記で提供したステートメントを使用して同じことをすることについても考えなかった。 – PCG

関連する問題