powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / merge join or nested loops
3 сообщений из 3, страница 1 из 1
merge join or nested loops
    #39454945
имеется запрос:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with 
def_codes(name, left_range, right_range) as
  (
    select 'Мегафон',   1, 100 from dual union all
    select 'Билайн' , 101, 300 from dual
  ),
def_mnp(name, phone) as 
  (
    select 'Теле2', 7 from dual union all
    select 'МТС',   8 from dual
  ),
all_users(phone) as
  (
    select 7    from dual union all
    select 8    from dual union all
    select 150  from dual
  )
select 
  an.phone,
  nvl(mnp.name, dc.name)
from       all_users  an
left join  def_mnp    mnp on an.phone = mnp.phone
left join  def_codes  dc  on an.phone between dc.left_range and dc.right_range and mnp.phone is null;



С def_codes оптимизатор решил, что корректнее будет сделать NESTED LOOPS.

Если убрать условие mnp.phone is null, то уже получаем ожидаемый MERGE JOIN

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with 
def_codes(name, left_range, right_range) as
  (
    select 'Мегафон',   1, 100 from dual union all
    select 'Билайн' , 101, 300 from dual
  ),
def_mnp(name, phone) as 
  (
    select 'Теле2', 7 from dual union all
    select 'МТС',   8 from dual
  ),
all_users(phone) as
  (
    select 7    from dual union all
    select 8    from dual union all
    select 150  from dual
  )
select 
  an.phone,
  nvl(mnp.name, dc.name)
from       all_users  an
left join  def_mnp    mnp on an.phone = mnp.phone
left join  def_codes  dc  on an.phone between dc.left_range and dc.right_range /*and mnp.phone is null*/;



Можно ли как-то в первом варианте избавиться от nested loops? use_merge, no_use_nl - не помогли.

Версия Oracle
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
...
Рейтинг: 0 / 0
merge join or nested loops
    #39455153
Бракованный финский угорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станция Сортировочная,

Может тогда and mnp.phone != an.phone вместо and mnp.phone is null?
...
Рейтинг: 0 / 0
merge join or nested loops
    #39455158
Бракованный финский угорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станция Сортировочная,

Ты же понял, что я имел в виду
Код: plsql
1.
2.
3.
4.
5.
6.
select /*+ use_merge(dc)*/
  an.phone,
  nvl(mnp.name, dc.name)
from       all_users  an
left join  def_mnp    mnp on an.phone = mnp.phone
left join  def_codes  dc  on an.phone between dc.left_range and dc.right_range and decode(mnp.phone, an.phone ,1,0) = 0;

?
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / merge join or nested loops
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]