我们目前在文档数据库中有一个非常大的集合。 我们希望能够根据集合中文档中的某些字段过滤集合。
当我通过门户网站执行此查询时,需要很长时间,因为有太多数据。 当我通过功能应用程序执行此查询时,由于超时,它会在五分钟后切断。
执行此搜索的最佳方法是什么? 是否可以通过Application Insights或某种方式执行此搜索? 我知道查询本身可能需要很长时间,但它不应该阻塞。通过门户网站查询会阻止所有其他操作。
提前致谢。 此致
答案 0 :(得分:2)
CosmosDB非常容易预测,延迟非常低,但是当返回大型结果集时,除非你可以在其上花费大量的$$$,否则它真的很麻烦。一种方法是使用CosmosDb作为你的域模型,然后你使用ChangeFeed来处理你需要的readmodel,在我的情况下我有我的domainmodel处理所有插入/更新。然后作为第二步,它启动一个ChangeFeedProcessing,它接受结果集,看看该模型是否需要一个或多个readmodel,如果它需要,它需要什么存储,目前我可以持久化并将readmodel更新为TableStorage或Azure搜索或两者。 https://docs.microsoft.com/en-us/azure/cosmos-db/change-feed
答案 1 :(得分:1)
首先,您需要知道的是,文档数据库对Response page size
施加了限制。此链接总结了其中一些限制:Azure DocumentDb Storage Limits - what exactly do they mean?
其次,如果要查询文档数据库中的大数据,则必须考虑查询性能问题,请参阅以下文章:Tuning query performance with Azure Cosmos DB。
通过查看Document DB REST API,您可以观察几个对查询操作有重大影响的重要参数:x-ms-max-item-count, x-ms-continuation.
Azure门户网站不会自动帮助您优化SQL,因此您需要在sdk或rest api中处理此问题。
您可以设置Max Item Count的值,并使用continuation tokens
对数据进行分页。 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})
希望它对你有所帮助。