このコードは動作していますが、10kレコードでは非常に遅いです。 SQL Serverに一括してデータを挿入する方法はありますか?

c# excel sqlbulkcopy sql-server

質問

このコードは機能しています。レコードを行単位で保存するよりも優れていますが、10Kレコードでは非常に遅いです。 SQL Serverに一括してデータを挿入する方法はありますか?

データベースにバルクデータを追加する

using (var scope = new TransactionScope())
{
    string connectionString = "Data Source=94.73.148.5;" +
                              "Initial Catalog=YirmibesYazilimMutabakat;" +
                              "User id=id;Password=password;";

    var sqlConnection = new SqlConnection(connectionString);
    var sqlBulkCopy = new SqlBulkCopy(sqlConnection)
    {
        DestinationTableName = "FaturaExcel",
        BulkCopyTimeout = 6000
    };

    var dataTable = copyExcel;
    sqlConnection.Open();

    sqlBulkCopy.WriteToServer(dataTable);

    scope.Complete();
    sqlBulkCopy.Close();
    sqlConnection.Close();
    sqlConnection.Dispose();
}

編集:バッチサイズを追加

bulkCopy.WriteToServer(dataTable);この文は40秒かかります。他の人はまあまあです。また、私はトランザクションを使用するcould'nt。

 string connectionString ="Data Source=94.73.148.5;" +
                          "Initial Catalog=YirmibesYazilimMutabakat;"               
 using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionString))
 {
   var sqlConnection = new SqlConnection(connectionString);
   bulkCopy.BatchSize = 4000;
   bulkCopy.DestinationTableName = "FaturaExcel";
   var dataTable = copyExcel;
   sqlConnection.Open();
   bulkCopy.WriteToServer(dataTable);
   bulkCopy.Close();
   sqlConnection.Close();
   sqlConnection.Dispose();
 }

エキスパート回答

SqlBulkCopyはすでに非常に高速です。

20kレコードは40秒かかるはずはありません。

SqlBulkCopyのパフォーマンスを向上させるためのいくつかの方法を次に示します。

  • BatchSizeを使用すると、パフォーマンスが向上する可能性があります。たとえば4000
  • SqlBulkCopyOptions.TableLockオプションを使用すると、パフォーマンスが向上します。

編集:回答のコメント

私は既にSqlBulkCopyを使用していました。私は何かが間違っていた

はい、知っています。私の指摘は、あなたはSqlBulkCopyよりも本当に速いものを見つけることができないということです。

BatchSizeを使用するには

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionString, transaction))
{
    // SET BatchSize value.
    bulkCopy.BatchSize = 4000;

    bulkCopy.DestinationTableName = "TheDestinationTable";
    bulkCopy.WriteToServer(dt);
}

出典: http : //www.sqlbulkcopy-tutorial.net/batchsize

前述のように、BatchSizeは役立つかもしれません。これは、複数のバッチを挿入すると、一度に100万行を挿入するよりも高速であることが多いため、デフォルトのバッチサイズ値(0 =無制限)を使用するのは悪い方法です。あなたの場合、あなたは20kしか持っていませんが、40秒かかるので、試してみる価値があります。

それはSQLデータベースに関連する状況かもしれません

私は、あなたの問題がおそらくもっとネットワークの問題なのか、それともこのようなものだろうと信じています。 20k行を挿入するには、1秒未満が必要です。

いくつかの "INSERT"ステートメントをベンチマークしてデータベースの往復時間を確認することをお勧めします。たとえば、1つの行を挿入します。 Azureのある人が1列を挿入すると100ミリ秒以上かかることがありますが、これは非常に遅いです。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ