1

XMLに格納されている一連のデータセットを取得してSQLに展開するASP.NETアプリケーションがあります。展開プロセスでは、多数の挿入が実行されます。

これらの挿入にはかなりの時間がかかりますが、SQLスキルがそれほど優れていないことを公然と認めます。そのため、私の診断方法は少し粗雑に見えるかもしれません。

SQL Server Management Activity Monitorでは、プロセッサ時間は約3%であり、サーバーの実際のCPU使用率もその前後であるため、コードは完全に実行されておらず、待機中のタスクはなく、I/Oは安定しています。 0.3MB /秒では、バッチ要求は約180/秒です

リソース待機では、ロギングの待機時間は約900ミリ秒であるため、低速のディスクの方向に進み、ログファイルを別のスピンドルのセットに移動しました。これにより、バッチ要求が260 /秒に増加しましたが、確かにそうではありませんでした。横ばいになります。

このボックスの速度低下の原因となっているディスクと、新しいサーバー(UW320ディスクを搭載した古いHP DL385デュアルCPU)を除いて、すべてがディスクの電源投入を基本的に辛抱強く待っていると私は考えていますか?インサートをスピードアップするには?

4

2 に答える 2

2

SQL Serverへの一括挿入の場合SqlBulkCopy、要件に実際に使用する必要があります。

これが小さな例です。

// Set up your target fields and types
Dictionary<string, string> uploadFields = new Dictionary<string, string>()
{
    { "LocationId", "System.Int32" },
    { "CalendarDate", "System.DateTime" },
    { "IsWorkingDay", "System.Boolean" },
    { "SnapshotDate", "System.DateTime" }
};

// Set up a DataTable to hold the stuff we want to send.
DataTable   massUpdate  = new DataTable();

// Use the dictionary above to set up columns
uploadFields
  .Keys
  .ToList()
  .ForEach(k => massUpdate.Columns.Add(k, Type.GetType(uploadFields[k])));

// Populate your datatable
foreach ( var thing in things )
{

   DataRow row = massUpdate.NewRow();

   row["LocationId"]       = thing.Id;
   row["CalendarDate"]     = thing.Date;
   row["IsWorkingDay"]     = thing.IsWorkingDay;
   row["SnapshotDate"]     = DateTime.UtcNow;

   massUpdate.Rows.Add(row);
}

// Finally, send the contents of the DataTable up via SqlBulkCopy.
// GetConnectionString
using (SqlConnection conn = new SqlConnection("Your connection string"))
{
  using (SqlBulkCopy copy = new SqlBulkCopy(conn))
  {
    conn.Open();

    foreach (var key in uploadFields.Keys)
    {
      copy.ColumnMappings.Add(key, key);
    }

    // Swap this table name with yoyr own.
    copy.DestinationTableName = "DestinationTableName";
    copy.WriteToServer(massUpdate);
    conn.Close();
  }
}

ドキュメント:-

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx

于 2012-11-15T09:02:59.083 に答える
0

現在の環境に完全に精通しているわけではありませんが、トランザクションは可能ですか?その場合、最初にトランザクションを開始し、次に一連のINSERTを実行してからトランザクションを終了することにより、INSERTを大幅に高速化できます。それ以外の場合、すべてのINSERTは独自のトランザクションとして実行されるため、それを実行するためだけに多くの処理が行われます。

于 2012-11-14T10:37:05.493 に答える