我正在尝试从Cosmos DB检索大约10,000个项目。保存数据大约需要30秒,但检索数据大约需要50秒。每条记录的大小约为6KB。
string sqlQueryText = $"SELECT * FROM c WHERE c.FK in (1,2,3,4,5,6,7,...N)";
QueryDefinition queryDefinition = new QueryDefinition(sqlQueryText);
FeedIterator<MyObject> myFeedIterator= Container.GetItemQueryIterator<MyObject>(queryDefinition, null, new QueryRequestOptions
{
PartitionKey = pk,
MaxConcurrency = 20,
MaxItemCount = 2000
});
List<MyObject> myObjects = new List<MyObject>();
while(myFeedIterator.HasMoreResults)
{
Microsoft.Azure.Cosmos.FeedResponse<MyObject> feedResponses = await myFeedIterator.ReadNextAsync();
foreach(MyObject feedResponse in feedResponses)
{
myObjects.Add(feedResponse);
}
}有没有人知道一种可以加速这个查询的方法?
谢谢你特拉维斯·佩特里
发布于 2020-12-02 10:16:34
因为您的项目大小非常大,所以这个查询可能总是会遇到长时间运行的问题。10K * 6K是60MB的数据。每次fetch的页面大小是4MB,因此将进行15次往返,以完全耗尽该查询。MaxConcurrency最大值只是您拥有的物理分区的数量,所以您可以将其设置为-1。最大项目数也将受到页面大小的限制,因此4MB/6K将使您在每批中获得大约660个项目。
至于性能,我会考虑以下几点:
重新评估您的数据模型,看看是否真的需要6KB的记录。如果您执行大量读取操作,但只对部分数据进行读取,则应该将文档分解为两个或更多个文档。如果您还执行大量插入,尤其是在执行大量更新时,这一点尤其正确,因为每次更新,即使只是很小的更新,也会替换整个6K的数据。
您可以做的另一件最好的事情是对您的数据进行重新建模,使其不是跨分区的。如果您非常频繁地运行此查询或需要非常快的性能,则尤其如此。如果您编写的数据需要您现有的分区键来优化写入,但也运行大量查询,则应考虑使用更改馈送并保留两份数据副本,一份用于写入,另一份用于回答查询。
https://stackoverflow.com/questions/65095570
复制相似问题