В этой статье рассмотрим как с помощью ТЦ можно убедится в том, что внесенные нами изменения положительно повлияли на производительность системы, а не наоборот.
Итак, немножко усложним наш предыдущий тест.
В базе всего 1 документ типа "Приходная накладная" и 1 документ типа "Расходная накладная". Сделаем такой сценарий. 2 пользователя одновременно будут создавать и проводить по 10 документов каждого вида.
Создадим новую обработку путем копирования обработки из предыдущего теста и внесем изменения:
Добавим реквизит "ДокРасход" и изменим функцию "ТЦВыполнить".
В режиме предприятия как и в предыдущем добавляем новую обработку, добавляем роль, заполняем реквизиты в настройках роли и добавляем новый тест.
Запускаем на выполнение созданный сценарий.
Получились следующие результаты:
Из результатов тестирования видно что время проведения расходных накладных заметно больше времени проведения приходных.
Попробуем оптимизировать запрос РН, с целью сократить время проведения.
Запрос имеет вид:
Запрос.Текст ="ВЫБРАТЬ
| РасходнаяНакладнаяТовары.Номенклатура,
| СУММА(РасходнаяНакладнаяТовары.Количество) КАК ТребуетсяСписать,
| МАКСИМУМ(РасходнаяНакладнаяТовары.Цена) КАК Цена,
| СУММА(РасходнаяНакладнаяТовары.Сумма) КАК Сумма
|ПОМЕСТИТЬ ДокТЧ
|ИЗ
| Документ.РасходнаяНакладная.Товары КАК РасходнаяНакладнаяТовары
|ГДЕ
| РасходнаяНакладнаяТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РасходнаяНакладнаяТовары.Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ДокТЧ.Номенклатура КАК Номенклатура,
| ДокТЧ.ТребуетсяСписать КАК ТребуетсяСписать,
| ЕСТЬNULL(ПродукцияОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
| ПродукцияОстатки.ДокументПартии,
| ПродукцияОстатки.Склад,
| ПродукцияОстатки.ДокументПартии.Дата КАК ДокументПартииДата,
| ДокТЧ.Цена КАК Цена
|ИЗ
| ДокТЧ КАК ДокТЧ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продукция.Остатки(
| &Период,
| Номенклатура В
| (ВЫБРАТЬ
| ДокТЧ.Номенклатура
| ИЗ
| ДокТЧ)
| И Склад = &Склад) КАК ПродукцияОстатки
| ПО ДокТЧ.Номенклатура = ПродукцияОстатки.Номенклатура
|
|УПОРЯДОЧИТЬ ПО
| ДокументПартииДата
|ИТОГИ
| МАКСИМУМ(ТребуетсяСписать),
| СУММА(КоличествоОстаток),
| МАКСИМУМ(Цена)
|ПО
| Номенклатура";
В первом пакете создается временная таблица, которая во втором пакете соединяется с виртуальной таблицей остатков по полю Номенклатура.
И первое что бросается в глаза это то что поле Номенклатура не проиндексировано, Исправим это. также мне не понравились пару моментов не влияющих заметно на производительность и после изменения запрос принял вид.
Запрос.Текст ="ВЫБРАТЬ | РасходнаяНакладнаяТовары.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяТовары.Количество) КАК ТребуетсяСписать, | МАКСИМУМ(РасходнаяНакладнаяТовары.Цена) КАК Цена |ПОМЕСТИТЬ ДокТЧ |ИЗ | Документ.РасходнаяНакладная.Товары КАК РасходнаяНакладнаяТовары |ГДЕ | РасходнаяНакладнаяТовары.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяТовары.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ДокТЧ.Номенклатура КАК Номенклатура, | ДокТЧ.ТребуетсяСписать КАК ТребуетсяСписать, | ПродукцияОстатки.ДокументПартии, | ПродукцияОстатки.Склад, | ДокТЧ.Цена КАК Цена, | ЕСТЬNULL(ПродукцияОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток |ИЗ | ДокТЧ КАК ДокТЧ | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продукция.Остатки( | , | Номенклатура В | (ВЫБРАТЬ | ДокТЧ.Номенклатура | ИЗ | ДокТЧ) | И Склад = &Склад) КАК ПродукцияОстатки | ПО ДокТЧ.Номенклатура = ПродукцияОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | ПродукцияОстатки.ДокументПартии.МоментВремени |ИТОГИ | МАКСИМУМ(ТребуетсяСписать), | МАКСИМУМ(Цена), | СУММА(КоличествоОстаток) |ПО | Номенклатура";
Таким образом мы убедились, что общее время проведения расходов уменьшилось с 2 секунд для каждого пользователя до 1,5 секунд. В процентом выражении это примерно 25%, что довольно серьезно.
Итак, немножко усложним наш предыдущий тест.
В базе всего 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 |
Комментариев нет:
Отправить комментарий