Можно ли как-то подсказать оптимизатору, что после сделанного unnest подзапроса нужно сделать соединение хэшированием (или любым другим способом) с основной таблицей запроса.
Например для простого запроса
SELECT * FROM emp e WHERE e.deptno IN (SELECT d.deptno FROM dept d WHERE d.loc = 'CHICAGO')
мне хочется, чтобы emp и dept соединились посредством вложенных циклов... Как это сделать
не меняя структуру запроса?
SQL> EXPLAIN PLAN FOR
2 SELECT * FROM emp e WHERE e.deptno IN (SELECT d.deptno FROM dept d WHERE d.loc = 'CHICAGO')
3 /
Explained.
SQL> SELECT * FROM TABLE(dbms_xplan.display)
2 /
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 192 | 5 |
|* 1 | HASH JOIN | | 4 | 192 | 5 |
|* 2 | TABLE ACCESS FULL | DEPT | 1 | 11 | 2 |
| 3 | TABLE ACCESS FULL | EMP | 12 | 444 | 2 |
--------------------------------------------------------------------
Predicate Information (identified by operation id):
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
---------------------------------------------------
1 - access("E"."DEPTNO"="D"."DEPTNO")
2 - filter("D"."LOC"='CHICAGO')
Без хинтов делается HASH JOIN. Если написать
SELECT /*+ USE_NL(e d) */ * FROM emp e WHERE e.deptno IN (SELECT /*+ UNNEST */ d.deptno FROM dept d WHERE d.loc = 'CHICAGO')
то оно, естетсвенно не подхватится, так как алиас d лежит вне области видимости... Можно как-то это все-таки сделать?
Вот в запросах, использующих представления можно используя
global hints с минимальными ограничениями применять хинты к таблицам внутри этих представлений, неужели нельзя подобным образом "достучаться" до таблицы внутри подзапроса?