2016-11-04 5 views
3

Я работаю над доказательством концепции, чтобы оптимизировать производительность запросов на соединение, выполняемых с помощью сверла. Основным хранилищем является база данных, основанная на 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 присоединиться выполняется:

enter image description here

  1. Почему бурить извлечь все записи в память, даже если условие фильтра на индексированных колонках, предусмотренные одной из таблиц? На уровне mongo я заметил, что сканирование коллекции было выполнено вместо сканирования индекса, что может быть причиной этого? (учитывая мое присоединение & условие фильтра применяется к индексированной колонке)
  2. Если планировщик/оптимизатор сверла был достаточно интеллектуальным, записи могли быть отфильтрованы и во второй таблице на основе условия соединения (чтобы уменьшить набор данных и, следовательно, приводят к более быстрому времени выполнения). Не полностью ли оптимизирован плагин для хранилища MongoDB, который вызывает это?
+0

Или, возможно, это потому, что у MongoDB нет объединений? Даже это функция агрегации $ lookup все еще делает именно это – Sammaye

+1

Истинно, что mongoDB не имеет соединения. Но Drill предоставляет эту функциональность, разбивая соединение на сканирование со стороны составляющей таблицы и делая HashJoin. Но он не делает сканирование эффективным способом. Вся фильтрация, проецирование, сортировка и т. Д. Должны передаваться в mongoDB, поскольку она может более эффективно использовать индексы. –

ответ

1

Плагин для хранения MongoDB от Drill's не поддерживает нажатие на соединения. Он поддерживает только нажатие на фильтры.

Плагины хранения - это те, которые отвечают за связь с источником данных, который поддерживает сверло.

При необходимости вы должны будете предоставить свои правила оптимизации для сжимания соединений. Это потребует опыта Apache Calcite и написания нового модуля хранения, который вносит эти правила.

Я не знаю, есть ли другой способ вносить новые правила, кроме как с помощью специального плагина, который делает это. Плагин не должен иметь дело с MongoDB, он должен будет только предоставить необходимые правила.