MERGE JOIN CARTESIAN

Daphne
Дата: 21.11.2008 09:21:40
Доброе утро, господа Ораклисты! Расскажите пожалуйста что собой представляет MERGE JOIN CARTESIAN. Раскладывала в Explain Plan свой запрос, которой очень долго отрабатывал, и вот в плане мне было выдано следующее:
SELECT STATEMENT, GOAL = CHOOSE 23 1 91
SORT GROUP BY 14 1 91
FILTER
MERGE JOIN CARTESIAN 12 1 91
NESTED LOOPS 10 1 70
MERGE JOIN CARTESIAN 9 1 45
NESTED LOOPS 8 1 42
REMOTE 7 1 27
REMOTE 4497 67455
BUFFER SORT 8 77 231
REMOTE 77 231
REMOTE

Поясните пожалуйста, тчо такое MERGE CARTESIAN JOIN? Заранее благодарна!
Добрый Э - Эх
Дата: 21.11.2008 09:25:51
Это декартово произведение таблиц.
Такое могло получиться в двух случаях:
1) Автор запроса забыл связать таблицы, участвующие в соединении
2) СВО, переписывая запрос, тупо облажался и потерял условие соединения таблиц.
Вячеслав Любомудров
Дата: 21.11.2008 09:26:47
Иногда оно и неплохо
Например в соединении с dual
DenSoft
Дата: 21.11.2008 11:37:28
Добрый Э - Эх
Это декартово произведение таблиц. ...

Вот те раз. А NESTED LOOP, например не умеет делать декартово что ли?
select *
  from
    (
      select 1 id, 'раз' name from dual
      union all
      select 2 id, 'два' name from dual
      union all
      select 3 id, 'три' name from dual
      union all
      select 4 id, 'четыре' name from dual
    ) a,
    (
      select 11 id, 'раз раз' name from dual
      union all
      select 12 id, 'раз два' name from dual
      union all
      select 13 id, 'раз три' name from dual
      union all
      select 14 id, 'раз четыре' name from dual
    ) b
и план:
Operation Object Name Rows Bytes Cost Object Node In/Out PStart PStop

SELECT STATEMENT Optimizer Mode=CHOOSE
NESTED LOOPS
VIEW
UNION-ALL
TABLE ACCESS FULL SYS.DUAL
TABLE ACCESS FULL SYS.DUAL
TABLE ACCESS FULL SYS.DUAL
TABLE ACCESS FULL SYS.DUAL
VIEW
UNION-ALL
TABLE ACCESS FULL SYS.DUAL
TABLE ACCESS FULL SYS.DUAL
TABLE ACCESS FULL SYS.DUAL
TABLE ACCESS FULL SYS.DUAL
Андрей Панфилов
Дата: 21.11.2008 11:41:40
Daphne,

у нас чтобы такое не встречалось _optimizer_sortmerge_join_enabled=FALSE
Добрый Э - Эх
Дата: 21.11.2008 11:56:14
DenSoft
Вот те раз. А NESTED LOOP, например не умеет делать декартово что ли?

Декарт делать - разве только HASH JOIN не умеет. Только вот способ получения декарта выбирается оптимизатором. Но СВО - тоже не дурак. Посчитай, сколько раз тебе придется дергать внешнюю таблицу при построении декарта посредством NESTED LOOPS и посредством MERGE JOIN?
Вот то-то и оно...
SQL*Plus
Дата: 21.11.2008 12:01:30
Добрый Э - Эх
Это декартово произведение таблиц.
То есть множество всех возможных сочетаний строк двух таблиц.

Добрый Э - Эх
Такое могло получиться в двух случаях:
1) Автор запроса забыл связать таблицы, участвующие в соединении
2) СВО, переписывая запрос, тупо облажался и потерял условие соединения таблиц.
Как минимум, есть еще два случая:
3) Автор запроса написал хинт /*+ ORDERED */, но таблицы во фразе FROM расположены в неподходящем порядке.
4) Автор запроса сознательно применяет Декартово произведение (Cartesian product)
Timm
Дата: 21.11.2008 12:10:01
5) оптимизатор ошибся с оценкой кардинальности.
Добрый Э - Эх
Дата: 21.11.2008 12:16:53
SQL*Plus
Как минимум, есть еще два случая:
3) Автор запроса написал хинт /*+ ORDERED */, но таблицы во фразе FROM расположены в неподходящем порядке.
4) Автор запроса сознательно применяет Декартово произведение (Cartesian product)

Timm
5) оптимизатор ошибся с оценкой кардинальности.


2 SQL*Plus
3) С натяжкой можно отнести к моему пункту №2
4) Если бы автор умышленно применял декартово произведение таблиц, то вряд ли бы он удивлялся тому, что в плане появился этот шаг

2 Timm
5) Можно смело отнести к моему пункту №2 (ну таки же оптимизатор облажался? ;) )
Андрей Панфилов
Дата: 21.11.2008 12:34:07
Добрый Э - Эх,

только вот заметьте, что топикстартер таскает данные через dblink и оптимизатор вполне законно решил, что проще сначала все что нужно загрести в буфер, а потом уже разбираться.