От чего зависит отправит ли 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 шт):
может помочь хинт +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