快速插入; BulkCopy与关系数据

时间:2011-02-17 14:37:03

标签: sql sql-server insert sqlbulkcopy

我有大量不断传入的数据(大约每分钟10,000次,并且正在增长),我希望尽可能高效地插入到数据库中。目前我正在使用准备好的insert语句,但我正在考虑使用SqlBulkCopy类以更大的块来导入数据。

问题在于我没有插入单个表 - 数据项的元素被插入到多个表中,并且它们的标识列在同时插入的其他行中用作外键。我知道批量复制并不意味着允许更复杂的插入,但我想知道是否值得为uniqueidentifier列交换我的标识列(在本例中为bigint)。这将允许我为每个表执行几个批量复制,并且因为我可以在插入之前确定ID,所以我不需要检查SCOPE_IDENTITY之类的任何东西,这阻止我使用批量复制。

这听起来像是一个可行的解决方案,还是我可能面临其他潜在问题?或者,有没有其他方法可以快速插入数据,但保留我对bigint标识列的使用?

感谢。

2 个答案:

答案 0 :(得分:3)

uniqueidentifier可能会让事情变得更糟:页面分裂和更广泛。见this

如果你的负载是/可以批处理,一个选项是:

  • 您加载了临时表
  • 将实际表格作为存储过程一次性加载
  • 在每个批次的临时表中使用uniqueidentifier

我们处理每秒大约50k行的峰值(并以此方式增加)。我们实际上使用一个单独的临时数据库来避免双事务日志写入)

答案 1 :(得分:1)

听起来你正在计划交换“SQL为[bigint identity()列]代理键分配”,并使用“数据准备例程确定GUID代理键”方法。换句话说,密钥不会在SQL中分配,而是从外部SQL分配。鉴于您的数量,如果数据生成过程可以分配代理键,我肯定会这样做。

那么问题就变成了,你必须使用GUID,还是你的数据生成过程能产生自动递增的整数?创建这样一个工作一致且无懈可击的过程很难(为SQL Server支付$$$的一个原因),但是在数据库中更小和更易于理解的密钥的权衡可能是值得的。

相关问题