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

Влияние времени ожидания на блокировках на скорость проведения документов.

В этой статье рассмотрим сколько времени тратится на ожидания на блокировках.
В предыдущем тесте у нас в системе было только по 1 документу каждого вида.
Табличная часть документа приход:
Табличная часть документа расход:
Естественно при параллельной работе пользователей мы блокируем позиции из ТЧ до завершения транзакции и вторая транзакция не сможет прочитать данные пока не завершится первая.

Добавим еще 1 документ "Приходная накладная" , с номенклатурой "Молоко" на 100 штук и 1 документ "Расходная накладная" , с номенклатурой "Молоко" на 80 штук.

Разделим действия пользователей т.о. чтобы при проведении документов они не конкурировали за ресурсы.
Добавим еще одну роль

и еще один сценарий

Выполним этот сценарий.
Сравним полученные результаты
С ожиданием на блокировках Без ожидания на блокировках
Показатель Значение Показатель Значение
ВремяПрихода 395,500 ВремяПрихода 367,000
1 411,000 1 385,000
2 380,000 2 349,000
ВремяПроведенияПрихода 39,550 ВремяПроведенияПрихода 36,700
1 47,000 1 26,000
2 36,000 2 32,000
3 19,000 3 50,000
4 28,000 4 62,000
5 74,000 5 42,000
6 38,000 6 39,000
7 57,000 7 34,000
8 41,000 8 39,000
9 38,000 9 43,000
10 33,000 10 18,000
11 26,000 11 4,000
12 35,000 12 22,000
13 41,000 13 49,000
14 26,000 14 63,000
15 44,000 15 42,000
16 39,000 16 34,000
17 56,000 17 33,000
18 42,000 18 41,000
19 37,000 19 43,000
20 34,000 20 18,000
ВремяПроведенияРасхода 144,800 ВремяПроведенияРасхода 90,300
1 345,000 1 146,000
2 129,000 2 134,000
3 125,000 3 128,000
4 128,000 4 131,000
5 118,000 5 131,000
6 106,000 6 122,000
7 157,000 7 113,000
8 134,000 8 126,000
9 128,000 9 130,000
10 133,000 10 119,000
11 197,000 11 126,000
12 116,000 12 58,000
13 140,000 13 68,000
14 120,000 14 38,000
15 121,000 15 61,000
16 135,000 16 35,000
17 131,000 17 50,000
18 151,000 18 27,000
19 143,000 19 35,000
20 139,000 20 28,000
ВремяРасхода 1 448,000 ВремяРасхода 903,000
1 1 503,000 1 1 280,000
2 1 393,000 2 526,000

Как говорится "почувствуйте разницу")).


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

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