Почему этот запрос приводит к MERGE JOIN CARTESIAN в Oracle? - PullRequest
6 голосов
/ 11 августа 2010

Вот мой запрос:

select count(*)
from email_prod_junc j
inner join trckd_prod t5 on j.trckd_prod_sk = t5.trckd_prod_sk
inner join prod_brnd b on t5.prod_brnd_sk = b.prod_brnd_sk
inner join email e on j.email_sk = e.email_sk
inner join dm_geography_sales_pos_uniq u on (u.emp_sk = e.emp_sk and u.prod_brnd_sk = b.prod_brnd_sk)

План объяснения гласит:

Декартово соединение между DM_GEOGRAPHY_SALES_POS_UNIQ и EMAIL_PROD_JUNC.

Я не понимаю, потому что естьусловие соединения для каждой таблицы.

Ответы [ 3 ]

4 голосов
/ 11 августа 2010

Я решил это, добавив подсказку ORDERED:

select /*+ ordered */

Я получил информацию от здесь

Если вы укажете таблицы в том порядке, в котором вы хотите их объединить, и воспользуетесь этой подсказкой, Oracle не будет тратить время на поиск оптимального порядка объединения, а просто объединит их, как они упорядочены в предложении FROM. 1008 *

2 голосов
/ 12 августа 2010

Не зная ваших показателей и полного плана, трудно сказать, почему это происходит именно так. Мое лучшее предположение состоит в том, что EMAIL_PROD_JUNC и DM_GEOGRAPHY_SALES_POS_UNIQ относительно невелики и что индекс TRCKD_PROD (trckd_prod_sk, prod_brnd_sk) есть. Если это так, то оптимизатор, возможно, решил, что декартово на двух меньших таблицах дешевле, чем двойная фильтрация TRCKD_PROD.

0 голосов
/ 11 августа 2010

Я бы предположил, что это происходит из-за условия on (x и y) последнего внутреннего соединения.Oracle, вероятно, не знает, как оптимизировать условие нескольких операторов, поэтому выполняет полное объединение, а затем фильтрует результат по условию по факту.Я не очень знаком с планом объяснения Oracle, поэтому не могу сказать, что с правами

Edit

Если вы хотите проверить эту гипотезу, вы можете попробоватьизменив запрос на:

inner join dm_geography_sales_pos_uniq u on u.emp_sk = e.emp_sk 
where u.prod_brnd_sk = b.prod_brnd_sk

и посмотрим, исключает ли это полное соединение из плана

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...