【问题标题】:Azure Cosmos DB - incorrect and variable document countAzure Cosmos DB - 不正确且可变的文档计数
【发布时间】:2019-09-12 17:38:24
【问题描述】:

我已经使用批量执行器在 Azure Cosmos DB SQL 容器中插入了正好 100 万个文档。没有记录错误。所有文档共享相同的分区键。容器配置为 3,200 RU/s、无限存储容量和单区域写入。

执行简单计数查询时:

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

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

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

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

【问题讨论】:

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


    【解决方案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代码的sn-p如下:

    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})
    

    我将 30k 文档导入到我的数据库中。然后我尝试运行查询

    select value count(1) from c 在查询资源管理器中。事实证明,每页只有部分文件。所以我需要通过点击Next Page按钮来添加它们。

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

    【讨论】:

    • 这是有道理的,尽管这个实现细节泄露给客户端是相当令人惊讶的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多