Очень медленная итерация MongoDB - PullRequest
0 голосов
/ 10 октября 2018

У меня проблема с очень медленной итерацией курсора над коллекциями в MongoDB.

Настройка:

MongoDB v4.0.1 (1 ТБ + данные zlib, WiredTiger)
Драйвер MongoDB .NETv2.7.0
и приложение C #, и база данных, работающие на одной машине

код C #

В коде я использую IAsyncCursor <TData> _mongoCursor стандартным способомвот так:

bool moved = await _mongoCursor.MoveNextAsync().ConfigureAwait(false);

и я измерил производительность следующим образом:

        Stopwatch sw = Stopwatch.StartNew();
        bool moved = await _mongoCursor.MoveNextAsync().ConfigureAwait(false);
        Console.WriteLine($"MoveNext took {sw.ElapsedMilliseconds}");

Mongo Log

2018-10-10T12:15:32.883+0200 D COMMAND  [conn16] run command MyDatabase.$cmd { getMore: 7026208311, collection: "MyCollection", batchSize: 10000, $db: "MyDatabase", lsid: { id: UUID("5b8c8a18-fbc9-4eb3-b447-8a46c0546878") } }
2018-10-10T12:15:33.023+0200 I COMMAND  [conn16] command MyDatabase.MyCollection command: getMore { getMore: 7026208311, collection: "MyCollection", batchSize: 10000, $db: "MyDatabase", lsid: { id: UUID("5b8c8a18-fbc9-4eb3-b447-8a46c0546878") } } originatingCommand: { find: "MyCollection", filter: { _id: { $gte: { DateTime: new Date(1377579604345), Ticks: 635131764043450000 }, $lte: { DateTime: new Date(253402300799999), Ticks: 3155378975999999999 } } }, batchSize: 10000, noCursorTimeout: true, readConcern: { level: "local" }, $db: "MyDatabase", $readPreference: { mode: "nearest" }, lsid: { id: UUID("5b8c8a18-fbc9-4eb3-b447-8a46c0546878") } } planSummary: IXSCAN { _id: 1 } cursorid:7026208311 keysExamined:2780 docsExamined:2780 numYields:21 nreturned:2780 reslen:16776285 locks:{ Global: { acquireCount: { r: 22 } }, Database: { acquireCount: { r: 22 } }, Collection: { acquireCount: { r: 22 } } } protocol:op_msg 139ms

Проблема

Каждый вызов MoveNext() занимает в среднем 1500 мс, что составляет A LOT .Из журнала MongoDB видно, что при возврате из базы данных новая партия занимает в среднем 140 мс.

Вопрос

Почему этот запрос такой медленный?Может ли это быть медленная десериализация / отображение из BSON в класс?
Как я могу сделать это быстрее?Есть идеи?

...