Azure Cosmos DB-错误且可变的文档计数

时间:2019-09-12 17:38:24

标签: azure azure-cosmosdb azure-cosmosdb-sqlapi

我已使用Bulk Executor将一百万个文档恰好插入了Azure Cosmos DB SQL容器中。没有记录错误。所有文档共享相同的分区键。该容器的配置速度为3200 RU / s,无限制的存储容量和单区域写入。

执行简单计数查询时:

select value count(1) from c where c.partitionKey = @partitionKey

我得到的结果从303,000到307,000不等。

此计数查询适用于较小的分区(从10k到250k文档)。

什么可能导致这种奇怪的行为?

1 个答案:

答案 0 :(得分:1)

这在cosmos db中是合理的。首先,您需要了解的是Document DB对Response page size施加了限制。该链接总结了其中一些限制:Azure DocumentDb Storage Limits - what exactly do they mean?

第二,如果要从Document DB查询大数据,则必须考虑查询性能问题,请参阅本文:Tuning query performance with Azure Cosmos DB

通过查看Document DB REST API,您可以观察到几个对查询操作有重大影响的重要参数:x-ms-max-item-count, x-ms-continuation.

因此,您的错误是由于RU设置瓶颈引起的。 count查询受分配给您的集合的RU数限制。您将收到的结果将带有一个延续令牌。

您可能有两种解决方案:

1。当然,您可以提高RUs设置。

2。出于成本考虑,您可以继续通过延续令牌寻找下一组结果,并继续添加它,以便获得总计数。(可能在sdk中)

您可以设置值为Max Item Count,并使用continuation tokens对数据进行分页。 Document Db sdk支持无缝读取分页数据。您可以参考以下python代码段:

q = client.QueryDocuments(collection_link, query, {'maxItemCount':10})
results_1 = q._fetch_function({'maxItemCount':10})
#this is a string representing a JSON object
token = results_1[1]['x-ms-continuation']
results_2 = q._fetch_function({'maxItemCount':10,'continuation':token})

我刚将3万个文档导入到数据库中,然后尝试运行查询

select value count(1) from c在查询浏览器中。事实证明,每页仅占全部文档的一部分。因此,我需要通过单击Next Page按钮将它们全部添加。

enter image description here

当然,您可以通过延续令牌在sdk代码中进行此查询。