批量插入Azure数据库的速度很慢



我们在运行多个数据库的Azure中运行一个弹性池,当运行一个较大的导入时,这似乎比我们习惯的时间要长。在这些导入过程中,我们以6核运行作为测试。所有的数据库都可以使用所有的内核。

在我们的本地环境中,它每秒插入大约100k条记录,然而,相同的数据集在Azure上每秒插入大约1k(我们的vm)到4k每秒(dev laptop)。

在此插入期间,数据库仅使用14%的log IO, 5%的CPU和0%的DataIO。当在P2中使用DTU模型设置新数据库时,我们注意到相同的体验。所以我们甚至没有达到数据库的极限

表包含36列,这些列都是必需的。

我们已经使用bulkinset以以下方式使用不同的批处理大小

BulkConfig b = new BulkConfig();
b.BatchSize = 100000;
await dbcontext.BulkInsertAsync(entities, b);

除了使用标准的EntityFramework,还可以使用较小的批量。我们甚至使用了手动编写的SqlBulkCopy方法,但是都没有成功。

现在的问题主要是,这是软件问题吗?我们在AzureDB中遇到问题了吗?我们是否需要改变批量导入的方式?

编辑:

尝试在BulkInsert中使用TempDB设置来运行导入,但是这也没有提高性能。

  1. 在应用层上遍历数据集,调用a将执行INSERT/UPDATE操作的每一行的存储过程基于存在某个键的记录的操作。如果要推翻的记录数量有限,这种策略可能很有效;否则,往返和日志写入将对速度。
  2. 要减少往返和日志写入并提高吞吐量,请使用像ADO中的SqlBulkCopy类这样的批量插入方法。网上传完整的数据集到Azure SQL数据库,然后执行所有在单个批处理中执行INSERT/UPDATE(或MERGE)操作。整体执行时间可以从几小时减少到几分钟/秒这个方法。

这里,是一个与相同场景相关的讨论:优化Azure SQL数据库批量更新场景- link.

相关内容

  • 没有找到相关文章

最新更新