我已使用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文档)。
什么可能导致这种奇怪的行为?
答案 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
按钮将它们全部添加。
当然,您可以通过延续令牌在sdk代码中进行此查询。