Asp.net core 3应用程序加载cosmos db查询速度缓慢

0 asp.net-core azure-cosmosdb

我有一个非常简单的 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();
Run Code Online (Sandbox Code Playgroud)

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

Gau*_*tri 6

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

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

出于本答案的目的进行总结,创建 Cosmos Client 实例(使用“直接”连接模式)并没有多大作用。当您向该客户端发出第一个请求时,会进行初始化,此时 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)
Run Code Online (Sandbox Code Playgroud)