如何解决高峰时段的SQL Server批量插入
我在数据库中有一个表,该表通常非常频繁且同时被查询,高峰时每秒接近100个选择(根据分析数据进行猜测)。表格中的行数很快就会达到2亿条记录。连续更新单行/单个行,并继续执行。
此表中的数据是通过每晚进行的工作填充的,有意在凌晨1点关闭高峰时段,以免影响性能。导入大小有时可以达到一百万条记录。使用sqlBulkcopy,与下面的示例相同。
var dt = new DataTable();
dt.Columns.Add("EmployeeID");
dt.Columns.Add("Name");
for (var i = 1; i < 1000000; i++)
dt.Rows.Add(i + 1,"Name " + i + 1);
using (var sqlBulk = new sqlBulkcopy(_connectionString))
{
sqlBulk.DestinationTableName = "Employees";
sqlBulk.WritetoServer(dt);
}
源数据系统最近请求执行两次数据抽取,一天中也执行一次,有效地使我们在高峰时段插入数据。
关于如何执行sqlClient.sqlBulkcopy操作而不影响最终用户体验的任何建议。是否有针对这种情况的可扩展解决方案?现有的行数在增长,导入的大小在增长,最终用户群也在增长,但是我仍然可以在一天中的任何时候继续执行如此庞大的数据抽取。
抱歉,由于没有太多具体的数据要共享,因此有点模糊。如果有人有这样的经验,只是想了解别人如何做到这一点。
解决方法
您可以小批量加载数据,这样就不会生成大事务,也不会消耗大量事务日志。每一批之后,您可以提交事务。您可以使用内部事务处理方法,使每个批次成为单独的事务。 Read more on transactions and bulkcopy
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(
connectionString,SqlBulkCopyOptions.KeepIdentity |
SqlBulkCopyOptions.UseInternalTransaction))
{
bulkCopy.BatchSize = 10000;
bulkCopy.DestinationTableName =
"dbo.BulkCopyDemoMatchingColumns";
// Write from the source to the destination.
// This should fail with a duplicate key error
// after some of the batches have been copied.
try
{
bulkCopy.WriteToServer(reader);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
reader.Close();
}
}
此外,还有一些与批量复制相关的优化技巧。您可以尝试尽可能利用:Bulk Copy optimizations
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。