我在云上有一个带有sql azure数据库的azure应用程序。我有一个worker角色,需要在一个文件(最多3000万行)上执行parsing+processing,所以我不能直接使用BCP或SSIS。
我目前正在使用SqlBulkCopy,但是这似乎太慢了,因为我已经看到400k行的加载时间长达4-5分钟。
我想并行运行我的批量插入;然而,在阅读有关并行导入数据/控制锁行为的文章时,它指出SqlBulkCopy要求表没有聚集索引,并且需要指定一个表锁(BU锁)。然而,azure表必须有一个聚集索引...
在SQL Azure中是否可以在同一个表上并行使用SqlBulkCopy?如果没有,有没有其他API (我可以在代码中使用)来做这件事?
发布于 2012-03-02 18:14:03
我不明白你怎么能比使用SqlBulkCopy运行得更快。在我们的项目中,我们可以在大约3分钟内导入25万行,因此您的速度似乎是正确的。
我不认为并行做会有帮助,即使这在技术上是可行的。我们一次只运行一次导入,否则SQL Azure会开始让我们的请求超时。
实际上,有时在导入时同时运行大型group-by查询是不可能的。SQL Azure做了大量工作来确保服务质量,这包括超时太长时间的请求,占用太多资源等
因此,同时执行多个大容量插入可能会导致其中一个超时。
发布于 2012-03-05 23:12:31
可以在SQL Azure上并行运行SQLBulkCopy,即使您加载的是相同的表。在将记录发送到SQLBulkCopy接口之前,您需要自己批量准备记录。这绝对有助于提高性能,并且当您由于您自己的工作之外的原因而受到限制时,它允许您控制较小批量记录的重试操作。
看一下我的blog post,它比较了不同方法的加载时间。还有一个示例代码。在单独的测试中,我能够将一个表的加载时间减半。
这是我在几个工具(Enzo备份;Enzo数据复制)中使用的技术;这不是一件简单的事情,但如果处理得当,您可以显着优化加载时间。
https://stackoverflow.com/questions/9519402
复制相似问题