最佳配料尺寸选择

时间:2017-10-30 13:29:03

标签: azure azure-cosmosdb

在Microsoft的documents regarding CosmosDB中,有人说当您进行批量保存或提交时,存储过程和UDF编程很好,但它没有说明批量大小/记录计数。

  

批处理 - 开发人员可以对插件等操作进行分组并批量提交。创建单独事务的网络流量延迟成本和存储开销显着降低。

有限制吗?什么是最佳做法?

例如,假设我有一百万条记录,我想保存,每条记录为2-4KB。我认为用3 GB的数据调用SP并不是一个好主意。 :)

我应该在1次通话中使用1000行(~3MB)还是仍然太大/小?

* PS :由于承诺在不到15毫秒内完成写入操作,我认为1000条记录应该少于15秒,5000条记录少于75秒仍然有效。

2 个答案:

答案 0 :(得分:0)

我会说,您应该尝试提出正确的批量大小。

但是,请记住sprocs只能运行5秒钟。有关如何从代码处理此问题,请参阅https://docs.microsoft.com/en-us/azure/cosmos-db/programming#bounded-execution

希望得到这个帮助。

答案 1 :(得分:0)

在进行批处理时,您需要考虑一些事项。

使用存储过程执行Batch upsert时,它只能在单个分区上运行。

如果您的每条记录都是4 KB,那么对于单次写入,写入操作将消耗大约4次6 RU /秒= 24 RU /秒。 单个物理分区最多只能有10K RU,这意味着您最多可以插入416个文档/秒。 这假设没有额外的索引成本,并且没有其他写入发生在相同的物理分区。

批处理肯定可以节省您的网络跃点。 但是在使用批处理时应该考虑以下内容:

  1. 执行存储过程会消耗一些额外的RU,这些RU将从分配给您的分区的RU中消耗掉。
  2. 如果存储过程抛出未处理的错误,则将回滚整个事务。这意味着RU用完了而不添加任何数据。 因此,您需要进行良好的异常处理,如果在执行一半批次后出现故障,请仅重新尝试其余部分。
  3. 存储过程的代码不一定与文档db内部代码一样好。
  4. 在事务被终止之前,还有5秒的有限执行限制。