簡體   English   中英

MongoDB C#游標性能問題

[英]MongoDB C# cursor performance issue

截至2012年3月13日,我安裝了最新的MongoDB 64位DB和官方C#驅動程序。使用游標,我得到了一些意外的性能結果。

以下代碼將在我的Core 2 Duo 2 GHz筆記本電腦上以大約26.8 k / s的速度檢索並循環遍歷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#驅動程序反序列化代碼不太可能成為瓶頸,因為這相當快。

如果您可以提供一個示例程序來演示觀察到的行為,我將很樂於嘗試並重現您的結果。

MongoDB不會一次返回所有結果,它會返回一個游標,該游標一次從數據庫讀取一條記錄,這是因為您的應用程序要求它(即在迭代過程中),這可能是它速度較慢的原因。

運行count()只是返回找到的匹配項的數量,但沒有數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM