Couchbase выполняет запрос очень медленно - PullRequest
1 голос
/ 17 апреля 2020

Мы используем Couchbase и CBL уже более 3 лет, и всегда беспокоит одна вещь. Когда мы выполняем запросы для чтения записей из выражений по ключам, выполнение запроса Couchbase значительно снижает производительность наших приложений. Например у нас есть 25000 записей данных с относительно небольшими документами в нашем CBL. Чтение 100 из этих записей занимает 0,5 секунды, что неприемлемо для нашего приложения. Документы содержат только очень маленькие JSON документы. Мы можем теоретически прочитать все данные в объекты один раз в начале базы данных, чтобы выполнить только один запрос и управлять данными в документах Swift, которые мы фактически делали некоторое время go, но это не идея локальной базы данных, если я не ошибаясь, это сделало бы CBL в значительной степени бесполезным. Есть ли что-то, что мы упускаем при построении запроса или общего Couchbase? Как мы можем читать данные быстрее?

Я пишу здесь, надеясь, что мы что-то упустили в Couchbase, потому что выполнение этих запросов с помощью SQL кажется намного быстрее. Время выполнения, которое я упоминаю, конечно, отличается на разных устройствах, но на каждом устройстве, которое я использую, оно составляет примерно полсекунды, и это слишком медленно для 100 записей

Время, которое занимают разные задачи (1) Занимает 0,5 секунды ( 2) Занимает 0,0001 секунды. Выполнение нескольких таких запросов занимает вечно

Вот код, который мы используем в Swift:

       let ourDocumentKeyPrefix = "SomeKeyPrefix"
       let query = QueryBuilder
            .select(
                SelectResult.all(),
                SelectResult.expression(Meta.id)
            )
            .from(DataSource.database(database!))
            .where(Meta.id.like(Expression.string(\(ourDocumentKeyPrefix)::%"))
        )


        do {
            for result in try query.execute() {  **//(1)** executing Couchbase query

                   **//(2)** my extraction data code here....
            }
        } catch {

        }

В настоящее время я использую модуль CouchbaseLite-Swift (2.7.0), но у нас тоже была проблема с предыдущими версиями

1 Ответ

2 голосов
/ 17 апреля 2020

Архитектор Couchbase Lite здесь ...

Этот запрос медленный, потому что LIKE сравнения не оптимизированы по индексам в Couchbase Lite , поэтому запрос должен просмотрите каждый документ в базе данных и примените тест LIKE. Вы можете убедиться в этом, просмотрев свойство explanation запроса, в котором будет отображаться различная информация, включая сводку используемых индексов. Свойство explanation - ваш лучший инструмент, когда вы пытаетесь оптимизировать запрос.

(Как правило, подобное сравнение типа LIKE, представляющее собой совпадение префикса, должно быть индексируемый. И это так, в SQLite по умолчанию. Но Couchbase Lite устанавливает пользовательскую функцию LIKE, так как по умолчанию она не поддерживает фальцовку или I18N, и как только это произойдет, SQLite больше не будет использовать оптимизацию соответствия префикса, поскольку она не больше не знает точную семантику LIKE.)

Не помогает наличие в 2.7.0 неудачной ошибки, которая замедляла LIKE; исправление в 2.7.1 (которое уже вышло или будет очень скоро.)

Лучший обходной путь - заменить LIKE на явный префиксный тест , например (в N1QL синтаксис) meta.id >= $keyPrefix || "::" AND meta.id < $keyPrefix || ":;" - обратите внимание на точку с запятой, которая является следующим символом после двоеточия в порядке сортировки.

...