使用 MongoDB Driver for C# 的不同查询比通过 MongoDB shell 发送的相同查询慢得多
Posted
技术标签:
【中文标题】使用 MongoDB Driver for C# 的不同查询比通过 MongoDB shell 发送的相同查询慢得多【英文标题】:Distinct query using MongoDB Driver for C# is much slower than the same query sent via MongoDB shell 【发布时间】:2021-05-04 22:25:05 【问题描述】:我有一个包含 150 万条记录的集合。当我使用 mongo shell 查询集合时,它会在 2.0 秒内返回数据,而当我使用 Mongo 驱动程序 C# 执行相同操作时,它需要 13-16 秒才能返回列表。我也在集合上实现了索引。
MongoShell 查询:
db.DiscountTMV.distinct("OriginId" , $and : [
"LTLRates.CustomerId" : ObjectId("5faac93be2867c2748bcd6a7"),
"LTLRates.TenId" : ObjectId("5faac63be2867c2748ae95a8"),
"OriginId" : $in :[ ObjectId("5faac922e2867c2748bcb745"),ObjectId("5faac922e2867c2748bcb73d"),ObjectId("5faac922e2867c2748bcb73f"),ObjectId("5faac922e2867c2748bcb741"),ObjectId("5faac922e2867c2748bcb71c"),ObjectId("5faac922e2867c2748bcb749"),
]
])
OriginId 的 In 运算符有时包含 200 多个 Id,这些 Id 基于用户输入的条件。
C# 代码:
var ratingFilter = Builders<DiscountTMV>.Filter.ElemMatch(x => x.LTLRates, x => x.TenId == tenId);
ratingFilter &= Builders<DiscountTMV>.Filter.ElemMatch(x => x.LTLRates, x => x.CustomerId == customerId);
ratingFilter &= Builders<DiscountTMV>.Filter.In("OriginId", filteredRegionIds);
var discountTiers = await _mContext.DiscountTMV.Distinct<string>("OriginId", ratingFilter).ToListAsync();
我尝试的另一个查询是:
var ratingFilter = Builders<DiscountTMV>.Filter.Eq("LTLRates.TenId" == tenId);
ratingFilter &= Builders<DiscountTMV>.Filter.Eq("LTLRates.CustomerId" == customerId);
ratingFilter &= Builders<DiscountTMV>.Filter.In("OriginId", filteredRegionIds);
var discountTiers = await _mContext.DiscountTMV.Distinct<string>("OriginId", ratingFilter).ToListAsync();
任何人都知道如何使用 C# Mongo 驱动程序或任何建议来实现相同的输出性能。如果有人共享相同查询的正确语法以在 MongoDb C# 驱动程序的 RunCommandAsync 方法中运行,那也很棒。提前致谢。
下图是 MongoDB 查询的统计数据。
enter image description here
【问题讨论】:
获取您通过 C# 发送的查询,与使用 shell 的查询进行比较。 两个查询是一样的。 在这种情况下,如果您怀疑 C# 比应有的速度慢,请使用性能分析器。获取一些实际指标。如果差异如此之大,您会很快看到这段时间都花在了哪里。 不要添加链接,除非它们指向引用的文档。将图像内嵌。 【参考方案1】:从不同环境查询时,查询执行时间的差异是由于:
正在执行不同的查询。使用command monitoring获取驱动发送的实际查询。 其中一个环境实际上并未执行查询。一些查询方法是惰性的,在迭代结果之前不会真正发出查询。 请求的结果数量不同(第一批与全部)。 不同的数据类型在两种环境中需要不同的时间来序列化/反序列化到 BSON。要进行故障排除,请确认:
在这两种情况下,查询都会实际执行。 正在发送完全相同的查询。 从结果集中检索到相同数量的文档(例如所有文档)。 查询和结果中的数据类型都尽可能简单(尝试整数或短字符串)。如果您已完成上述所有操作,但仍看到不同的执行时间,请使用收集到的信息更新问题,证明上述所有内容都匹配。
【讨论】:
以上是关于使用 MongoDB Driver for C# 的不同查询比通过 MongoDB shell 发送的相同查询慢得多的主要内容,如果未能解决你的问题,请参考以下文章