Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Иерархический запрос, значения старта из коллекции  [new]
gerasim9
Member

Откуда:
Сообщений: 11
Есть запрос:
Select th.parent_tag_id
From   tag_hierarchy th
Start  With th.tag_id  In (Select column_value From  Table(table_of_number(11954, 11955)))
Connect By th.tag_id = Prior th.parent_tag_id

План такой:

SELECT STATEMENT, GOAL = ALL_ROWS 2 3 14843 2
CONNECT BY WITH FILTERING "TH"."TAG_ID"=PRIOR "TH"."PARENT_TAG_ID"
TABLE ACCESS BY INDEX ROWID TAG_HIERARCHY
HASH JOIN RIGHT SEMI 45 3 5269249 19 "TH"."TAG_ID"=VALUE(KOKBF$)
COLLECTION ITERATOR CONSTRUCTOR FETCH
INDEX FAST FULL SCAN PK_TAG_HIERARCHY 11 8119 1194805 5
NESTED LOOPS
CONNECT BY PUMP
INDEX RANGE SCAN PK_TAG_HIERARCHY 2 3 14843 2 1 "TH"."TAG_ID"=PRIOR "TH"."PARENT_TAG_ID"
2-я колонка цифр - cardinality
table_of_number(11954, 11955) - подставил для частного случая, вообще эта коллекция формируется перед запросом.
Если же ставлю "вручную" In(11954, 11955) - cardinality становится нормальной, порядка количества элементов в коллекции.
Получается, тормозит сабселект в In. Разница в скорости примерно на порядок.

По совету более опытных товарищей применял хинт CARDINALITY, однако если запрос
Select /*+ CARDINALITY(aa 5)*/ column_value From  Table(table_of_number(11954, 11955)) aa
выполняется сам по себе, то хинт работает, а если внутри приведенного выше запроса - то план не меняется и кардиналити меньше не становится

С оптимизацией запросов оракла до настоящего момента толком не сталкивался. Буду благодарен как за помощь в конкретном случае, так и за рекомендации "куда копать для просветления"
22 окт 12, 16:56    [13357761]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический запрос, значения старта из коллекции  [new]
ORA__SQL
Member

Откуда: Moscow
Сообщений: 1774
gerasim9, setting cardinality for pipelined and table functions

http://www.oracle-developer.net/display.php?id=427
22 окт 12, 17:11    [13357892]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический запрос, значения старта из коллекции  [new]
gerasim9
Member

Откуда:
Сообщений: 11
gerasim9, setting cardinality for pipelined and table functions

http://www.oracle-developer.net/display.php?id=427

Насколько я понимаю, это именно о том, о чем я уже писал:

если запрос
ORA__SQL
Select /*+ CARDINALITY(aa 5)*/ column_value From Table(table_of_number(11954, 11955)) aa

выполняется сам по себе, то хинт работает, а если внутри приведенного выше запроса - то план не меняется и кардиналити меньше не становится
22 окт 12, 17:52    [13358112]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический запрос, значения старта из коллекции  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
gerasim9
выполняется сам по себе, то хинт работает, а если внутри приведенного выше запроса - то план не меняется и кардиналити меньше не становится
Прежде всего CARDINALITY - недокументирован.
Мне попадались случаи когда он препятствовал подхватыванию других хинтов.
Возможно что у тебя случай, что он сам не подхватывается.
Покажи планы из sql*plus в нормальном виде и теге src.
set lines ... pages ...
explain plan for
select ...;
select * from table(dbms_xplan.display);
Если не хочется заморачиваться с Extensible Optimiser или документированными хинтами типа use_nl, то лучше уж OPT_ESTIMATE.

PS. Версия?
22 окт 12, 18:29    [13358298]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический запрос, значения старта из коллекции  [new]
comphead
Member

Откуда: Киев
Сообщений: 3390
dbms_photoshop
Если не хочется заморачиваться с Extensible Optimiser или документированными хинтами типа use_nl, то лучше уж OPT_ESTIMATE.



Если мне память не изменяет, то он тоже не документирован.
22 окт 12, 18:52    [13358403]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический запрос, значения старта из коллекции  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
comphead
Если мне память не изменяет, то он тоже не документирован.
Я где-то утверждал обратное?
лучше б уж юзали opt_estimate. Последний по крайней мере, opt_estimate активно используется в tuning advisor
22 окт 12, 19:01    [13358431]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический запрос, значения старта из коллекции  [new]
gerasim9
Member

Откуда:
Сообщений: 11
dbms_photoshop,
спасибо, /*+ OPT_ESTIMATE(table, zz, scale_rows=0.0005) */ сработало в т.ч. на основном запросе

на самом деле пробовал нечто аналогичное после поста ORA_SQL, но, видимо, в первый раз где-то ошибся синтаксисом

спасибо обоим
23 окт 12, 11:08    [13360877]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить