如何修复 Azure CosmosDB 上仅出现在具有大数据的集合上的查询问题?

How to fix query problem on Azure CosmosDB that occurs only on collections with large data?

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

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

为了排除故障,我创建了一个新数据库 (TestDB) 和一个 TestCollection。在这个TestCollection中,有MachineCollection的10个数据集。如果我尝试通过 Python 读取此 MachineCollection 它会成功并且我能够将数据保存到 CSV。

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

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

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

一如既往。适用于 TestCollection,但不适用于 MachineCollection。

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

首先,您需要了解的是,Document DB 对Response page size 进行了限制。 link 总结了其中的一些限制:

其次,如果要从Document DB查询大数据,就不得不考虑查询性能问题,请参考这篇文章:Tuning query performance with Azure Cosmos DB.

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

据我所知,Azure 门户不会自动帮助您优化 SQL,因此您需要在 sdk 或其余部分中处理此问题 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})

另一种情况可以参考: