Подтвердить что ты не робот

Включение документов в emit по сравнению с include_docs = true в CouchDB

Я столкнулся с упоминанием где-то, что выполнение emit(key, doc) увеличит количество времени, которое требуется для создания индекса (или что-то в этом роде).

Есть ли какая-то заслуга в этом, и есть ли причина не просто делать emit(key, null), а затем include_docs = true?

4b9b3361

Ответ 1

Да, это увеличит размер вашего индекса, потому что CouchDB эффективно копирует весь документ в этих случаях. Для случаев, в которых вы можете, используйте include_docs=true.

Существует, однако, состояние гонки, о котором следует знать при использовании этого, упомянутого в вики. Возможно, в течение времени между чтением данных представления и извлечением документа этот документ изменился (или был удален, и в этом случае _deleted будет true). Это описано здесь в разделе "Параметры запроса".

Ответ 2

Это классический компромисс между временем и пространством.

Извлечение данных документа в ваш индекс увеличит размер индексного файла на диске, потому что CouchDB включает испускаемые данные непосредственно в индексный файл. Однако это означает, что при запросе данных CouchDB может просто передавать контент непосредственно из файла индекса на диске. Это, очевидно, довольно быстро.

Вместо использования на include_docs=true будет уменьшаться размер вашего индекса на диске, это правда. Однако при запросе CouchDB должен выполнить чтение документа для каждой возвращаемой строки. Это связано с существенным случайным поиском документов из основного файла данных, что означает, что стоимость и время возврата данных значительно увеличиваются.

В то время как разница во времени запроса для небольших номеров документов медленная, она будет складываться над каждым вызовом, созданным приложением. Поэтому для меня испускание необходимых полей из документа в индекс обычно является правильным вызовом - диск дешев, внимание пользователя меньше. Это в целом похоже на использование индексов покрытия в реляционной базе данных, еще один широко отозванный совет.

Я сделал совершенно ненаучный тест на этом, чтобы понять, в чем разница. Я обнаружил примерно 8-кратное увеличение времени отклика и 50% -ное увеличение процессора при использовании include_docs=true для чтения 100 000 документов из представления по сравнению с представлением, в котором документы были испусканы непосредственно в самом индексе.