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

Откуда: Столица
Сообщений: 464
Есть несколько таблиц, иерархически связанных как мастер-детэйл
Примерно так
TABLE1 (TAB1_ID,NAME) в ней  TAB1_ID - PK
TABLE2 (TAB2_ID,TAB2_TAB1_ID,NAME)   в ней TAB2_ID - PK, TAB2_TAB1_ID - FK на TABLE1
TABLE3 (TAB3_ID,TAB3_TAB2_ID,NAME)   в ней TAB3_ID - PK, TAB3_TAB2_ID - FK на TABLE2
и т.п. (в реале таблиц ок 10 штук)

Нужно построить дерево, в качестве корня -- одна из записей в TABLE1. Делаю так:
строю вьюху

v_Hierarchy as
select 'TAB1' as kind,TAB1_ID as ID,NAME,'TAB1'||TAB1_ID as CHILD,null as PARENT
union all
select 'TAB2' as kind,TAB2_ID as ID,NAME,'TAB2'||TAB2_ID as CHILD,TAB1||TAB2_TAB1_ID as PARENT
union all
select 'TAB3' as kind,TAB3_ID as ID,NAME,'TAB3'||TAB3_ID as CHILD,TAB2||TAB3_TAB2_ID as PARENT

и дальше по ней стандартным образом

select * from v_hierarchy start with kind='TAB1' and ID=... connect by prior CHILD=PARENT

Ясное дело, что работает. И ясное дело, что медленно. Вопрос: можно ли как-то это дело ускорить?

Заранее спасибо
6 окт 12, 12:46    [13277487]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить дерево из нескольких таблиц  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51772

Tyo
можно ли как-то это дело ускорить?

Первое, что приходит в голову это выкинуть вьюху и connect by, оставив голое
select * from table1 left join table2 on TAB1_ID=TAB2_TAB1_ID
  left join table3 on TAB2_ID=TAB3_TAB2_ID
where TAB1_ID=...

Posted via ActualForum NNTP Server 1.5

6 окт 12, 13:06    [13277523]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить дерево из нескольких таблиц  [new]
Tyo
Member

Откуда: Столица
Сообщений: 464
Dimitry Sibiryakov,

И что я получу? Чистое декартово произведение.
Мне же иерархия нужна, с LEVEL и т.п.
6 окт 12, 13:31    [13277559]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить дерево из нескольких таблиц  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51772

Tyo
И что я получу? Чистое декартово произведение.

Декартово произведение ты бы получил, если бы не было условий в ON. А так ты получишь все
детали заданного мастера. Что и требовал в первом сообщении.

Posted via ActualForum NNTP Server 1.5

6 окт 12, 13:40    [13277570]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить дерево из нескольких таблиц  [new]
Tyo
Member

Откуда: Столица
Сообщений: 464
Dimitry Sibiryakov
Tyo
И что я получу? Чистое декартово произведение.

Декартово произведение ты бы получил, если бы не было условий в ON. А так ты получишь все
детали заданного мастера. Что и требовал в первом сообщении.


В Вашем варианте, при условии что у каждого родителя есть только один потомок, я получу на выходе 1 (одну) длинную запись вместо дерева.
Мне же нужна иерархия, в терминах моего примера -- 3 (три) записи.
Вот так

ID(из TABLE1) NAME (из TABLE1) PARENT CHILD LEVEL
ID(из TABLE2) NAME (из TABLE2) PARENT CHILD LEVEL
ID(из TABLE3) NAME (из TABLE3) PARENT CHILD LEVEL

understandable?
6 окт 12, 13:53    [13277585]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить дерево из нескольких таблиц  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54381
Tyo,

да юнионами и оформи запрос
только сортировку продумать
и никаких коннект баев
6 окт 12, 19:19    [13278052]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить дерево из нескольких таблиц  [new]
Tyo
Member

Откуда: Столица
Сообщений: 464
andreymx
Tyo,

да юнионами и оформи запрос
только сортировку продумать
и никаких коннект баев


Да Вы чё? Оракл как раз специально для этих случаев и придумал коннект бай.
6 окт 12, 20:44    [13278291]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить дерево из нескольких таблиц  [new]
Dako aka 3L33T
Member

Откуда:
Сообщений: 98
А индексы создал на все 10 табличек (id_tab1, id_tab2) и (id_tab2,id_tab1)
6 окт 12, 20:45    [13278293]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить дерево из нескольких таблиц  [new]
Tyo
Member

Откуда: Столица
Сообщений: 464
Dako aka 3L33T
А индексы создал на все 10 табличек (id_tab1, id_tab2) и (id_tab2,id_tab1)


Не-а. Именно такие, да, на связку PK+FK?
6 окт 12, 21:08    [13278384]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить дерево из нескольких таблиц  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54381
Tyo
andreymx
Tyo,

да юнионами и оформи запрос
только сортировку продумать
и никаких коннект баев


Да Вы чё? Оракл как раз специально для этих случаев и придумал коннект бай.
на какие? для замены сортировки?
6 окт 12, 21:15    [13278428]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить дерево из нескольких таблиц  [new]
Tyo
Member

Откуда: Столица
Сообщений: 464
andreymx
Tyo
пропущено...

Да Вы чё? Оракл как раз специально для этих случаев и придумал коннект бай.
на какие? для замены сортировки?


Не, для построения дерева.
6 окт 12, 21:22    [13278465]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить дерево из нескольких таблиц  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
Tyo,

Left join + unpivot
6 окт 12, 21:29    [13278500]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить дерево из нескольких таблиц  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
Tyo,

А вообще лучше озвучить зачем это "дерево" вам нужно?
6 окт 12, 21:31    [13278508]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить дерево из нескольких таблиц  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54381
использую аналогичные методы для построения дерева расчетов - как раз данные для него находятся в 6 или 7 разных таблицах
Чтобы отбирало побыстрее, выгружаю во времянку
Ну а соббсно дерево строится как раз не Ораклом, а клиентом - через DbTreeView

ЗЫ: Сразу предвижу вопрос - почему 7 таблиц, а не одна?
Есть такая у меня отговорка - не я проектировал :)
А если честно - так до сих пор и не уверен, 7 лучше или одна

К сообщению приложен файл. Размер - 20Kb
6 окт 12, 22:26    [13278746]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить дерево из нескольких таблиц  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54381
или вот дерево калькуляций
десяток разных таблиц и вьюх
строится тем же DbTreeView

К сообщению приложен файл. Размер - 6Kb
6 окт 12, 22:30    [13278768]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить дерево из нескольких таблиц  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54381
хотя я ни в коем случае не хочу принуждать ТС к аналогичным методам :)
6 окт 12, 22:31    [13278776]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить дерево из нескольких таблиц  [new]
brig_2000
Member

Откуда:
Сообщений: 207
Tyo
andreymx
Tyo,

да юнионами и оформи запрос
только сортировку продумать
и никаких коннект баев


Да Вы чё? Оракл как раз специально для этих случаев и придумал коннект бай.


Серьезно? А я т всегда думал, что Оракл это придумал все таки больше для тех случаев, когда все дерево хранится в одной таблице, а не в 10-ти.
6 окт 12, 23:38    [13279010]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить дерево из нескольких таблиц  [new]
brig_2000
Member

Откуда:
Сообщений: 207
andreymx
использую аналогичные методы для построения дерева расчетов - как раз данные для него находятся в 6 или 7 разных таблицах
Чтобы отбирало побыстрее, выгружаю во времянку
Ну а соббсно дерево строится как раз не Ораклом, а клиентом - через DbTreeView

ЗЫ: Сразу предвижу вопрос - почему 7 таблиц, а не одна?
Есть такая у меня отговорка - не я проектировал :)
А если честно - так до сих пор и не уверен, 7 лучше или одна


Не знаю что такое DbTreeView и вообще откуда оно, но догадываюсь как работает. Но в описанном вами случае с точки производительности было бы лучше использовать какое-нибудь TreeView без приставки Db и заполнялось бы оно вручную:

1. инициация верхнего уровня дерева - по данным запроса из верхнеуровневой таблицы (например T1) заполняются узлы дерева первого уровня, знак на узле "+" (якобы все узлы имеют потомков) (SELECT id, val FROM t1)

2. после того как пользователь кликнул на узле - запрос в базу данных по детям данного узла и заполнение узлов второго уровня для выбраного значения 1 уровня напрмер из чайлд таблицы T2 (SELECT id, val FROM t2 WHERE t2.t1_id = p_selected_id) . знак на узле устанавливаем "+"

и т.д. - ни база, ни сеть не напрягаются, немного напрягается программист. Но если сделает для себя шаблон на будущее - то никаких проблем

3. Если пользователь кликнул на узле, для которого нет детей (т.е запрос детей ничего не возратил), то вместо "+" на таком узле устанавливам "-". - это не так страшно для пользователя. (если не нравится такая логика, то в родительских таблицах можно иметь столбец с указанием детей (по-умолчанию 0) и по его значению расставлять знак узла - в этом случае требуется триггера на чайлд таблицы для измененя значений этих столбцов)
6 окт 12, 23:51    [13279053]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить дерево из нескольких таблиц  [new]
pectopatop
Member

Откуда:
Сообщений: 765
Tyo
andreymx
пропущено...
на какие? для замены сортировки?


Не, для построения дерева.

Беда в том, что всё универсальное как правило очень тормозное и глючное (это я про коннект бай).
А раз вы лучше Оракла (и коннект бая) знаете какое у вас дерево и как оно организовано - не лучше ли (и производительнее) будет самому сделать юнион-запрос с фильтрацией по верхнему мастеру?
7 окт 12, 00:14    [13279133]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить дерево из нескольких таблиц  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54381
brig_2000,

с точки зрения производительности - далеко не уверен
зато уверен, что у вас результат будет явно не согласован

Правда, это может быть некритично... а там уж смотрите, важно это или нет



brig_2000
и т.д. - ни база, ни сеть не напрягаются, немного напрягается программист. Но если сделает для себя шаблон на будущее - то никаких проблем
вот тут уж хрен вам, что сеть не дергается
вместо одного обращения по сети вы делаете десятки и сотни...
а когда юзверь нажмет кнопку "раскрыть всё"?
7 окт 12, 00:18    [13279144]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить дерево из нескольких таблиц  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54381
brig_2000
(если не нравится такая логика, то в родительских таблицах можно иметь столбец с указанием детей (по-умолчанию 0) и по его значению расставлять знак узла - в этом случае требуется триггера на чайлд таблицы для измененя значений этих столбцов)
и как минимум сериализация вставки/удаления чайлдов
7 окт 12, 00:21    [13279155]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить дерево из нескольких таблиц  [new]
brig_2000
Member

Откуда:
Сообщений: 207
andreymx
brig_2000,

с точки зрения производительности - далеко не уверен
зато уверен, что у вас результат будет явно не согласован

Правда, это может быть некритично... а там уж смотрите, важно это или нет



brig_2000
и т.д. - ни база, ни сеть не напрягаются, немного напрягается программист. Но если сделает для себя шаблон на будущее - то никаких проблем
вот тут уж хрен вам, что сеть не дергается
вместо одного обращения по сети вы делаете десятки и сотни...
а когда юзверь нажмет кнопку "раскрыть всё"?


1) не знаю с какой скоростью кликает на узлы ваш пользователь и зачем это ему - тренирует реакцию?
2) не все задачи требуют действия "раскрыть всё" - для чего? Если поиск - то вверху TreeView делается поле в которое поьзователь вводит значение или шаблон поиска и уже средствами базы данных происходит поиск и "раскрывание" нужного узла до нужного значения.

Вы мыслите деревом из макимум 1000 узлов. А если их будет миллионы? Хана писюку пользователя?
7 окт 12, 00:32    [13279172]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить дерево из нескольких таблиц  [new]
brig_2000
Member

Откуда:
Сообщений: 207
Tyo
Есть несколько таблиц, иерархически связанных как мастер-детэйл
Примерно так
TABLE1 (TAB1_ID,NAME) в ней  TAB1_ID - PK
TABLE2 (TAB2_ID,TAB2_TAB1_ID,NAME)   в ней TAB2_ID - PK, TAB2_TAB1_ID - FK на TABLE1
TABLE3 (TAB3_ID,TAB3_TAB2_ID,NAME)   в ней TAB3_ID - PK, TAB3_TAB2_ID - FK на TABLE2
и т.п. (в реале таблиц ок 10 штук)

Нужно построить дерево, в качестве корня -- одна из записей в TABLE1. Делаю так:
строю вьюху

v_Hierarchy as
select 'TAB1' as kind,TAB1_ID as ID,NAME,'TAB1'||TAB1_ID as CHILD,null as PARENT
union all
select 'TAB2' as kind,TAB2_ID as ID,NAME,'TAB2'||TAB2_ID as CHILD,TAB1||TAB2_TAB1_ID as PARENT
union all
select 'TAB3' as kind,TAB3_ID as ID,NAME,'TAB3'||TAB3_ID as CHILD,TAB2||TAB3_TAB2_ID as PARENT

и дальше по ней стандартным образом

select * from v_hierarchy start with kind='TAB1' and ID=... connect by prior CHILD=PARENT

Ясное дело, что работает. И ясное дело, что медленно. Вопрос: можно ли как-то это дело ускорить?

Заранее спасибо


Хотя и дизайн и требования с моей точки зрения ни в какую степь не лезут, все таки приведу псевдокод, который c моей точки зрения ускорит время выполненя запроса

WITH t1 AS
(
SELECT NULL  partent_id
,      p_id  child_id
,      name  name
FROM   DUAL
) 
, t2 AS
(
SELECT t2.t1_id parent_id
       t2.t2_id child_id
,      name     name
FROM   t2
WHERE  t2.t1_id = t1.t1_id
)
, t3 AS
(
SELECT t3.t2_id parent_id
       t3.t3_id child_id
,      name     name
FROM   t3
WHERE  t3.t2_id = t2.t2_id
) 
SELECT level, parent_id, child_id, name
FROM
(
SELECT partent_id, child_id, name
FROM
(
SELECT partent_id, child_id, name  FROM t1
UNION ALL
SELECT partent_id, child_id, name  FROM t2
UNION ALL
SELECT partent_id, child_id, name  FROM t3
)
)
START WITH parent_id IS NULL
CONNECT BY child_id = parent_id

p_id - идентификатор узла, с которого требуется раскрыть дерево
7 окт 12, 00:42    [13279199]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить дерево из нескольких таблиц  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54381
brig_2000,

я, конечно, могу себе представить, что кто-то документооборот всей фирмы в виде дерева показывает.
Но у нас обычно папки - отдельно, а документы - отдельно
:)


Хотя, конечно, наличие развесистых деревьев никак не исключаю.
Может, вы таким образом деталировку Ил-76 показываете. Тут одним запросом явно не обойтись.
7 окт 12, 01:16    [13279271]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить дерево из нескольких таблиц  [new]
123йй
Guest
andreymx,

off
у себя делал так.
рисовал корень, а далее при раскрытии узла дочитывал данные
8 окт 12, 08:46    [13282222]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить