powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / иерархический запрос и подзапрос
4 сообщений из 4, страница 1 из 1
иерархический запрос и подзапрос
    #32191674
PetrovL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть иерархический запрос, использующий подзапрос, возвращающий всего две записи. Однако при построении дерева все равно используется FULL SCAN для таблицы INTERMEDIATESORTOBJECTS. Как заставить CONNECT BY использовать результаты подзапроса?

P.S. Индексы на поля ID и IDPARENTOBJECT существуют.
Использование хинтов PUSH_SUBQ и NO_PUSH_SUBQ результата не дает

SELECT
A.ID,
A.IDPARENTOBJECT
FROM
INTERMEDIATESORTOBJECTS A
WHERE
A.ID IN (SELECT T.ID FROM OBJECTS T WHERE T.ID=17309208 OR T.ID = 17309321)
CONNECT BY PRIOR
A.ID = A.IDPARENTOBJECT
START WITH
A.IDPARENTOBJECT IS NULL
...
Рейтинг: 0 / 0
иерархический запрос и подзапрос
    #32191745
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
It is not clear which portion of your query causes FULL SCAN. It could be either START WITH or CONNECT BY. Below is an example which might help:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
SQL> create table empx as select * from emp;

Table created.

SQL> select ename,deptno
   2   from empx
   3   start with job in (select 'PRESIDENT' from dual)
   4   connect by prior empno = mgr;

Execution Plan
 ----------------------------------------------------------
 
    0       SELECT STATEMENT Optimizer=CHOOSE
    1      0    CONNECT BY (WITH FILTERING)
    2      1      NESTED LOOPS
    3      2        MERGE JOIN
    4      3          SORT (JOIN)
    5      4            TABLE ACCESS (FULL) OF 'EMPX'
    6      3          SORT (JOIN)
    7      6            VIEW OF 'VW_NSO_1'
    8      7              SORT (UNIQUE)
    9      8                TABLE ACCESS (FULL) OF 'DUAL'
   10      2        TABLE ACCESS (BY USER ROWID) OF 'EMPX'
   11      1      NESTED LOOPS
   12     11        BUFFER (SORT)
   13     12          CONNECT BY PUMP
   14     11        TABLE ACCESS (FULL) OF 'EMPX'
   15      1      FILTER
   16     15        TABLE ACCESS (FULL) OF 'DUAL'

As you can see, FULL SCAN is used for both START WITH and CONNECT BY. Since START WITH is based on column JOB, we need to index it:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
SQL> create index empx_idx1 on empx(job);

Index created.

SQL> select ename,deptno
   2   from empx
   3   start with job in (select 'PRESIDENT' from dual)
   4   connect by prior empno = mgr;

Execution Plan
 ----------------------------------------------------------
 
    0       SELECT STATEMENT Optimizer=CHOOSE
    1      0    CONNECT BY (WITH FILTERING)
    2      1      NESTED LOOPS
    3      2        NESTED LOOPS
    4      3          VIEW OF 'VW_NSO_1'
    5      4            SORT (UNIQUE)
    6      5              TABLE ACCESS (FULL) OF 'DUAL'
    7      3          INDEX (RANGE SCAN) OF 'EMPX_IDX1' (NON-UNIQUE)
    8      2        TABLE ACCESS (BY USER ROWID) OF 'EMPX'
    9      1      NESTED LOOPS
   10      9        BUFFER (SORT)
   11     10          CONNECT BY PUMP
   12      9        TABLE ACCESS (FULL) OF 'EMPX'
   13      1      FILTER
   14     13        TABLE ACCESS (FULL) OF 'DUAL'

Now START WITH is using index but CONNECT BY is still using FULL SCAN. Since CONNECT BY is based on column MGR, we need to index it:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
SQL> create index empx_idx2 on empx(mgr);

Index created.

SQL> select ename,deptno
   2   from empx
   3   start with job in (select 'PRESIDENT' from dual)
   4   connect by prior empno = mgr;

Execution Plan
 ----------------------------------------------------------
 
    0       SELECT STATEMENT Optimizer=CHOOSE
    1      0    CONNECT BY (WITH FILTERING)
    2      1      NESTED LOOPS
    3      2        NESTED LOOPS
    4      3          VIEW OF 'VW_NSO_1'
    5      4            SORT (UNIQUE)
    6      5              TABLE ACCESS (FULL) OF 'DUAL'
    7      3          INDEX (RANGE SCAN) OF 'EMPX_IDX1' (NON-UNIQUE)
    8      2        TABLE ACCESS (BY USER ROWID) OF 'EMPX'
    9      1      NESTED LOOPS
   10      9        BUFFER (SORT)
   11     10          CONNECT BY PUMP
   12      9        TABLE ACCESS (BY INDEX ROWID) OF 'EMPX'
   13     12          INDEX (RANGE SCAN) OF 'EMPX_IDX2' (NON-UNIQUE)
   14      1      FILTER
   15     14        TABLE ACCESS (FULL) OF 'DUAL'

As you can see, both START WITH and CONNECT BY are using INDEX SCAN now.

SY
...
Рейтинг: 0 / 0
иерархический запрос и подзапрос
    #32191927
Simon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обрати внимание на
A.IDPARENTOBJECT IS NULL

с таким условием индексы не используются
попробуй хины use_index (table index)
...
Рейтинг: 0 / 0
иерархический запрос и подзапрос
    #32192042
PetrovL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, все получилось.
Проблема была в START WITH
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / иерархический запрос и подзапрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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