查询分区CosmosDB集合时出现的问题

时间:2019-01-25 01:50:48

标签: c# .net azure azure-cosmosdb partitioning

我正在尝试在没有分区键的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)中没有任何速率限制。

鉴于上述原因,即使配置了足够的吞吐量,为什么我仍然会看到跨分区查询问题?

0 个答案:

没有答案