|
|
|
А вернемся к иерархиям
|
|||
|---|---|---|---|
|
#18+
Есть у меня база, основные данные это директории файловой системы с их отношениями скажем: CREATE TABLE Dirs (ID int, ParentID int) директорий может быть много. Часто нужно искать всех детей или всех родителей данной директории. И такой поиск является самым критичным запросом. У меня уже реализована денормализация в виде вспомогательной таблицы, где я храню всех родителей для каждой директории. Таблица довольно тяжелая. Так как в среднем количество записей там растет как N*Log(N) где N количество директорий. Сейчас решил попробовать реализовать "стек", как описано у Джое Селко. Экономия существенная так как хранить нужно для каждой директории всего два параметра (leftBound, rightBound), то есть 2*N НО работает значительно медленнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2008, 12:10 |
|
||
|
А вернемся к иерархиям
|
|||
|---|---|---|---|
|
#18+
я скорость не сравнивал, но у меня работает очень шустро на нескольких тысячах записей (мелковато, конечно), реализацию брал здесь , правда в логике без бутылки не разберёшься, но с бутылкой (и с описанием, где-то там же лежит) - разберёшься :) непонимаю, где ты взял там выигрыш по памяти (4 инта вместо 2х + доп.2 индекса), там как раз скорость поиска всех детей должна увеличиться у меня чуть структура другая только, типа так: create table T_TREE (id int not null auto_increment, left_key int not null, right_key int not null, level int not null, primary key (id) )type = InnoDB; create unique index left_idx on T_TREE(left_key); create unique index right_idx on T_TREE(right_key); create index level_idx on T_TREE(level); возможно, ты что-то недоговариваешь... --------------------------------------- Не шалю, никого не трогаю, починяю примус (С) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 14:10 |
|
||
|
А вернемся к иерархиям
|
|||
|---|---|---|---|
|
#18+
если у вас оракл - не надо ничего нигде хранить попробуйте использовать конструкцию : connect by prior почитать можно здесь : http://www.adp-gmbh.ch/ora/sql/connect_by.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 17:15 |
|
||
|
А вернемся к иерархиям
|
|||
|---|---|---|---|
|
#18+
krazanaесли у вас оракл - не надо ничего нигде хранить попробуйте использовать конструкцию : connect by prior почитать можно здесь : http://www.adp-gmbh.ch/ora/sql/connect_by.htmlЕсли MSSQL, то можно тоже использовать рекурсивные запросы. Но это медленнее. Если у вас запрос - выдать товары от заданнного места в дереве товарного справочника и ниже, а выше не должна быть выключена ни одна группа, и для пользователя в "деревянном" справочнике ценовых скидок нужно применить скидки как сумму вниз по дереву... Селко будет быстрее. Вообще любые операции над множествами в ядре СУБД делаются быстрее, чем рекурсиво-процедурные циклы, хотя-бы они кратко и маскировались под connect by prior в оракле или with в MSSQL :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 17:37 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=35256203&tid=1543924]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
36ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
28ms |
get tp. blocked users: |
1ms |
| others: | 216ms |
| total: | 310ms |

| 0 / 0 |
