От чего зависит отправит ли Oracle join в Impala или будет джойнить у себя?

Ситуация:

Есть запрос с двумя джойнами:

SELECT *
  FROM VIEW_A A
  JOIN VIEW_B B
    ON A.FIELD_1 = B.FIELD_1
  JOIN VIEW_C C
    ON C.FIELD_2 = A.FIELD_2
   AND C.FIELD_3 = B.FIELD_3

Каждое представление в этом запросе является представлением по типу

CREATE OR REPLACE VIEW VIEW_X AS
  SELECT "filed_1" AS FIELD_1
       , "filed_2" AS FIELD_2
       , "filed_3" AS FIELD_3
  FROM REMOTE_USER.REMOTE_TABLE_X@LINK_TO_REMOTE;

Где LINK_TO_REMOTE ведет в импалу (импала именует поля маленькими буквами, поэтому они в кавычках).

Проблема:

Оптимизатор решил, что не смотря на то, что все три представления смотрят на удаленные таблицы в импале, имеет смысл не отправлять целиком запрос в импалу (чтобы джойн произошел на её стороне удаленно), а две таблицы улетают с джойном (то есть, придет уже объединенный результат двух таблиц), а вот третья выкачивается целиком и джойн происходит уже на стороне оракла. Учитывая объемы, которые будут футболиться туда-сюда по сети, время запроса увеличивается на два порядка.

Вопрос:

Можно ли явно подсказать оптимизатору чтобы он отправил весь запрос в импалу и получил только ответ? Если нет, то что может влиять на это? Например, я заметил, что left join никогда не улетает в импалу, или при наличии функции nvl() в on секции джойна запрос также не спускается в импалу.


Ответы (1 шт):

Автор решения: teamer

может помочь хинт +DRIVING_SITE, но придётся немного изменить запрос, добавив в него хоть одну таблицу с удалённой базы явно, а не через view. этой таблицей может быть и dual, например:

SELECT /*+ DRIVING_SITE(D) */ *
  FROM VIEW_A A
  JOIN VIEW_B B
    ON A.FIELD_1 = B.FIELD_1
  JOIN VIEW_C C
    ON C.FIELD_2 = A.FIELD_2
   AND C.FIELD_3 = B.FIELD_3
  JOIN DUAL@LINK_TO_REMOTE D ON 1=1
→ Ссылка