Я работаю над доказательством концепции, чтобы оптимизировать производительность запросов на соединение, выполняемых с помощью сверла. Основным хранилищем является база данных, основанная на NO-SQL - Mongo DB. Время, необходимое для возврата результата запроса соединения, составляет 46 секунд. При дальнейшем анализе, согласно физическому плану запроса, наблюдается, что как левая сторона (1,5 миллиона записей), так и правая таблица (1,3 миллиона) полностью сканируются, и это занимает 24 секунды и 20 секунд соответственно.Почему запрос на сверление не полностью оптимизирован для Mongo DB?
Вот запрос:
select ta.[SOME_COLUMN]
from mongo.Test.TABLEA ta
INNER JOIN mongo.Test.TABLEB ta ON ta.Id = tb.Id and ta.Id ='123'
записей в таблице А: 1,5 миллиона
записей в таблице В: 1,3 млн
состояния фильтра: Идентификатор индексированное поле в обеих таблицах (по возрастанию)
Drill План показывает Hash присоединиться выполняется:
- Почему бурить извлечь все записи в память, даже если условие фильтра на индексированных колонках, предусмотренные одной из таблиц? На уровне mongo я заметил, что сканирование коллекции было выполнено вместо сканирования индекса, что может быть причиной этого? (учитывая мое присоединение & условие фильтра применяется к индексированной колонке)
- Если планировщик/оптимизатор сверла был достаточно интеллектуальным, записи могли быть отфильтрованы и во второй таблице на основе условия соединения (чтобы уменьшить набор данных и, следовательно, приводят к более быстрому времени выполнения). Не полностью ли оптимизирован плагин для хранилища MongoDB, который вызывает это?
Или, возможно, это потому, что у MongoDB нет объединений? Даже это функция агрегации $ lookup все еще делает именно это – Sammaye
Истинно, что mongoDB не имеет соединения. Но Drill предоставляет эту функциональность, разбивая соединение на сканирование со стороны составляющей таблицы и делая HashJoin. Но он не делает сканирование эффективным способом. Вся фильтрация, проецирование, сортировка и т. Д. Должны передаваться в mongoDB, поскольку она может более эффективно использовать индексы. –