Как захинтовать джоин по алиасу ?

ora601
Дата: 18.09.2015 18:19:53
SQL>  select * from table(dbms_xplan.display_cursor('641321t3tscpr',null,'+ALIAS'));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  641321t3tscpr, child number 0
-------------------------------------
select * from t1, t2 , t3 where t1.lv=t2.lv and t2.lv=t3.lv

Plan hash value: 98820498

----------------------------------------------------------------------------
| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |       |       |    10 (100)|          |
|*  1 |  HASH JOIN          |      |     9 |   351 |    10  (10)| 00:00:01 |
|*  2 |   HASH JOIN         |      |     9 |   234 |     7  (15)| 00:00:01 |
|   3 |    TABLE ACCESS FULL| T2   |     9 |   117 |     3   (0)| 00:00:01 |
|   4 |    TABLE ACCESS FULL| T3   |    49 |   637 |     3   (0)| 00:00:01 |
|   5 |   TABLE ACCESS FULL | T1   |    99 |  1287 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$1
   3 - SEL$1 / T2@SEL$1
   4 - SEL$1 / T3@SEL$1
   5 - SEL$1 / T1@SEL$1

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("T1"."LV"="T2"."LV")
   2 - access("T2"."LV"="T3"."LV")

Note
-----
   - dynamic sampling used for this statement (level=2)


Хочу вместо 1 операции HASH JOIN - NL (между 5 и 2). Как сделать ?
dbms_photoshop
Дата: 18.09.2015 18:45:08
ora601,

Заменить "+ALIAS" на "ADVANCED" и думаю станет ясно какую часть из аутлайна взять и поправить.
ora601
Дата: 18.09.2015 19:03:58
dbms_photoshop
ora601,

Заменить "+ALIAS" на "ADVANCED" и думаю станет ясно какую часть из аутлайна взять и поправить.


Видимо нельзя, т.к. для 2 операции нету алиаса.
dbms_photoshop
Дата: 18.09.2015 19:27:18
ora601,

--+ leading(t2 t3 t1) use_nl(@sel$1 t1@sel$1)
dbms_photoshop
Дата: 18.09.2015 19:29:47
ora601,

Но на алиас лучне не завязываться, если это возможно. В твоем примитивном случае - элементарно
leading(t2 t3 t1) use_nl(t1)
ora601
Дата: 18.09.2015 19:44:57
dbms_photoshop
ora601,

Но на алиас лучне не завязываться, если это возможно. В твоем примитивном случае - элементарно
leading(t2 t3 t1) use_nl(t1)


Видимо без указания leading нельзя ...
У меня запрос больше, где собственно говоря нужно поменять последнюю операцию , порядок джоина до, не должен фиксироваться. Я ожидал что то типа USE_NL(2, 5), где 2 - ,5 - операции на первом примере...
andrey_anonymous
Дата: 19.09.2015 12:48:34
ora601, взялся за гвозди - крепи до конца.
Методы доступа, порядок и методы соединения как минимум.
dbms_photoshop
Дата: 19.09.2015 13:22:45
ora601
Видимо без указания leading нельзя ...
У меня запрос больше, где собственно говоря нужно поменять последнюю операцию , порядок джоина до, не должен фиксироваться. Я ожидал что то типа USE_NL(2, 5), где 2 - ,5 - операции на первом примере...
Ну так если тебе приходится указывать хинт - значит Оракл где-то ошибается по твоему.
Когда ты указываешь use_nl - Оракл его рассматривает (ты можешь это посмотреть в трассе 10053), но другие погрешности при построении конкретного плана это не исправляет.
Ему указано: соединять t1 только с помощью NL и он перебирает порядок таблиц учитывая это искусственное ограничение при поиске наименьшей стоимости.
Если ты хочешь соединить какой-то набор данных с помощью NL с еще одной таблицей - можешь тот набор впихнуть в inline view с хинтом no_merge,
а на внешнем уровне указать use_nl и при необходимости swap_join_inputs/no_swap_join_inputs.
Но лучше все таки разобраться в чем причина неправильного плана и фиксить её.
ora601
Дата: 19.09.2015 16:19:42
dbms_photoshop
Если ты хочешь соединить какой-то набор данных с помощью NL с еще одной таблицей - можешь тот набор впихнуть в inline view с хинтом no_merge


Дело в том что менять запрос нельзя, он генерится в приложении. Поэтому вариант с инлайн, материализацией не подходит.

Всё таки странно что нельзя "так просто" взять и указать как соединять определённую таблицу с предидущим результатом соединения, ведь меня может не волновать в каком порядке оракл соединяет таблицы до этой операции.
MasterZiv
Дата: 19.09.2015 17:00:33
ora601
Хочу вместо 1 операции HASH JOIN - NL (между 5 и 2). Как сделать ?


USE_HASH(first_table_alias second-table_alias)