首页 > 解决方案 > 如何解决 Azure CosmosDB 上仅出现在大数据集合上的查询问题?

问题描述

我正在尝试从包含MachineCollection大量数据(58 GB 数据;索引大小 9 GB)的 CosmosDB 集合 ( ) 中读取数据。吞吐量设置为 1000 RU/s。该集合按序列号、读取位置(WestEurope、NorthEurope)、写入位置(WestEurope)进行分区。在我的阅读尝试的同时,MachineCollection每 20 秒就会收到一次数据。

问题是我无法通过 Python 查询任何数据。如果我在 CosmosDB Data Explorer 上执行查询,我很快就会得到结果。(例如查询某个序列号)。

出于故障排除的目的,我创建了一个新的数据库 ( TestDB) 和一个TestCollection. 其中TestCollection,有 10 个数据集MachineCollection。如果我尝试通过 Python 从中读取,MachineCollection它会成功并且我可以将数据保存到 CSV。

这让我想知道为什么在使用完全相同的属性配置 TestDB 和 TestCollection 时我无法从 MachineCollection 查询数据。

我已经尝试通过 Python 进行查询:

options['enableCrossPartitionQuery'] = True
Querying using PartitionKey:   options['partitionKey'] = 'certainSerialnumber'

一直如此。适用于 TestCollection,但不适用于 MachineCollection。

非常感谢有关如何解决此问题的任何想法!

标签: pythonazureazure-cosmosdbazure-cosmosdb-sqlapi

解决方案


首先,您需要知道的是 Document DB 对Response page size. 此链接总结了其中一些限制:Azure DocumentDb 存储限制 - 它们到底是什么意思?

其次,如果要从 Document DB 中查询大数据,则必须考虑查询性能问题,请参考这篇文章:使用 Azure Cosmos DB 调优查询性能

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

据我所知,Azure 门户不会自动帮助您优化 SQL,因此您需要在 sdk 或 rest api 中处理此问题。

您可以设置Max Item Count的值并使用 对数据进行分页continuation token。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})

您可以参考的另一个案例:如何为 Python 中 document_client 对象发送的 Cosmos DB 查询设置延续令牌?


推荐阅读