簡體   English   中英

C#中CosmosDB DocumentDB和SqlAPI的性能降低

[英]Slow performance with CosmosDB DocumentDB and SqlAPI in c#

我需要運行一個查詢,該查詢從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;
  }

有人可以幫我改善表演嗎?

這是完全可以預期的。 Cosmos DB並非旨在那樣使用。 您正在執行跨分區查詢。 理想情況下,至少在應用程序的正常邏輯中,絕不應發生這種情況。 最重要的是,您將MaxItemCount設置為-1 這意味着您希望Cosmos在單個頁面中返回所有內容。 不建議使用此方法,因為Cosmos DB僅返回分頁結果,而此時才是最佳狀態。 您可以將頁面大小更改為100-250但這仍然不能顯着提高性能。 Cosmos DB僅在這種情況下不能執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM