ArangoDB - Низкая производительность запросов в кластере - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть запрос, который сравнивает две коллекции и находит «отсутствующие» документы с одной стороны.Обе коллекции (существующие и временные) содержат около 250 тыс. Документов.

FOR existing IN ExistingCollection
    LET matches = (
        FOR temp IN TempCollection
            FILTER temp._key == existing._key
            RETURN true
    )
    FILTER LENGTH(matches) == 0
    RETURN existing

Когда это выполняется в среде с одним сервером (БД и Foxx находятся на одном сервере / контейнере), это работает как молния в пределах 0,5секунд.

Однако, когда я запускаю это в кластере (одна БД, один координатор), даже когда БД и Coord находятся на одном физическом хосте (разные контейнеры), я должен добавить LIMIT 1000после первоначального FOR existing ..., чтобы не дать ему истечь!Тем не менее, этот ограниченный результат возвращается почти через 7 секунд!

Глядя на план выполнения, я вижу, что после LET matches ... SubqueryNode есть несколько операторов REMOTE и GATHER.Насколько я могу судить, проблема связана с разделением структуры хранения данных и памяти, используемой для фильтрации этих данных.

Мой вопрос: может ли этот тип операции быть эффективно выполнен в кластере?

Мне нужно обнаружить устаревшие (подлежащие удалению) документы, но это, очевидно, нереальное решение.

1 Ответ

0 голосов
/ 02 января 2019

Ваш запрос выполняет один подзапрос для каждого документа в существующей коллекции.Каждый подзапрос потребует много HTTP-циклических переходов для настройки, фактического запроса и завершения работы.

Вы можете избежать подзапросов с помощью следующего запроса.Он загружает все документы _key в оперативную память - но это не должно быть проблемой для ваших довольно маленьких коллекций.

LET ExistingCollection = (FOR existing IN c2 RETURN existing._key)
LET TempCollection = (FOR temp IN c1 RETURN temp._key)
RETURN MINUS(ExistingCollection, TempCollection)
...