SQL慢插入

时间:2012-11-14 10:32:16

标签: asp.net sql sql-server

我有一个ASP.NET应用程序,它采用存储在XML中的大量数据集并将它们扩展为SQL,在扩展过程中它会删除大量插入。

这些插页需要相当长的时间,现在我公开承认我的SQL技能不是那么好,所以我的诊断方法可能看起来有些粗糙。

在SQL Server管理活动监视器上,处理器时间约为3%,服务器上的实际CPU使用率也在这附近,因此代码没有运行平稳,有0个等待任务,并且I / O稳定在0.3MB /秒,批量请求大约为180 /秒

在资源等待中,Logging有一个大约900ms的等待时间,这导致我朝着慢磁盘的方向发展,我将日志文件移动到另一组磁盘上,这使我的批处理请求增加到260 /秒,但它确实不是很平坦。

我是否正确地认为它的磁盘导致这个盒子的速度变慢,除了新的服务器(它是一台带有UW320磁盘的老式HP DL385双CPU)之外,其他所有东西都在耐心地等待磁盘的转动。有没有办法加快插入?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

并不完全熟悉您所处的环境,但交易是否可行?如果是这样,您可以通过首先启动事务,然后执行一堆INSERT,然后结束事务来大大加快INSERT的速度。否则,每个INSERT都作为自己的事务运行,因此只需完成它就可以进行大量处理。