|
Скорость построения дерева, Рекурсивные CTE
|
|||
---|---|---|---|
#18+
Имеется у меня такой запрос, в общих чертах. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
MyList - получаю список узлов, в таком порядке: "Первый уровень Первый уровень ... Первый уровень Второй уровень ... Второй уровень Третий уровень ..." Из MyTree в итоге надо получить: " Имя| ID |предок|уровень А 1 0 0 Б 10 1 1 В 100 10 2 Г 1000 100 3 Д 10000 1000 4 Е 100000 10000 5 Ж 100001 10000 5 З 11 1 1 И 101 11 2 ... 3 ... 4 .... 5 " Все работает правильно. Если я задаю такие параметры для MyList, что получаю немного записей, то MyList выполняется за миллисекунды, MyTree за секунду с чем-то. Если же задаю параметры MyList такие, что получается порядка 20 000 записей, то MyList выполняется за пару секунд, а дождаться выполнения MyTree становится нереально. Можно ли как-то ускорить работу, скажем если ограничить глубину уровней дерева, если я знаю максимальную глубину? Или же использовать другой алгоритм, может быть Nested sets? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2019, 02:45 |
|
Скорость построения дерева, Рекурсивные CTE
|
|||
---|---|---|---|
#18+
BowMaster, вся фишка в том, что не рекурсивная часть MyList не материализуется и будет перевыполняться каждый раз при извлечении очередного узла. Поэтому единственный вариант ускорить сей запрос — это ускорить внутренний запрос для MyList. Запрос MyList должен быть максимально упрощён, до такой степени чтобы его хватало для построения дерева, но не более того. Остальные справочные таблицы лучше соединять уже с готовым деревом. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2019, 09:26 |
|
Скорость построения дерева, Рекурсивные CTE
|
|||
---|---|---|---|
#18+
Симонов Денис, можно добиться нужного мне результата без рекурсии? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2019, 10:35 |
|
Скорость построения дерева, Рекурсивные CTE
|
|||
---|---|---|---|
#18+
можно, например, используя интервалы для обозначения принадлежности родителю: http://gsbelarus.com/pw/articles/post/derev-ia-v-sql/ создание и и зменение таких интервалов можно автоматизировать системой тригеров: http://gsbelarus.com/gs/wiki/index.php/Инфраструктура_интервальных_деревьев ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2019, 12:19 |
|
Скорость построения дерева, Рекурсивные CTE
|
|||
---|---|---|---|
#18+
sysdba22, Никто не спрашивал совета, как поменять структуру данных. Ещё проще интервала хранить полный путь в каждом листе 0/1/10/100/1000/10000/100001 Тогда построение дерева - обычная сортировка. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2019, 14:32 |
|
Скорость построения дерева, Рекурсивные CTE
|
|||
---|---|---|---|
#18+
Проблему с перевыполнением в рекурсии MyList решил записью результата MyList во временную таблицу и считыванием в рекурсии уже из этой таблицы. Стало гораздо быстрее, но все равно недостаточно. Проблема вот в чем: когда у себя в программе делаю у запроса FetchAll, это все долго грузит. Проверка в IBExpert показывает тоже самое: после выполнения запроса MyTree вижу результаты, тяну ползунок вниз - fetch(извлечение записей) идёт долго. Решил и результат MyTree тоже записывать в таблицу и уже от туда простым SELECT получать. Это дало ускорение, но возникла другая проблема: узлы в таблицу записываются в неверном порядке. То есть запрос WITH RECURSIVE MyTree(... даёт правильный порядок, стоит поставить впереди INSERT INTO TempTable... и порядок в таблице оказывается неверный. Что можно сделать в этой ситуации? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2019, 16:24 |
|
Скорость построения дерева, Рекурсивные CTE
|
|||
---|---|---|---|
#18+
BowMaster, сомневаюсь. Но даже если это так, то можно сохранить порядок выдачи из дерева. Код: sql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2019, 16:58 |
|
Скорость построения дерева, Рекурсивные CTE
|
|||
---|---|---|---|
#18+
BowMaster, 1 "правильный" порядок в SQL дает только ORDER BY. 2 порядка в общем случае в SQL никакого нет, это теория множеств, у них порядка нет 3 про производительность чего-кого-куда-сколько-почему_медленно - велкам на курс "Оптимизация SQL-запросов СУБД Firebird" http://www.ibase.ru/crs_online/ ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2019, 18:27 |
|
|
start [/forum/topic.php?fid=40&fpage=18&tid=1560496]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
48ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 262ms |
total: | 406ms |
0 / 0 |