Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
НожФрауМюллер
Guest |
есть таблица в которой хранится дерево в виде: [id pk, id_parent fk, p, l], где id, id_parent тут все понятно, p - путь от корня до вершины id (чтобы выделять поддеревья по like...), l уровень вложенности вершины id. В дереве не много элементов не думаю даже в перспективе будет больше 100. Сейчас можно встретить максимум 32. Нужно: обходить дерево сверху вниз по ярусам. И сравнивать коэффициенты приписанные потомкам с коэффициентами соответствующего предка и считать всякие штуки...
очень много чтений :( Table '#tree__00000000000A'. Scan count 32, logical reads 64, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table 'Worktable'. Scan count 2, logical reads 131, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Все бы ничего, но метод вызывается часто (вышележащая логика). 855 вызовов в 15 секунд. Он использует рекурсию, много чтений. можно ли уменьшить чтений? Нельзя ли как-то на основе колонки p сделать нерекурсивный обход сверху вниз - в голову запрос из #tree с сортировкой по p + '/' + cast(id as varchar(100)). И идем нот первой к последней, но надо делать некий аналог стека :( |
|
20 дек 13, 20:51 [15325719] Ответить | Цитировать Сообщить модератору |
Crimean Member Откуда: Сообщений: 13147 |
а меняется это дерево часто? если нет - может посмотреть в сторону хранения всей иерархии сбоку? |
20 дек 13, 22:27 [15326070] Ответить | Цитировать Сообщить модератору |
НожФрауМюллер
Guest |
Crimean, структура дерева меняется раз в "тысячелетие". но информационная нагрузка вершин часто. можете еще пару слов сказать по поводу как хранить слева все дерево. не соображу. пока что смотрю в сторону такого вот выкрутаса: set statistics io on; declare @n varchar(max) = ''; select @n += '@' + p from #tree order by p-- + iif(p = '/', '', '/') + cast(id as varchar(100)) print @n set statistics io off; этот "цикл" посещает ярусы правильно. по крайней мере с этим можно что-то делать и привлекает количество чтений. нужно только какой-то массив в котором будет "стек", чтобы восстанавливать коэффициенты парентов... :( как бы его замутить. Table '#tree___00000000000A'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. т. е. цикл пробегается сверху вниз по вот такому дереву. вершины отсортированы по p:
при пробежке по строкам при увеличении l запихиваем в "стек" коэффициенты парента, или вытаскиваем из стека при уменьшении l. может стеком сделать строковую переменную :(. также известно что уровень вложенности не вырастет больше 25. может впилить 25 переменных. кто что думает? |
|||||||||||||||||||||||||||||||||
21 дек 13, 08:52 [15326943] Ответить | Цитировать Сообщить модератору |
Mnior Member Откуда: Кишинёв Сообщений: 6723 |
HierarchyID |
23 дек 13, 03:17 [15331694] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |