Asp.net 核心 3 应用程序加载 cosmos 数据库查询速度慢

Asp.net core 3 application slow to load cosmos db query

我有一个非常简单的 Cosmos DB 查询,我从 asp.net core 3 Razor Pages 应用程序进行查询。我在 Azure 的数据资源管理器中进行的相同查询将 return 结果为 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();

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

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

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

总而言之,创建 Cosmos Client 的实例(使用“直接”连接模式)的作用不大。当您向该客户端发出第一个请求时,会进行初始化,此时 SDK 会发出一些网络请求以获取有关建立“直接”(TCP) 连接的必要信息。这就是为什么第一个请求需要花费大量时间的原因。第一次请求后,信息被 SDK 缓存,因此后续请求比第一次请求花费的时间更少。

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

    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)