[英]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.