среда, 5 августа 2015 г.

Простой пример оптимизации производительности с помощью тест-центра.

В этой статье рассмотрим как с помощью ТЦ можно убедится в том, что внесенные нами изменения положительно повлияли на производительность системы, а не наоборот.
Итак, немножко усложним наш предыдущий тест.
В базе всего 1 документ типа "Приходная накладная" и 1 документ типа "Расходная накладная". Сделаем такой сценарий. 2 пользователя одновременно будут создавать и проводить по 10 документов каждого вида.
Создадим новую обработку путем копирования обработки из предыдущего теста и внесем изменения:
Добавим реквизит "ДокРасход" и изменим функцию "ТЦВыполнить".


В режиме предприятия как и в предыдущем  добавляем новую обработку, добавляем роль, заполняем реквизиты в настройках роли и добавляем новый тест.
Запускаем на выполнение созданный сценарий.
Получились следующие результаты:
ВремяПрихода 367,000
1 352,000
2 382,000
ВремяПроведенияПрихода 36,700
1 41,000
2 28,000
3 45,000
4 42,000
5 28,000
6 29,000
7 47,000
8 30,000
9 32,000
10 30,000
11 45,000
12 54,000
13 45,000
14 42,000
15 28,000
16 30,000
17 46,000
18 28,000
19 34,000
20 30,000
ВремяПроведенияРасхода 208,300
1 240,000
2 193,000
3 190,000
4 199,000
5 203,000
6 190,000
7 192,000
8 201,000
9 226,000
10 175,000
11 360,000
12 158,000
13 186,000
14 192,000
15 211,000
16 182,000
17 178,000
18 171,000
19 327,000
20 192,000
ВремяРасхода 2 083,000
1 2 009,000
2 2 157,000

Из результатов тестирования  видно что время проведения расходных накладных заметно больше времени проведения приходных.

Попробуем оптимизировать запрос РН, с целью сократить время проведения.
Запрос имеет вид:

Запрос.Текст ="ВЫБРАТЬ
             | РасходнаяНакладнаяТовары.Номенклатура,
             | СУММА(РасходнаяНакладнаяТовары.Количество) КАК ТребуетсяСписать,
             | МАКСИМУМ(РасходнаяНакладнаяТовары.Цена) КАК Цена,
             | СУММА(РасходнаяНакладнаяТовары.Сумма) КАК Сумма
             |ПОМЕСТИТЬ ДокТЧ
             |ИЗ
             | Документ.РасходнаяНакладная.Товары КАК РасходнаяНакладнаяТовары
             |ГДЕ
             | РасходнаяНакладнаяТовары.Ссылка = &Ссылка
             |
             |СГРУППИРОВАТЬ ПО
             | РасходнаяНакладнаяТовары.Номенклатура
             |;
             |
             |////////////////////////////////////////////////////////////////////////////////
             |ВЫБРАТЬ
             | ДокТЧ.Номенклатура КАК Номенклатура,
             | ДокТЧ.ТребуетсяСписать КАК ТребуетсяСписать,
             | ЕСТЬNULL(ПродукцияОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
             | ПродукцияОстатки.ДокументПартии,
             | ПродукцияОстатки.Склад,
             | ПродукцияОстатки.ДокументПартии.Дата КАК ДокументПартииДата,
             | ДокТЧ.Цена КАК Цена
             |ИЗ
             | ДокТЧ КАК ДокТЧ
             | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продукция.Остатки(
             | &Период,
             | Номенклатура В
             | (ВЫБРАТЬ
             | ДокТЧ.Номенклатура
             | ИЗ
             | ДокТЧ)
             | И Склад = &Склад) КАК ПродукцияОстатки
             | ПО ДокТЧ.Номенклатура = ПродукцияОстатки.Номенклатура
             |
             |УПОРЯДОЧИТЬ ПО
             | ДокументПартииДата
             |ИТОГИ
             | МАКСИМУМ(ТребуетсяСписать),
             | СУММА(КоличествоОстаток),
             | МАКСИМУМ(Цена)
             |ПО
             | Номенклатура";

В первом пакете создается временная таблица, которая во втором пакете соединяется с виртуальной таблицей остатков по полю Номенклатура.
И первое что бросается в глаза это то что поле Номенклатура не проиндексировано, Исправим это. также мне не понравились пару моментов не влияющих заметно на производительность и после изменения запрос принял вид.

Запрос.Текст ="ВЫБРАТЬ | РасходнаяНакладнаяТовары.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяТовары.Количество) КАК ТребуетсяСписать, | МАКСИМУМ(РасходнаяНакладнаяТовары.Цена) КАК Цена |ПОМЕСТИТЬ ДокТЧ |ИЗ | Документ.РасходнаяНакладная.Товары КАК РасходнаяНакладнаяТовары |ГДЕ | РасходнаяНакладнаяТовары.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяТовары.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ДокТЧ.Номенклатура КАК Номенклатура, | ДокТЧ.ТребуетсяСписать КАК ТребуетсяСписать, | ПродукцияОстатки.ДокументПартии, | ПродукцияОстатки.Склад, | ДокТЧ.Цена КАК Цена, | ЕСТЬNULL(ПродукцияОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток |ИЗ | ДокТЧ КАК ДокТЧ | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продукция.Остатки( | , | Номенклатура В | (ВЫБРАТЬ | ДокТЧ.Номенклатура | ИЗ | ДокТЧ) | И Склад = &Склад) КАК ПродукцияОстатки | ПО ДокТЧ.Номенклатура = ПродукцияОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | ПродукцияОстатки.ДокументПартии.МоментВремени |ИТОГИ | МАКСИМУМ(ТребуетсяСписать), | МАКСИМУМ(Цена), | СУММА(КоличествоОстаток) |ПО | Номенклатура";

Запустим тест еще раз и сравним результаты.
Получились они следующие:

Показатель Значение
ВремяПрихода 399,500
1 382,000
2 417,000
ВремяПроведенияПрихода 39,950
1 20,000
2 24,000
3 55,000
4 51,000
5 27,000
6 31,000
7 41,000
8 36,000
9 38,000
10 59,000
11 38,000
12 41,000
13 54,000
14 52,000
15 27,000
16 32,000
17 39,000
18 35,000
19 40,000
20 59,000
ВремяПроведенияРасхода 156,550
1 166,000
2 148,000
3 140,000
4 214,000
5 151,000
6 124,000
7 142,000
8 136,000
9 175,000
10 157,000
11 165,000
12 148,000
13 140,000
14 189,000
15 145,000
16 139,000
17 143,000
18 135,000
19 223,000
20 151,000
ВремяРасхода 1 565,500
1 1 553,000
2 1 578,000


Таким образом мы убедились, что общее время проведения расходов уменьшилось с 2 секунд для каждого пользователя до 1,5 секунд. В процентом выражении это примерно 25%, что довольно серьезно.


Комментариев нет:

Отправить комментарий