繁体   English   中英

高峰操作时段的 Sql Server 大容量插入

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM