使用SqlBulkCopy和Azure并行批量插入

azure azure-sql-database database parallel-processing sqlbulkcopy

我在云上有一个带有sql azure数据库的天蓝色应用程序。我有一个工作角色,需要对文件进行解析+处理(最多约3000万行),所以我不能直接使用BCP或SSIS。

我目前正在使用SqlBulkCopy,但是这看起来太慢了,因为我看到400k行的加载时间长达4-5分钟。

我希望并行运行我的批量插入;但是阅读有关并行/控制锁行为导入数据的文章,它说SqlBulkCopy要求表没有聚簇索引,并且需要指定表锁(BU锁)。但是,azure表必须具有聚簇索引...

甚至可以在SQL Azure中的同一个表上并行使用SqlBulkCopy吗?如果没有,那么还有另一个API(我可以在代码中使用)吗?

一般承认的答案

我没有看到你如何比使用SqlBulkCopy更快地运行。在我们的项目中,我们可以在大约3分钟内导入250K行,因此您的速度似乎是正确的。

即使技术上可行,我也不认为并行这样做会有所帮助。我们一次只运行1个导入,否则SQL Azure会开始超时我们的请求。

实际上,有时在无法导入的同时运行大型分组查询。 SQL Azure在确保服务质量方面做了大量工作,包括超时请求超时,占用太多资源等

因此,同时进行多个大型批量插入可能会导致一次超时。


热门答案

即使加载了同一个表,也可以与SQL Azure并行运行SQLBulkCopy。在将它们发送到SQLBulkCopy API之前,您需要自己批量准备记录。这绝对有助于提高性能,它允许您在出于自身行为之外的原因受到限制时控制较小批量记录的重试操作。

看一下我的博客文章,比较各种方法的加载时间。还有一个示例代码。在单独的测试中,我能够将桌子的加载时间减半。

这是我用于几种工具的技术(Enzo Backup; Enzo Data Copy);这不是一件简单的事情,但如果做得好,你可以大大优化加载时间。




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因