Предложение(кщк одно) по улучшению УложитьОбъекты (MS SQL)
Предисловие : Когда рассматривал
ветку
http://www.1cpp.ru/forum/YaBB.pl?num=1276751920 то изучил как сейчас 1с++ укладывает
списокобектов во временную таблицу.
Возникла идея улучшить этот алгоримт.
Как работает алгоритм сейчас для каждой исходной папки находим все элементы и папки
и для всех найденых подпапок продолжаем поиск.
Поиск останавливаем когда ничего нового не добавили.
Легче обяснить на примере
Предположим есть дерево
1 уровень 1
1.1 уровень 2
1.1.1 уровень 3
1.1.1.1 уровень 4
1.1.1.1. элементы от 1 до 200 на 5 уровне.
В список для УложитьЗначения попали две папки
1.1 и 1.1.1
Тогда алгоритм поиска тот что сейчас работает так
шаг 0 в список папок добавили 1.1 и 1.1.1
шаг 1 в список папок добавили 1.1.1 и 1.1.1.1
шаг 2 в список папок добавили 1.1.1.1 и все листья
шаг 3 в список папок все листья пытаемся добавить еще раз.
Новый алгоритм запоминает все пройденые папки и не добавляет их для дальнейшего анализа
т.е алгоритм будет такой
шаг 0 в список папок добавили 1.1 и 1.1.1
шаг 1 в список папок добавили (пусто) 1.1.1.1
шаг 2 в список папок добавили все листья
На первом шаге от первого элемента 1.1 мы ничего не добавляем потому что папку 1.1.1 мы уже обработали.
Т.е старый алгоритм для каждой исходной папки строит полное дерево вниз.
Новый алгоритм для каждой исходной папки строит дерево вниз не включая уже построенные поддеревья.
преимущесва
1. Т.е новый алгоритм выполняет меньше число шагов ( в предельном случае столько же шагов ).
2. Каждый лист ( а их много ) находим в новом алгоритме только один раз , а в старом
алготитме находим каждый лист сколько было вложенных поддеревьев и столько же раз пытаемся
его добавить в рез дерево.
2. В старом алгоритме удаление из промежуточной таблице происходит в конце каждого шага
в новом алгоритме удаление из промежуточной таблицы происходит только один раз - когда поиск завершен.
(т.е. пункт дает выигрыш по числу удалений и в предельном случае когда нет пересечения деревьев)
Также можно дополнить новый алгоритм что в результирующую папку будут помещаться только Группы ( для некоторых
задач и данных это плюс ) потому что как правило количество групп значительно меньше количества элементов
в справочнике и дальнейший поиск по такому списку будет значительно лучше.
Что уже сделано
1.Придуман этот subj
1.Сделано две хранимые процедуры ( t-sql )
одна работает по старому алгоритму
вторая по новому.
2.Прогнал xp на тестах по большому справочнику.Результаты работы обоих процедур совпадают.
Даже визуально новый алгоритм быстрее ( ну может быть меня глючит и я выдаю желаемое за действительное ).
что предлагается сделать.
Обсудить subj ( только не безмолствуйте) И если сочтете нужным то реализовь это в 1cpp.
проверить правильность алгоритма и уже написанных xp.
Добавить 3.2.2. новый алгоритм т.е. начиная с какой-то версии в 3.2.2 будет реализован
и новый и старый алгоритм.
По умолчанию можно оставить даже старый алгоритм для обратной совместимости.
Отладить новый алгоритм внутри 1срр.
Для нового алгоритма сделать три режима итоговой временной таблицы
1.во временную таблицу помещаем только элементы
2.во временную таблицу помещаем только Группы
3.во временную таблицу помещаем и Группы и элементы (правда не знаю зачем но думаю задачи под это найдутся)
Если очень кратко то в итоге получим :
1.новый алгоритм быстрее
2.реализация нового алгоритма дает меньшую нагрузку на sql сервер
3.новый алгоритм будет гибче т.к. в нем будет больше режимов итоговой таблицы чем сейчас