高峰时段的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