Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Предложение(еще одно) по улучшению УложитьСписокЗначений (MS SQL) (число прочтений - 2985 )
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Предложение(еще одно) по улучшению УложитьСписокЗначений (MS SQL)
30. Августа 2010 :: 16:13
Печать  
Предложение(кщк одно) по улучшению УложитьОбъекты (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.новый алгоритм будет гибче т.к. в нем будет больше режимов итоговой таблицы чем сейчас
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Предложение(еще одно) по улучшению УложитьСписокЗначений (MS SQL)
Ответ #1 - 30. Августа 2010 :: 17:12
Печать  
предположение
Цитата:
Даже визуально новый алгоритм быстрее ( ну может быть меня глючит и я выдаю желаемое за действительное ).

легким движением пера правращается в факт
Цитата:
1.новый алгоритм быстрее


тоже научить замеры делать Улыбка
  

1&&2&&3
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Предложение(еще одно) по улучшению УложитьСписокЗначений (MS SQL)
Ответ #2 - 31. Августа 2010 :: 15:40
Печать  
Всего в справочнике строк 138554
Количество папок 459
(кстати вот оно преимущество если получать как результат только папки
естественно если это подходит под задачу )



Тест № 1 взял три папки одна с подпапкой
то есть алгоритры строят одинаковые дерьвья потому что в исходных данных
нет вложеной папки содержащейся в пред. уровнях
всего конечных элементов получается 847

тест 1.1 после каждого теста делал очисту sql буфера
Стандарт. вариант Время(мс) = 1541
Стандарт. вариант Время(мс) = 2120
Стандарт. вариант Время(мс) = 1756

Нов. вариант Время(мс) = 1144
Нов. вариант Время(мс) = 1214
Нов. вариант Время(мс) = 1341

тест 1.2 после каждого теста делал очисту sql буфера
данные теже делал очистку буфера перед первой серии  по старой процедуре
и делал очистку буфера перед первой серии  по новой процедуре

Стандарт. вариант Время(мс) = 1872
Стандарт. вариант Время(мс) = 260
Стандарт. вариант Время(мс) = 213

Нов. вариант Время(мс) = 1226
Нов. вариант Время(мс) = 205
Нов. вариант Время(мс) = 207


Тест № 2 Папка первого уровня и две папки потомка
всего конечных элементов получается 693

тест 2.1 после каждого теста делал очисту sql буфера

Стандарт. вариант Время(мс) = 2931
Стандарт. вариант Время(мс) = 1959
Стандарт. вариант Время(мс) = 2168

Нов. вариант Время(мс) = 1004
Нов. вариант Время(мс) = 986
Нов. вариант Время(мс) = 1057



тест 2.2 после каждого теста делал очисту sql буфера
данные теже делал очистку буфера перед первой серии  по старой процедуре
и делал очистку буфера перед первой серии  по новой процедуре


Стандарт. вариант Время(мс) = 4936
Стандарт. вариант Время(мс) = 170
Стандарт. вариант Время(мс) = 170

Нов. вариант Время(мс) = 1642
Нов. вариант Время(мс) = 179
Нов. вариант Время(мс) = 179

Тест № 3 КрешТест
В список включены все папки первого и второго уровня справочника
на первом уровне оказалось элементов = 97
на первом и втором уровне включили в справочник поиска  =  382
всего конечных элементов получается 138081

тест 3.1 после каждого теста делал очисту sql буфера

Креш Стандарт. вариант Время(мс) = 34339
Креш Стандарт. вариант Время(мс) = 30207
Креш Стандарт. вариант Время(мс) = 29662


Креш Нов. вариант Время(мс) = 36764
Креш Нов. вариант Время(мс) = 37170
Креш Нов. вариант Время(мс) = 37543

тест 3.2 после каждого теста делал очисту sql буфера
данные теже делал очистку буфера перед первой серии  по старой процедуре
и делал очистку буфера перед первой серии  по новой процедуре

Креш Стандарт. вариант Время(мс) = 30457
Креш Стандарт. вариант Время(мс) = 8563
Креш Стандарт. вариант Время(мс) = 8578



Креш Нов. вариант Время(мс) = 39313
Креш Нов. вариант Время(мс) = 8032
Креш Нов. вариант Время(мс) = 7636
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Предложение(еще одно) по улучшению УложитьСписокЗначений (MS SQL)
Ответ #3 - 31. Августа 2010 :: 17:05
Печать  
если не сложно проведи еще такой тест:
Уложить одну группу в которой 20 подгрупп в каждой подгруппе по 20 элементов
  

1&&2&&3
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Предложение(еще одно) по улучшению УложитьСписокЗначений (MS SQL)
Ответ #4 - 01. Сентября 2010 :: 14:46
Печать  
Тест trad
В список помещена папка.
Эта папка имеет 20 подпапок и в каждой по 20 элементов.


вариант 1 улучшеный тот что был вчера
Сегодня с учетом теста trad сделал еще две  модификации
это Вариант4 и Вариант5
модификации созданы потому что test trad для Варианта 1 давал плохие результаты.


тест 4.1 после каждого теста делал очисту sql буфера
Стандарт. вариант Время(мс) = 621
Стандарт. вариант Время(мс) = 569
Стандарт. вариант Время(мс) = 524

Вариант 1
Нов. вариант Время(мс) = 1574
Нов. вариант Время(мс) = 1218
Нов. вариант Время(мс) = 1377



Вариант 4
Нов. вариант Время(мс) = 546
Нов. вариант Время(мс) = 548
Нов. вариант Время(мс) = 536

Вариант 5
Нов. вариант Время(мс) = 575
Нов. вариант Время(мс) = 543
Нов. вариант Время(мс) = 577


тест 4.2 В начале серии  теста делал очисту sql буфера

Стандарт. вариант Время(мс) = 520
Стандарт. вариант Время(мс) = 92
Стандарт. вариант Время(мс) = 92

Вариант 1
Нов. вариант Время(мс) = 1497
Нов. вариант Время(мс) = 1087
Нов. вариант Время(мс) = 1085

Вариант 4
Нов. вариант Время(мс) = 482
Нов. вариант Время(мс) = 125
Нов. вариант Время(мс) = 125

Вариант 5
Нов. вариант Время(мс) = 505
Нов. вариант Время(мс) = 116
Нов. вариант Время(мс) = 115

  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Предложение(еще одно) по улучшению УложитьСписокЗначений (MS SQL)
Ответ #5 - 01. Сентября 2010 :: 14:56
Печать  
Тест № 1 взял три папки одна с подпапкой
то есть алгоритры строят одинаковые дерьвья потому что в исходных данных
нет вложеной папки содержащейся в пред. уровнях
всего конечных элементов получается 847

тест 1.1 после каждого теста делал очисту sql буфера
Стандарт. вариант Время(мс) = 1576
Стандарт. вариант Время(мс) = 1359
Стандарт. вариант Время(мс) = 1826

Вариант 1
Нов. вариант Время(мс) = 1036
Нов. вариант Время(мс) = 1209
Нов. вариант Время(мс) = 1094

Вариант 4
Нов. вариант Время(мс) = 1113
Нов. вариант Время(мс) = 1072
Нов. вариант Время(мс) = 1143


Вариант 5
Нов. вариант Время(мс) = 1119
Нов. вариант Время(мс) = 1142
Нов. вариант Время(мс) = 1184


тест 1.2 В начале серии  теста делал очисту sql буфера
Стандарт. вариант Время(мс) = 1389
Стандарт. вариант Время(мс) = 302
Стандарт. вариант Время(мс) = 253


Вариант 1
Нов. вариант Время(мс) = 1028
Нов. вариант Время(мс) = 209
Нов. вариант Время(мс) = 212


Вариант 4
Нов. вариант Время(мс) = 1033
Нов. вариант Время(мс) = 202
Нов. вариант Время(мс) = 201


Вариант 5
Нов. вариант Время(мс) = 1050
Нов. вариант Время(мс) = 198
Нов. вариант Время(мс) = 197
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Предложение(еще одно) по улучшению УложитьСписокЗначений (MS SQL)
Ответ #6 - 01. Сентября 2010 :: 15:11
Печать  
Тест № 2 Папка первого уровня и две папки потомка
всего конечных элементов получается 693

тест 2.1 после каждого теста делал очисту sql буфера
Стандарт. вариант Время(мс) = 1633
Стандарт. вариант Время(мс) = 1922
Стандарт. вариант Время(мс) = 1716

Вариант 1
Нов. вариант Время(мс) = 1002
Нов. вариант Время(мс) = 1021
Нов. вариант Время(мс) = 967

Вариант 4
Нов. вариант Время(мс) = 899
Нов. вариант Время(мс) = 1050
Нов. вариант Время(мс) = 997


Вариант 5
Нов. вариант Время(мс) = 1349
Нов. вариант Время(мс) = 1261
Нов. вариант Время(мс) = 1367


тест 2.2 в начале серии  теста делал очисту sql буфера
Стандарт. вариант Время(мс) = 1197
Стандарт. вариант Время(мс) = 179
Стандарт. вариант Время(мс) = 178

Вариант 1
Нов. вариант Время(мс) = 941
Нов. вариант Время(мс) = 156
Нов. вариант Время(мс) = 183

Вариант 4
Нов. вариант Время(мс) = 1001
Нов. вариант Время(мс) = 168
Нов. вариант Время(мс) = 167


Вариант 5
Нов. вариант Время(мс) = 1289
Нов. вариант Время(мс) = 169
Нов. вариант Время(мс) = 169
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Предложение(еще одно) по улучшению УложитьСписокЗначений (MS SQL)
Ответ #7 - 01. Сентября 2010 :: 15:48
Печать  
Тест № 3 КрешТест
В список включены все папки первого и второго уровня справочника
по сравнению со вчера добавлено было 21 папки
Всег строк = 138081

тест 3.1 после каждого теста делал очисту sql буфера


Креш Стандарт. вариант Время(мс) = 29086
Креш Стандарт. вариант Время(мс) = 29992
Креш Стандарт. вариант Время(мс) = 30209


Вариант 1
Креш Нов. вариант Время(мс) = 36965
Креш Нов. вариант Время(мс) = 38115
Креш Нов. вариант Время(мс) = 38061

Вариант 4
Креш Нов. вариант Время(мс) = 38154
Креш Нов. вариант Время(мс) = 37446
Креш Нов. вариант Время(мс) = 38325


Вариант 5
Креш Нов. вариант Время(мс) = 28565
Креш Нов. вариант Время(мс) = 29854
Креш Нов. вариант Время(мс) = 29292


тест 3.2 в начале серии  теста делал очисту sql буфера
Креш Стандарт. вариант Время(мс) = 28613
Креш Стандарт. вариант Время(мс) = 8667
Креш Стандарт. вариант Время(мс) = 8643

Вариант 1
Креш Нов. вариант Время(мс) = 39480
Креш Нов. вариант Время(мс) = 8634
Креш Нов. вариант Время(мс) = 8158


Вариант 4
Креш Нов. вариант Время(мс) = 39903
Креш Нов. вариант Время(мс) = 7825
Креш Нов. вариант Время(мс) = 7962


Вариант 5
Креш Нов. вариант Время(мс) = 29111
Креш Нов. вариант Время(мс) = 7823
Креш Нов. вариант Время(мс) = 7770
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Предложение(еще одно) по улучшению УложитьСписокЗначений (MS SQL)
Ответ #8 - 03. Сентября 2010 :: 04:53
Печать  
Надеялся что последуют какие-нибудь общие выводы Нерешительный

Т.к. на интересуемом меня тесте новые варианты не показали выдающихся результатов, на краш-тесте тоже, а остальные постановки меня не интересуют, делаю вывод для себя: тема мне не интересна.
  

1&&2&&3
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Предложение(еще одно) по улучшению УложитьСписокЗначений (MS SQL)
Ответ #9 - 03. Сентября 2010 :: 08:48
Печать  
Могу выложить внешнюю обработку ( будет работать в любой конфигурации.
Задача получения списка решена 10 способами отличными от первоначального).

Один точный вывод :
для MS SQL EXISTS работает в большинстве случаев гораздо лучше чем IN
(NOT EXISTS - аналогично ). Ну это и так извесно из книжек.

Непонятно как вообще делать замеры.
я мерял что выполнение хранимой процедуры в самой 1с.
     т1 = _GetPerformanceCounter();            
     Запрос.ВыполнитьСкалярный("EXEC dbo.add_tree_new ");
     т2 = _GetPerformanceCounter();            


Один и тот же способ дает разные результаты  даже при нажатии через 2-3 сек.
получается что результат вычисления зависит несильно от алгоритмов
а скорее от общей загруженности sql сервера ( да оно и становиться понятно на 10 итерациях
алгоритмы что лучше(теоретически) не успевают раскачаться + sql генерит хорошие планы для разных запросов
невилируя огрехи кода программиста)
И это на моем огромном справочнике. на малых справочниках расходжения будут еще меньше.

Как выбрать из этих методов дающий наименьшую нагрузку на sql сервер я не  знаю.


subj можно  трансформировать к пожеланию оставлять в результирующем списке
только Группы т.е. сделать три режима ( только элементы(как сейчас),только группы, и элементы и группы)
реализовать это пожелание несложно. Сложно придумать как выставлять этот режим.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Предложение(еще одно) по улучшению УложитьСписокЗначений (MS SQL)
Ответ #10 - 06. Сентября 2010 :: 16:49
Печать  
Тест trad
В список помещена папка.
Эта папка имеет 20 подпапок и в каждой по 20 элементов.
Ошибка была в том что надо делать замеры на  сервере (с помощью Profile)
Замеры с точки зрения сервера
Сравнивается
1. ПредВариант стандартный списокзначений
2. СамыйЛучшийИзНаписанных ( в пред тестах его не было )


Вариант         CPU     Read  Write    Duration
ПредВариант    16     3464        1             16
МойВариант      15     2248        0             15
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать