[英]Sql Server Bulk Insert during peak operations hours
我在数据库中有一个表,它通常非常频繁地并发查询,峰值接近每秒 100 次选择(根据分析数据推测)。 表中的行数很快就会达到 2 亿条记录。 对单个/单个行的持续更新,也继续执行。
此表中的数据是通过夜间作业填充的,有意在凌晨 1 点的高峰时段进行填充,以免影响性能。 导入大小有时可以达到 100 万条记录。 使用 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 操作的任何建议。 这种情况有可扩展的解决方案吗? 现有行数增加,导入大小增加,最终用户群增加,但我仍然可以在一天中的任何时间继续执行如此庞大的数据抽取。
抱歉,没有太多具体的数据可以分享,有点含糊。 只是想知道其他人是如何做到的,如果有人有这样的经历。
您可以小批量加载数据,这样就不会产生大事务和消耗大量事务日志。 在每批之后,您可以提交事务。 您可以使用内部交易方法,将每个批次作为单独的交易。 阅读有关事务和批量复制的更多信息
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();
}
}
此外,还有一些与批量复制相关的优化提示。 您可以尝试尽可能利用: 批量复制优化
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.