首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cosmos DB加速读取

Cosmos DB加速读取
EN

Stack Overflow用户
提问于 2020-12-02 01:37:23
回答 1查看 211关注 0票数 0

我正在尝试从Cosmos DB检索大约10,000个项目。保存数据大约需要30秒,但检索数据大约需要50秒。每条记录的大小约为6KB。

代码语言:javascript
复制
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);
    }
}

有没有人知道一种可以加速这个查询的方法?

谢谢你特拉维斯·佩特里

EN

回答 1

Stack Overflow用户

发布于 2020-12-02 10:16:34

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

至于性能,我会考虑以下几点:

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

您可以做的另一件最好的事情是对您的数据进行重新建模,使其不是跨分区的。如果您非常频繁地运行此查询或需要非常快的性能,则尤其如此。如果您编写的数据需要您现有的分区键来优化写入,但也运行大量查询,则应考虑使用更改馈送并保留两份数据副本,一份用于写入,另一份用于回答查询。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65095570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档