|
|
|
Поиск по дереву
|
|||
|---|---|---|---|
|
#18+
Всем привет. Я с Oracle достаточно редко работаю и не очень хорошо знаю все тонкости. Столкнулся с проблемой (9i): Есть табличка (сокращенная) Код: plaintext 1. 2. 3. 4. 5. 6. Нужно построить запрос, который вернет дерево с учетом текстового поиска по полям (programme & episode), причем важно , если на любом и уровней ветки поиск успешен - то должна выводиться вся ветка. Пробовал запрос Код: plaintext 1. 2. 3. 4. Но естественно, ветки целиком не возвращаются. Буду рад любым идеям. Alex Sibilev ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2003, 18:09 |
|
||
|
Поиск по дереву
|
|||
|---|---|---|---|
|
#18+
Voznikaet seriozniy vopros otnositelno poddereviev: ecli est 1 ABC-INT -- 2 BCD ------ 3 CDE-INT -----------4 DEF to polychaetsia cho a) perviy raz dolgno bit vibrano vsya vetv 1 ABC-INT a vtoroy raz vetv 3 CDE-INT b) ili tolko 1 raz 1 ABC-INT (a podvetvi pri povtornom sovpadenii uge ne vivodiatsya) Nado utochnit zadachu. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2003, 18:15 |
|
||
|
Поиск по дереву
|
|||
|---|---|---|---|
|
#18+
Вариант b. Подветви при повторном совпадении не выводятся вторично. Alex ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2003, 18:20 |
|
||
|
Поиск по дереву
|
|||
|---|---|---|---|
|
#18+
мне кажется, что одним иерархическим запросом эту задачу не решить. Условие where будет применяться на последнем этапе (после построения дерева) и как к результатам обычного плоского запроса, а о возможности отбора ветвей я не слышал. Может быть решением является построение всех возможных ветвей начиная с перебора стартового ID снизу, при удовлетворении условиям текстового поиска в родительской записи. А затем из этого набора строк построения конечного дерева. Это первое, что приходит в голову. Хотя кажется есть целый раздел математики, изучающий графы :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2003, 19:32 |
|
||
|
Поиск по дереву
|
|||
|---|---|---|---|
|
#18+
мда :( а если упростить задачу? известно что уровней может быть от 1 до 3 и поиск нужно производить только на 1 и 3 уровне (2ой не важен но в выборке должне присутствовать). По идее это же "стандартная" задача. Найти все ветви в которых встречаются опред. значения. Alex ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2003, 19:43 |
|
||
|
Поиск по дереву
|
|||
|---|---|---|---|
|
#18+
может тогда псевдостолбцы level и rownum как-то помогут? Т.е. получить выборку во временную таблицу с двумя дополнительными полями в которые поместить значения level и rownum от первой выборки, а затем по этим данным отобрать необходимые ветви? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2003, 19:50 |
|
||
|
Поиск по дереву
|
|||
|---|---|---|---|
|
#18+
Ideya sostoit v sleduyuschem: - postroit spisok kornevih uzlov dlya kotorih ne suschestvuet ni odnogo uzla po doroge ot nego k kornu dereva s tem ze samim ogranicheniem; - ispolzovat etot spisok kak kornevye uzly v konstrukcii START WITH Код: 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. Код: 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. Dlya podtvergdeniya - polnoe derevo: Код: 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. Gelau udachi. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2003, 19:52 |
|
||
|
Поиск по дереву
|
|||
|---|---|---|---|
|
#18+
Большое спасибо! То что нужно. Alex PS. Может в FAQ это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2003, 01:01 |
|
||
|
Поиск по дереву
|
|||
|---|---|---|---|
|
#18+
Оказалось немного не так. У меня дерево например такое: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. и если выбирать например node-e, то результат должен быть Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. т.е. вся ветвь (это наверное уже под-дерево) начиная от корневого узла (у которого родитель null) должна включаться в выборку. Alex ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2003, 01:26 |
|
||
|
Поиск по дереву
|
|||
|---|---|---|---|
|
#18+
Нет под рукой Оракула, чтобы проверить, но, по-моему, должно сработать следующее: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Основная идея -- расскрутить дерево обратно от ключевого листа и отобрать вершины деревьев. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2003, 02:18 |
|
||
|
Поиск по дереву
|
|||
|---|---|---|---|
|
#18+
Значит я несколько недопонял задачу. Но в этой постановке она решается намного проще. 1) Получить корневые узлы САМОГО ВЕРХНЕГО УРОВНЯ для каждого узла у которого выполняется требуемое условие. 2) Построить поддеревья для каждого ВЫБРАННОГО КОРНЕВОГО УЗЛА. Правда пришлось немного подогнать данные, т.к. предидущее дерево имело 1 общий корень а для данной задачи требуется много корней. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Запрос теперь выглядит так: -- внутренний подзапрос выбирает ТОЛЬКО корневые узлы обратным проходом от узлов для которых выполняется условие. Код: 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. Примечание запрос проверен и при множественных узлах в поддеревьях. Для узла = node-a Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2003, 06:22 |
|
||
|
Поиск по дереву
|
|||
|---|---|---|---|
|
#18+
Всем спасибо! Оба примера работают отлично. Есть еще вопрос о том как можно оптимизировать этот запрос? У меня в таблице всего 3371 записей. Когда я выполняю запросы, то например, запрос возвращающий 1181 записей выполняется около 14 секунд! Можно ли как нибудь ускорить выполнение запроса или для этого придется отказаться от использования connect by / start with ? Я использую PLSQL/Developer и воспользовался функцией explain plan (optimizer goal = choose) для этого запроса Код: plaintext 1. 2. 3. 4. 5. 6. 7. Вот какой план мне выдал oracle: Код: 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. 30. 31. 32. 33. Alex ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2003, 15:42 |
|
||
|
Поиск по дереву
|
|||
|---|---|---|---|
|
#18+
статистика собиралась? Когда и какая? Как установлен параметер optimizer_index_cost_adj? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2003, 16:00 |
|
||
|
Поиск по дереву
|
|||
|---|---|---|---|
|
#18+
Нет не собиралась. А как ее собирать? и какую? optimizer_index_cost_adj = 100 (как я понимаю по умолчанию установлен) Я по администрированию Oracle очень мало чего знаю. В основном с MSSQL работаю, но иногда приходится и под Oracle писать. Alex ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2003, 16:12 |
|
||
|
Поиск по дереву
|
|||
|---|---|---|---|
|
#18+
Ну в общем тут надо осторожно, т.к. если база боевая и некоторые запросы заточены на то, что статистики нет, то при сборе они могут начать тормозить. Но если можно пробовать, то: SQL> analyze table hr_archive compute statistics; SQL>alter session set optimizer_index_cost_adj = 1; SQL>alter session set sort_area_size = 10000000; ну и теперь запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2003, 16:25 |
|
||
|
Поиск по дереву
|
|||
|---|---|---|---|
|
#18+
База тестовая. Попробовал - те же 14 секунд. Alex ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2003, 16:31 |
|
||
|
Поиск по дереву
|
|||
|---|---|---|---|
|
#18+
а... там full сканы идут из-за Код: plaintext Код: plaintext Код: plaintext а план после сбора статистики и изменении параметров не поменялся? Можно еще попробовать собрать вот так: SQL> analyze table hr_archive compute statistics for all indexed columns size 100; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2003, 16:41 |
|
||
|
Поиск по дереву
|
|||
|---|---|---|---|
|
#18+
А с какого бодуна на '%ON' будут использоваться индексы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2003, 17:17 |
|
||
|
Поиск по дереву
|
|||
|---|---|---|---|
|
#18+
>А с какого бодуна на '%ON' будут использоваться индексы? с реверсивного :-) Реверсный индекс строить надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2003, 17:18 |
|
||
|
Поиск по дереву
|
|||
|---|---|---|---|
|
#18+
Мне кажется? проблема в том, что даже без ограничений по like, если я просто строю все целиком дерево из 3100 записей - он строится > 10 сек :( Наверное, connect by/start width - можно использовать на небольших деревьях ,но для больших это не подходит Alex ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2003, 17:19 |
|
||
|
Поиск по дереву
|
|||
|---|---|---|---|
|
#18+
Ya stroil derevya na 100 000 (primerno), sobiraus testirovat dlia 500 000 i 1 000 000. Vremia vipolneniya zavisit ot dvux osnovnih parametrov -- "shirota" dereva (bolsee kolichestvo uzlov pri menshem kolichestve urovney) --> chem shire tem medlennee -- kolichestvo uzlov No na 100000 pri dostatochno tyagelom zaproce, kogra dlya kazdogo uzla stroilsya obratniy prohod po derevy v korrelirovannom podzaprose maksimalnoe vremya bilo 1 min. 23 sek (na pamiyat) I eto na domashney mashine: -- oracle 9.2.0 -- Suse 8.0 -- op 512 /sga 80/ dbcache - 128 -- amd athlon 1600 (vagno poskolky nekotorie zaprosy porogdaut ogromnoe kolichestvo korotkih sortirovok v pamyati (dlya kotorih ne trebuetsya passhirenie sort_area a tolko CPU perfomance) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2003, 18:21 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=32106018&tid=1991825]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
425ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 232ms |
| total: | 763ms |

| 0 / 0 |
