У меня проблема с очень медленной итерацией курсора над коллекциями в 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 в класс?
Как я могу сделать это быстрее?Есть идеи?