我正在尝试在没有分区键的Azure CosmosDB上进行跨分区查询。吞吐量设置为4000,每个分区键范围为250RU / s。
我的cosmos db集合大约有100万个文档,总大小为70gb。它们平均分布在大约40,000个逻辑分区上,json文档的平均大小为100kb。这就是我的json文档的结构:
"ArrayOfObjects": [
{
// other properties omitted for brevity
"SubId": "ed2a49fb-51d4-45b4-9690-df0721d6a32f"
},
{
"SubId": "35c87833-9bea-4151-86da-4d9c482ae1fe"
},
"ParitionKey": "b42"
这是我当前没有分区键的查询方式:
public async Task<ResponseModel> GetBySubId(string subId)
{
var collectionId = _cosmosClient.CollectionId;
var query = $@"SELECT * FROM {collectionId} c
WHERE ARRAY_CONTAINS(c.ArrayOfObjects, {{'SubId': '{subId}'}}, true)";
var feedOptions = new FeedOptions { EnableCrossPartitionQuery = true };
var docQuery = _cosmosClient.Client.CreateDocumentQuery(
_collectionUri,
query,
feedOptions)
.AsDocumentQuery();
var results = new List<ResponseModel>();
while (docQuery.HasMoreResults)
{
var executedQuery = await docQuery.ExecuteNextAsync<ResponseModel>();
if (executedQuery.Count != 0)
{
results.AddRange(executedQuery.ToList());
}
}
if (results.Count == 0)
{
return null;
}
return results.FirstOrDefault();
}
我希望插入后可以通过SubId
之一来检索文档。实际发生的情况是,即使查询通过耗尽所有连续标记完成执行后,也无法获取文档并返回null。这个问题是断断续续的,不一致的,因为有时在插入其他次之后可能会得到文档。
对于那些在插入后无法检索的文档,如果您等待一段时间(通常是几分钟),然后使用相同的SubId
重复查询,则可以检索该文档。似乎有延迟。
我已经在Azure门户中检查了cosmosdb指标,这些指标表明我根本没有超过每个分区的预配置RU / s,或者我的请求(HTTP 429)中没有任何速率限制。
鉴于上述原因,即使配置了足够的吞吐量,为什么我仍然会看到跨分区查询问题?