|
Рассчет дерева Nested Sets
|
|||
---|---|---|---|
#18+
Добрый вечер! Пытаюсь рассчитать дерево для следующей таблицы: Код: sql 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. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66.
В таблице FIAS$ADDRESSES порядка 25 000 000 записей. Молотит уже 8 часов, по мне так как-то долго. Куда можно посмотреть? Планы запросов везде вроде адекватные. P/S FB Classic 2.5.6 ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2016, 22:48 |
|
Рассчет дерева Nested Sets
|
|||
---|---|---|---|
#18+
а может быть попробовать сделать обычную рекурсивную процедуру ? 19804457 при этом все апдейты точечные, но вот читающие курсоры - нет, они сразу на много записей каждый. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2016, 23:08 |
|
Рассчет дерева Nested Sets
|
|||
---|---|---|---|
#18+
Ariochа может быть попробовать сделать обычную рекурсивную процедуру ? 19804457 при этом все апдейты точечные, но вот читающие курсоры - нет, они сразу на много записей каждый. Такой механизм у меня тоже есть, но он не для всех задач подходит. Для текущей задачи нужен именно Nested Sets. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2016, 23:11 |
|
Рассчет дерева Nested Sets
|
|||
---|---|---|---|
#18+
__Avenger__Молотит уже 8 часов, по мне так как-то долго. Куда можно посмотреть?Полностью не вникал, но... я не вижу каким образом может выполнится условие выхода из цикла. Или все записи посещаются дважды ? Тогда это не оптимально. Если я правильно понял желаемое и алгоритм, то я бы обходил дерево снизу вверх, а не сверху вниз. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2016, 23:34 |
|
Рассчет дерева Nested Sets
|
|||
---|---|---|---|
#18+
hvlad__Avenger__Молотит уже 8 часов, по мне так как-то долго. Куда можно посмотреть?Полностью не вникал, но... я не вижу каким образом может выполнится условие выхода из цикла. Или все записи посещаются дважды ? Тогда это не оптимально. Если я правильно понял желаемое и алгоритм, то я бы обходил дерево снизу вверх, а не сверху вниз. Все верно. На каждую запись обход по два раза. На картинке: Квадратами обозначены узлы дерева, синие цифры в верхнем правом и верхнем левом углах узла - уровень и уникальный идентификатор соответственно, а красные цифры в нижних углах - это левый и правый ключ. Именно в этих двух цифрах - левом и правом ключе заложена вся информация о дереве. Взято тут ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2016, 23:47 |
|
Рассчет дерева Nested Sets
|
|||
---|---|---|---|
#18+
В любом случае 50 000 000 селектов и 50 000 000 обновлений не может идти 10 часов. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2016, 23:49 |
|
Рассчет дерева Nested Sets
|
|||
---|---|---|---|
#18+
А на запросе Код: sql 1. 2. 3. 4. 5. 6.
в разных итерациях план строится заново? Есть у меня одно подозрение. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2016, 00:06 |
|
Рассчет дерева Nested Sets
|
|||
---|---|---|---|
#18+
__Avenger__, план строится для всей процедуры один раз при загрузке её в кеш метаданных. Вопрос - level уже посчитан и заполнен или нет ? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2016, 00:10 |
|
Рассчет дерева Nested Sets
|
|||
---|---|---|---|
#18+
hvlad__Avenger__, план строится для всей процедуры один раз при загрузке её в кеш метаданных. Вопрос - level уже посчитан и заполнен или нет ? Левел в этой таблице это несколько не то, он может в дереве идти 1,3,5,99 для ветки. Так-что нет, не посчитан. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2016, 00:13 |
|
Рассчет дерева Nested Sets
|
|||
---|---|---|---|
#18+
Прописал жесткий план: Код: sql 1.
И глазам своим не верю Executing procedure FIAS$BUILD$08... OK (510635 ms, 8,51058 min) О-о-о-о-о.................... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2016, 00:22 |
|
Рассчет дерева Nested Sets
|
|||
---|---|---|---|
#18+
__Avenger__, я бы с помощью CTE обходил дерево в глубину (у нас рекурсивный CTE иначе и не умеет) и последовательно нумеровал узлы. Есть небольшой нюанс с переходом от листового узла к промежуточному, но это всё решается. Примерно вот так вот Код: sql 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. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2016, 01:22 |
|
Рассчет дерева Nested Sets
|
|||
---|---|---|---|
#18+
hvlad__Avenger__, я бы с помощью CTE обходил дерево в глубину (у нас рекурсивный CTE иначе и не умеет) и последовательно нумеровал узлы. Есть небольшой нюанс с переходом от листового узла к промежуточному, но это всё решается. Я думаю нижний блок должен быть таким: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2016, 10:55 |
|
Рассчет дерева Nested Sets
|
|||
---|---|---|---|
#18+
__Avenger__Я думаю нижний блок должен быть такимКоторый за циклом ? Да, похоже на то. Не пробовал на своих данных ? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2016, 12:07 |
|
Рассчет дерева Nested Sets
|
|||
---|---|---|---|
#18+
hvlad__Avenger__Я думаю нижний блок должен быть такимКоторый за циклом ? Да, похоже на то. Не пробовал на своих данных ? Сейчас пробую, там много пока других расчетов идет. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2016, 12:35 |
|
Рассчет дерева Nested Sets
|
|||
---|---|---|---|
#18+
Executing procedure FIAS$BUILD$08... OK (177335 ms, 2,95558 min) Примерно 3-и минуты. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2016, 14:02 |
|
Рассчет дерева Nested Sets
|
|||
---|---|---|---|
#18+
Ну, вроде неплохо :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2016, 17:09 |
|
Рассчет дерева Nested Sets
|
|||
---|---|---|---|
#18+
hvlad, Спасибо. Все отлично работает, и более рационально. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2016, 23:20 |
|
Рассчет дерева Nested Sets
|
|||
---|---|---|---|
#18+
__Avenger__, не вижу великого смысла в использовании подобной реализацию с ключами. Ради чего парится с перенумерацией и перепривязкой узлов к ключам порядка при вставке узлов дерева? Ради быстрого получения дочерних узлов вне зависимости от глубины дерева? Если глубина дерева не фантастическая, вполне можно обойтись набором полей id, node_id и seq (порядок элемента в узле), тогда обход дерева прекрасно вырождается в "обход лабиринта по правой стенке" с использованием итерации и не надо городить огород с перепривязкой порядка узлов к ключам порядка. Всё становится гораздо проще и умещается в одну таблицу. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2016, 10:28 |
|
Рассчет дерева Nested Sets
|
|||
---|---|---|---|
#18+
rdb_dev__Avenger__, не вижу великого смысла в использовании подобной реализацию с ключами. Ради чего парится с перенумерацией и перепривязкой узлов к ключам порядка при вставке узлов дерева? Ради быстрого получения дочерних узлов вне зависимости от глубины дерева? Если глубина дерева не фантастическая, вполне можно обойтись набором полей id, node_id и seq (порядок элемента в узле), тогда обход дерева прекрасно вырождается в "обход лабиринта по правой стенке" с использованием итерации и не надо городить огород с перепривязкой порядка узлов к ключам порядка. Всё становится гораздо проще и умещается в одну таблицу. Мне не нужен обход дерева, мне нужен быстрый поиск в дереве. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2016, 12:52 |
|
Рассчет дерева Nested Sets
|
|||
---|---|---|---|
#18+
__Avenger__, поиск чего? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2016, 12:56 |
|
Рассчет дерева Nested Sets
|
|||
---|---|---|---|
#18+
__Avenger__Такой механизм у меня тоже есть, но он не для всех задач подходит. Для текущей задачи нужен именно Nested Sets. По ссылке и есть NEsted Sets - процедура, которая расставляет L- и R-скобки для всех элементов ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2016, 13:00 |
|
|
start [/forum/topic.php?fid=40&fpage=50&tid=1561797]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
29ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 139ms |
0 / 0 |