Оптимизация запроса с использованием "древовидной выборки"

Rostislav74
Дата: 29.11.2012 13:31:21
Старый вариант (с проходом вниз по дереву):
select count(1)
from contract c
where exists
(
  select 1
  from department d
  where d.agnlist_rn=c.executor_div_rn
  connect by prior d.rn=d.srn                    -- srn - уровень вниз, RN первичный ключ
  start with d.agnlist_rn=92                      -- с какой точки строить дерево agnlist_rn уникально, можно и RN использовать
)

Время: > 3-4 сек.


Новый вариант (с проходом вверх по дереву):
select count(1)
from contract c
where exists
(
  select 1
  from department d
  where d.agnlist_rn=92
  connect by prior d.srn=d.rn                     -- собираем дерево вверх
  start with d.agnlist_rn=c.executor_div_rn
)

Время: < 0.1 сек.

Предложил один программист, для оптимизации
Я голову ломаю и не пойму - идентичны они будут или нет... и если идентичны то при каких условиях...
Делаю выборки - вроде результат один... хочу чтоб посмотрели свежим взглядом...
Добрый Э - Эх
Дата: 29.11.2012 13:38:44
Как бы, в общем случае, если дерево собирать от корня к листьям, то получится именно дерево. А если его собирать от листьев к корню, то получим в лучшем случае - бамбуковую рощу. В худшем - совокупность веток и листьев торчащих из одного места.
Rostislav74
Дата: 29.11.2012 13:49:49
Добрый Э - Эх
Как бы, в общем случае, если дерево собирать от корня к листьям, то получится именно дерево. А если его собирать от листьев к корню, то получим в лучшем случае - бамбуковую рощу. В худшем - совокупность веток и листьев торчащих из одного места.


там отличие не только в направлении выборки, но и в других условиях...
SvDev
Дата: 29.11.2012 14:07:54
Rostislav74,

Зачем в exists connect by ? Выбросите. И ответ: внутри exists - да, выборки будут эквивалентыми.
Rostislav74
Дата: 16.01.2013 07:22:06
SvDev
Rostislav74,

Зачем в exists connect by ? Выбросите. И ответ: внутри exists - да, выборки будут эквивалентыми.


Может я что упускаю... но как Выбросить connect by?
Подскажите пожалуйста на примере?
Сергей Арсеньев
Дата: 16.01.2013 12:16:52
Добрый Э - Эх
Как бы, в общем случае, если дерево собирать от корня к листьям

у людей exists - какая разница какое дерево?

Разубедите меня кто-нибудь, а то я наверное туплю.
Сергей Арсеньев
Дата: 16.01.2013 12:21:24
Сергей Арсеньев,

Хотя сам додумался, например если при
start with d.agnlist_rn=91

дерево не строится. (зациклено)
orawish
Дата: 16.01.2013 12:57:24
Rostislav74,

дерево департаментов, да еще не всё, а от известной ветки одной..
материализуйте в факторинге и ходите екзистом к материализации
Rostislav74
Дата: 17.01.2013 11:28:18
orawish
Rostislav74,

дерево департаментов, да еще не всё, а от известной ветки одной..
материализуйте в факторинге и ходите екзистом к материализации


Оно не постоянное.. "92" это подставленная переменная

А данный запрос "вырезанный" для примера и говорит - покажи мне все контракты относительно какого то управления со всеми его подчиненными отделами, службами, цехами и т.д. или относительно одного отдела... в зависимости на какой узел дерева указывает переменная которая здесь обозначена "92"....
orawish
Дата: 17.01.2013 12:57:08
Rostislav74
orawish
Rostislav74,

дерево департаментов, да еще не всё, а от известной ветки одной..
материализуйте в факторинге и ходите екзистом к материализации


Оно не постоянное.. "92" это подставленная переменная

А данный запрос "вырезанный" для примера и говорит - покажи мне все контракты относительно какого то управления со всеми его подчиненными отделами, службами, цехами и т.д. или относительно одного отдела... в зависимости на какой узел дерева указывает переменная которая здесь обозначена "92"....

и что? дело в принципе - зачем лезть на дерево каждый раз, когда надо проверить наличие значения в наборе данных?