Cosmos数据库加速读取



我正在尝试从Cosmos DB中检索大约10000个项目。保存数据大约需要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);
}
}

有人知道加快查询速度的方法吗?

谢谢,Travis Pettry

因为您的项目大小太大,所以该查询可能总是运行时间过长。10K*6K是60MB的数据。每次获取的页面大小为4MB,因此需要进行15次往返以完全耗尽该查询。MaxConcurrency最大值只会是您拥有的物理分区数,因此您可以将其设置为-1。最大项目也将受到页面大小的限制,因此4MB/6K将在每批中为您提供约660个项目。

就性能而言,我会考虑以下内容:

重新评估您的数据模型,看看您是否真的需要6KB的记录。如果您进行了大量的读取,但只对数据的子集进行读取,则应该将文档分解为两个或多个文档。如果你也进行了大量的插入,尤其是如果你进行了大量更新,这一点尤其正确,因为每次更新,即使只是很小的更新,也会替换整个6K的数据。

你能做的另一件最好的事情是重新构建你的数据,这样它就不会跨分区。如果您非常频繁地运行此查询或需要非常快的性能,则尤其如此。如果您编写的数据要求您拥有当前用于优化写入操作的分区密钥,但同时还需要运行大量查询,则应考虑使用change feed并保留两个数据副本,一个用于写入,另一个用于回答查询。

最新更新