c# - 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;
}
有人可以帮助我提高表演吗?
解决方案
这是完全可以预料的。Cosmos DB 不适合那样使用。您正在执行跨分区查询。理想情况下,至少不会在您的应用程序的正常逻辑中发生这种情况。最重要的是,您正在设置MaxItemCount
to -1
。这意味着您希望 Cosmos 在单个页面中返回所有内容。不建议这样做,因为 Cosmos DB 只返回分页结果,而且这是最好的时候。您可以将页面大小更改为类似的大小,100-250
但这仍然不会显着提高您的性能。Cosmos DB 并不打算在这种情况下执行。
推荐阅读
- javascript - 使用带有 IntersectionObserver 的纯 javascript 在向下/向上滚动时隐藏/显示标题
- safari - Nuxt 内容安全策略 Safari 拒绝执行脚本
- sql - 如何检查一个单元格是否包含 MS Access 中另一个单元格的值?
- icalendar - 如何使用 .ics 文件在 macbook 日历上导入/删除事件
- kubernetes - 什么是 Kubernetes 复制控制器?
- java - 如何强制 lamda 定义的新实例化
- python - 使用base64获取二进制进出JSON
- android - 启动时注册隐式广播接收器已完成(Android Oreo 及更高版本)
- windows - 使用 Ansible 从 Windows 命令提示符输出中提取特定列
- php - 如何通过仅提供年份作为 php 中的输入参数来获取每周的开始日期和结束日期?