2015-12-17 2 views
2

После перехода на 2.8 этот простой запрос теперь заморозил сервер со 100% -ным использованием процессора ~ 10 сек. В 2,7 (~ 30ms)ArangoDB 2.8 - сортировать по результату подзапроса - сбой

FOR P In Person 
    LET EventLast = (
    FOR E In Event FILTER E.owner == P._id SORT E.date desc LIMIT 1 RETURN E.date 
    ) 
SORT EventLast[0] 
LIMIT 40 
RETURN { _id: P._id, name:P.name } 

Collection Event имеют skiplist индекс в date и индекс хеш owner

Без "СНП E.date убывание" или "SORT EventLast [0]" - 1мс

+0

Не могли бы вы также рассказать приблизительное количество документов как в «Личном», так и «Событии» плюс указанную селективность хеш-индекса? Это позволит лучше сравнить с 2.7. Благодаря! – stj

+0

Лицо - 1000 Событие - 10000 –

+0

Event.owner - селективность хеш-индекса 14,4% P.S. Я никогда не видел до 100% использования с ArangoDb, а также по более сложным запросам без индексов. Макс 0.5-0.9 сек, но этот запрос превращает базу данных в зомби на 8-10 сек. –

ответ

4

Оптимизатор запросов в 2.8-бетах отобразил индекс скиписта на date для внутреннего подзапроса. Этот индекс позволяет удалить предложение SORT, но внутренний запрос по-прежнему должен сканировать весь индекс в обратном порядке, пока не будет соответствовать первый фильтр. Он делает это столько раз, сколько есть документов в Person.

Оптимизатор 2.7 вместо этого отобрал хэш-индекс на owner и использовал post-index-SORT. Вероятно, это было бы лучше в этом случае, если количество совпадений в каждом индексе очень мало, но будет плохо, если фильтр очень неселективен.

Оптимизатор 2.8 теперь снова предпочтет потенциально более избирательный хэш-индекс для внутреннего запроса. Исправление для этого было сделано сегодня в ветке 2.8, которая превратится в бета3 или rc (обратите внимание, что в скором времени будет beta2, который еще не будет содержать исправление).

Смежные вопросы