我有一个ASP.NET应用程序,它采用存储在XML中的大量数据集并将它们扩展为SQL,在扩展过程中它会删除大量插入。
这些插页需要相当长的时间,现在我公开承认我的SQL技能不是那么好,所以我的诊断方法可能看起来有些粗糙。
在SQL Server管理活动监视器上,处理器时间约为3%,服务器上的实际CPU使用率也在这附近,因此代码没有运行平稳,有0个等待任务,并且I / O稳定在0.3MB /秒,批量请求大约为180 /秒
在资源等待中,Logging有一个大约900ms的等待时间,这导致我朝着慢磁盘的方向发展,我将日志文件移动到另一组磁盘上,这使我的批处理请求增加到260 /秒,但它确实不是很平坦。
我是否正确地认为它的磁盘导致这个盒子的速度变慢,除了新的服务器(它是一台带有UW320磁盘的老式HP DL385双CPU)之外,其他所有东西都在耐心地等待磁盘的转动。有没有办法加快插入?
答案 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都作为自己的事务运行,因此只需完成它就可以进行大量处理。