首页 > 解决方案 > c# 中 CosmosDB DocumentDB 和 SqlAPI 的性能下降

问题描述

我需要运行一个从CosmosDB集合中返回大约 30,000 个项目的查询。要在我发布的代码中执行此查询,执行时间约为 2 分半钟,甚至将吞吐量提高 40 倍,但您并没有得到实质性的改进,时间下降到 1 分钟。

public static async Task<IEnumerable<T>> GetItemsCompact(string whereclause)
{
    string collectionToUse;
    SqlQuerySpec sqlQuerySpec = new SqlQuerySpec();

    if (typeof(T).ToString().IndexOf("Telemetry") != -1)
    {
        DocumentDBRepository<CosmosDBTelemetry>.Initialize();
        collectionToUse = AppSettings.Collection;
        sqlQuerySpec.QueryText = "SELECT c.messageUID as messageUID, ";
        sqlQuerySpec.QueryText += "c.deviceId as deviceId, ";
        sqlQuerySpec.QueryText += "udf.UDF_VIn(c.VIn) as VIn, ";
        sqlQuerySpec.QueryText += "udf.UDF_AIn(c.AIn) as AIn, ";
        sqlQuerySpec.QueryText += "udf.UDF_W(c.W) as W, ";
        sqlQuerySpec.QueryText += "udf.UDF_Var(c.Var) as Var, ";
        sqlQuerySpec.QueryText += "c.EventProcessedUtcTime as EventProcessedUtcTime ";
        sqlQuerySpec.QueryText += "from Telemetry c ";
        sqlQuerySpec.QueryText += whereclause;
    }
    else
    {
        DocumentDBRepository<CosmosDBEvents>.Initialize();
        collectionToUse = AppSettings.Collection2;
        sqlQuerySpec.QueryText = "select doc.uid as uid, ";
        sqlQuerySpec.QueryText += "doc.deviceId as deviceId, ";
        sqlQuerySpec.QueryText += "doc.eventId as eventId, ";
        sqlQuerySpec.QueryText += "doc.ts as ts, ";
        sqlQuerySpec.QueryText += "doc.startTS as startTS, ";
        sqlQuerySpec.QueryText += "doc.endTS as endTS, ";
        sqlQuerySpec.QueryText += "doc.no as no, ";
        sqlQuerySpec.QueryText += "doc.params as params, ";
        sqlQuerySpec.QueryText += "doc.tags as tags ";
        sqlQuerySpec.QueryText += "from Events doc ";
        sqlQuerySpec.QueryText += whereclause;
    }

    FeedOptions opt = new FeedOptions
    {
        EnableCrossPartitionQuery = true,
        MaxItemCount = -1
    };

    IDocumentQuery<T> query = client.CreateDocumentQuery<T>(

    UriFactory.CreateDocumentCollectionUri(AppSettings.Database, collectionToUse), sqlQuerySpec,opt).AsDocumentQuery();

    List<T> results = new List<T>();

    while (query.HasMoreResults)
    {
        results.AddRange(await query.ExecuteNextAsync<T>());
    }

   return results;
  }

有人可以帮助我提高表演吗?

标签: c#azure-cosmosdbazure-cosmosdb-sqlapi

解决方案


这是完全可以预料的。Cosmos DB 不适合那样使用。您正在执行跨分区查询。理想情况下,至少不会在您的应用程序的正常逻辑中发生这种情况。最重要的是,您正在设置MaxItemCountto -1。这意味着您希望 Cosmos 在单个页面中返回所有内容。不建议这样做,因为 Cosmos DB 只返回分页结果,而且这是最好的时候。您可以将页面大小更改为类似的大小,100-250但这仍然不会显着提高您的性能。Cosmos DB 并不打算在这种情况下执行。


推荐阅读