如何修复 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})
另一种情况可以参考:
我正在尝试从包含大量数据(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})
另一种情况可以参考: