首页 > 解决方案 > Asp.net core 3 应用程序加载 cosmos db 查询缓慢

问题描述

我有一个非常简单的 Cosmos DB 查询,它是从 asp.net core 3 Razor Pages 应用程序中进行的。我在 Azure 的数据资源管理器中进行的相同查询将在 0.02 毫秒内返回结果。当我通过应用程序运行它时,设置秒表以查看通话的持续时间,它可以是 400 毫秒到 2000 毫秒之间的任何时间。

QueryDefinition queryDefinition = new QueryDefinition("SELECT * FROM Cache where Cache.JoinCode = @jc").WithParameter("@jc", JoinCode);

var query = _container.GetItemQueryIterator<HostCache>(queryDefinition);
List<HostCache> results = new List<HostCache>();
while (query.HasMoreResults)
{
    var response = await query.ReadNextAsync();
    results.AddRange(response.ToList());
}
return results.FirstOrDefault();

长期运行的请求是await query.ReadNextAsync();. 我能做些什么来加快速度吗?也许我做错了?

标签: asp.net-coreazure-cosmosdb

解决方案


首先,我强烈建议您(或使用 Cosmos DB .Net SDK 的任何人)在 Cosmos DB Youtube 频道上观看此视频:https ://www.youtube.com/watch?v=McZIQhZpvew 。这提供了有关使用此 SDK 时要遵循的最佳实践的非常有用的信息。

该视频将解释为什么第一个请求需要这么多时间以及如何加快速度。

总结这个答案的目的,创建 Cosmos 客户端实例(使用“直接”连接模式)并没有多大作用。当您向该客户端发出第一个请求时,会发生初始化,此时 SDK 会发出一些网络请求以获取有关建立“直接”(TCP)连接的必要信息。这就是为什么第一个请求需要花费大量时间。在第一次请求之后,信息由 SDK 缓存,因此后续请求比第一次请求花费的时间要少得多。

要在创建 Cosmos 客户端时进行初始化,您需要使用CreateAndInitializeAsyncCosmosClient 的方法。这是来自文档页面的相同示例:

    using Microsoft.Azure.Cosmos;
    List<(string, string)> containersToInitialize = new List<(string, string)>
    { ("DatabaseName1", "ContainerName1"), ("DatabaseName2", "ContainerName2") };
    
    CosmosClient cosmosClient = await CosmosClient.CreateAndInitializeAsync("connection-string-from-portal",
containersToInitialize)

推荐阅读