Mongo Db записи извлекаются очень медленно, используя c # api - PullRequest
1 голос
/ 03 апреля 2012

Я пытаюсь получить 100000 документов из MongoDb, как показано ниже, и возвращение коллекции занимает очень много времени.

var query = Query.EQ("Status", "E");
var items = collection.Find(query).SetLimit(100000).ToList();

Или

var query = Query.GT("_id", idValue);
var items = collection.Find(query).SetLimit(100000).ToList();

Объясните:

{
    "cursor" : "BtreeCursor _id_", 
    "nscanned" : 1, 
    "nscannedObjects" :1, 
    "n" : 1, 
    "millis" : 0, 
    "nYields" : 0, 
    "nChunkSkips" : 0,
    "isMultiKey" : false, 
    "indexOnly" : false, 
    "indexBounds" : 
        {
            "_id" :[[ObjectId("4f79a64eca98b5fc0e5ae35a"),
                ObjectId("4f79a64eca98b5fc0e5ae35a")]]
        } 
}

Любые предложения по улучшению производительности запросов.На моем столе 2 миллиона документов.

-Venkat

Ответы [ 5 ]

3 голосов
/ 17 апреля 2012

Этот вопрос также задавался в группах Google:

https://groups.google.com/forum/?fromgroups#!topicsearchin/mongodb-user/100000/mongodb-user/a6FHFp5aOnA

Когда я ответил на вопрос о группах Google, я попытался воспроизвести это и не смог заметить какую-либо медлительность. Мне удалось прочитать 100 000 документов за 2-3 секунды, в зависимости от того, были ли документы ближе к началу или к концу собрания (потому что я не создавал индекс).

В моем ответе на вопрос о группах Google есть более подробная информация и ссылка на тестовую программу, которую я использовал, чтобы попытаться воспроизвести это.

0 голосов
/ 15 апреля 2012

Учитывая предоставленную вами информацию, я полагаю, что размер вашего документа слишком велик, и задержка не обязательно связана с сервером Монго, но с передачей результата обратно на компьютер приложения. Посмотрите на размер вашего документа avg в коллекции, у вас есть большие встроенные массивы, например?

Сравните время ответа при выборе только одного поля с помощью метода .SetFields (см. Пример здесь Как получить подмножество полей с помощью драйвера C # MongoDB? ). Если время отклика значительно меньше, вы знаете, что это проблема.

0 голосов
/ 03 апреля 2012

Есть несколько вещей, которые нужно проверить:

  1. Правильно ли проиндексирован ваш запрос ?
  2. Если ваш запрос проиндексирован, каковы шансы, что данныесам в памяти?Если у вас есть 20 ГБ данных и 4 ГБ ОЗУ, то большая часть ваших данных , а не в памяти, что означает, что ваши диски выполняют много работы.
  3. Сколько данных делает 100 КБ документовпредставлять?Если ваши документы действительно большие, они могут поглотить весь доступный дисковый ввод-вывод или, возможно, сеть?Достаточно ли у вас места для хранения этого в ОЗУ на клиенте?

Вы можете проверить использование диска, используя iostat ( обычный инструмент linux ) или perfmon (под виндой).Если вы выполняете их во время выполнения запроса, вы должны получить некоторое представление о том, что происходит с вашими дисками.

В противном случае вам придется рассуждать о том, как много данных перемещается здесь.В общем, запросы, которые возвращают объекты размером 100 тыс., Не предназначены для быстрой работы (не в MongoDB и не в SQL).Это больше данных, чем люди обычно потребляют на одном экране, поэтому вы можете захотеть сделать меньшие партии и прочитать 10 тыс. Объектов 10 раз вместо 100 тыс. Объектов один раз.

0 голосов
/ 03 апреля 2012

Если вы не создадите индексы для своей коллекции, MongoDB выполнит полное сканирование таблицы - это самый медленный из возможных методов.

Вы можете запустить объяснение () для вашего запроса. Explain скажет вам, какие индексы (если есть) используются для запроса, количество отсканированных документов и общая продолжительность запроса.

Если ваш запрос касается всех индексов и его выполнение все еще идет медленно, возможно, у вас проблема с размером коллекции / ОЗУ.

MongoDB является самым быстрым, когда сбор данных + индексы помещается в память. Если размер вашей коллекции больше доступной оперативной памяти, падение производительности будет очень большим.

Размер вашей коллекции можно проверить с помощью totalSize(), totalIndexSize() или validate() (это команды оболочки).

0 голосов
/ 03 апреля 2012

Вы определили индексы?

http://www.mongodb.org/display/DOCS/Indexes

...