截至 2012 年 3 月 13 日,我安装了最新的 MongoDB 64 位数据库和官方 C# 驱动程序。我得到了一些意外的游标性能结果。
以下代码将在我的 Core 2 Duo 2 GHz 笔记本电脑上以大约 26.8 k/秒的速度检索和循环 500,000 条记录:
var query = Query.EQ("_H._t", "Car");
var cursor = mc.FindAs<RoctObj>(query);
double priceTot = 0d;
foreach (RoctObj item in cursor)
{
Car car = (Car)item._H;
priceTot += car.Price;
}
这似乎很合理。接下来,我调整了查询,以便只返回 721 个结果。与将 foreach 段替换为以下代码相比,该代码的执行时间要长 1.1 秒以上:
long i = cursor.Count();
考虑到第一个示例的速度,迭代 721 条记录只需要几分之一秒的时间。我知道还有一些其他开销,但它们应该很糟糕。我不明白为什么我会得到 +1.1 秒。
有什么想法吗?
编辑
这是替代查询。请注意,查询时间不是问题。这是迭代时间。
var query = Query.And(
Query.LTE("_H.Price", BsonDouble.Create(80000d)).GTE(BsonDouble.Create(40000d)),
Query.LTE("_H.Cylinders", BsonDouble.Create(8d)).GTE(BsonDouble.Create(4d)),
Query.LTE("_H.Capacity", BsonDouble.Create(3000d)).GTE(BsonDouble.Create(2000d)),
Query.LTE("_H.TopSpeed", BsonDouble.Create(200d)).GTE(BsonDouble.Create(100d))
);
最佳答案
调用cursor.Count()不会将任何数据从服务器传输到您的应用程序。它向服务器发送命令,并在服务器上执行计数,并且只有一个小数据包从服务器返回,其中包含计数的数字结果。
不知道为什么迭代文档比简单计数花费的时间要长得多。一个原因可能是服务器能够仅使用索引来计算计数,但是当您实际迭代文档时,服务器必须从磁盘获取每个文档(如果尚未分页到内存中)。
它不太可能成为 C# 驱动程序反序列化代码中的任何瓶颈,因为速度相当快。
如果您可以提供一个示例程序来演示观察到的行为,我很乐意尝试重现您的结果。
关于performance - MongoDB C# 游标性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9688086/