В этой статье рассмотрим как с помощью ТЦ можно убедится в том, что внесенные нами изменения положительно повлияли на производительность системы, а не наоборот.
Итак, немножко усложним наш предыдущий тест.
В базе всего 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 |

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