performance - MongoDB C# 游标性能问题

标签 performance mongodb cursor mongodb-.net-driver

截至 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/

相关文章:

java - 安装 MongoDB Java 驱动程序

mongodb - 如何将数据导入到部署的 meteor 应用程序中?

node.js - mongodb 中的 $not 运算符不起作用

php - Symfony2/Doctrine2 Oracle 游标问题

javascript - 向表格行添加光标样式以指示它们可单击是否合理

sql - SQL游标中表变量的范围

ruby-on-rails-3 - Rails的性能问题:如何发送gzip Assets

multithreading - Fortran 基本函数与基本子例程

performance - 提高光线追踪器的性能

java - 处理多个插入的最佳方法