Имя: Пароль:
1C
1С v8
Производительность базы при запросе данных
0 trialex3
 
13.10.23
10:39
Добрый день. Переношу отчет из УПП в ЕРП и столкнулся с тем что почти одинаковый запрос ведет себя по разному. В ерп постобработка запроса занимает намного больше времени.
Например, одна из затратных операций - выборка определенной группировки (
ВыборкаДатаЗаписи = ВыборкаНаборНагрузки.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
) - почти 3 секунды. На УПП эта же выборка происходит намного быстрее- 0.5 - 0.6 секунды. Постобработка в ЕРП в принципе у меня дольше намного, но там моя вина - я сам усложнил алгоритм. Но тут примерно похожие операции а разница во времени огромная. Куда копать?

Если кому надо тексты запросов:

ВАРИАНТ УПП (БЫСТРЫЙ)
ВЫБРАТЬ РАЗЛИЧНЫЕ
    АР_ТестированиеПриводов.НагрузкаЛ_Нм КАК НагрузкаЛ_Нм,
    АР_ТестированиеПриводов.НагрузкаП_Нм КАК НагрузкаП_Нм,
    АВТОНОМЕРЗАПИСИ() КАК НаборНагрузки
ПОМЕСТИТЬ НаборыНагрузок
ИЗ
    РегистрСведений.АР_ТестированиеПриводов КАК АР_ТестированиеПриводов
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    АР_ИсторияПриводов.КодПривода КАК КодПривода,
    АР_ИсторияПриводов.Участок КАК Участок,
    АР_ИсторияПриводов.Этап КАК Этап
ПОМЕСТИТЬ БракПоРекламации
ИЗ
    РегистрСведений.АР_ИсторияПриводов КАК АР_ИсторияПриводов
ГДЕ
    АР_ИсторияПриводов.Этап = "Проверка по рекламации"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    АР_КодыПриводов.Код КАК КодПривода,
    АР_ТестированиеПриводов.ДатаЗаписи КАК ДатаЗаписи,
    АР_ТестированиеПриводов.КодОшибки КАК КодОшибки,
    АР_ТестированиеПриводов.НагрузкаЛ_Нм КАК НагрузкаЛ_Нм,
    АР_ТестированиеПриводов.НагрузкаП_Нм КАК НагрузкаП_Нм,
    АР_КодыПриводов.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    АР_КодыПриводов.Номенклатура КАК Номенклатура,
    АР_КодыПриводов.Ссылка КАК КодПриводаСсылка,
    НаборыНагрузок.НаборНагрузки КАК НаборНагрузки,
    ЕСТЬNULL(АР_ДопТестированияПриводовСрезПоследних.РезультатТестирования, "") КАК РезультатТестирования,
    ЕСТЬNULL(АР_ДопТестированияПриводовСрезПоследних.ВидНеисправности.Наименование, "") КАК ВидНеисправностиНаименование,
    ЕСТЬNULL(АР_ДопТестированияПриводовСрезПоследних.ВидНеисправности.НаименованиеАнглЯзык, "") КАК ВидНеисправностиНаименованиеАнглЯзык,
    ЕСТЬNULL(БракПоРекламации.Этап, "") КАК ЭтапИсторииРекламация
ИЗ
    Справочник.АР_КодыПриводов КАК АР_КодыПриводов
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АР_ТестированиеПриводов КАК АР_ТестированиеПриводов
            ЛЕВОЕ СОЕДИНЕНИЕ НаборыНагрузок КАК НаборыНагрузок
            ПО АР_ТестированиеПриводов.НагрузкаЛ_Нм = НаборыНагрузок.НагрузкаЛ_Нм
                И АР_ТестированиеПриводов.НагрузкаП_Нм = НаборыНагрузок.НагрузкаП_Нм
        ПО АР_КодыПриводов.Код = АР_ТестированиеПриводов.КодПривода
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АР_ДопТестированияПриводов.СрезПоследних КАК АР_ДопТестированияПриводовСрезПоследних
        ПО (АР_ДопТестированияПриводовСрезПоследних.КодПривода = АР_КодыПриводов.Ссылка)
        ЛЕВОЕ СОЕДИНЕНИЕ БракПоРекламации КАК БракПоРекламации
        ПО АР_КодыПриводов.Ссылка = БракПоРекламации.КодПривода
ГДЕ
    АР_КодыПриводов.ЗаказНаПроизводство <> &ЗаказОтстойник

УПОРЯДОЧИТЬ ПО
    НагрузкаЛ_Нм УБЫВ,
    НагрузкаП_Нм УБЫВ,
    ДатаЗаписи УБЫВ
ИТОГИ ПО
    КодПривода,
    НаборНагрузки,
    ДатаЗаписи



ЗАПРОС ЕРП (МЕДЛЕННЫЙ)
ВЫБРАТЬ РАЗЛИЧНЫЕ
    АР_ТестированиеПриводов.НагрузкаЛ_Нм КАК НагрузкаЛ_Нм,
    АР_ТестированиеПриводов.НагрузкаП_Нм КАК НагрузкаП_Нм,
    АВТОНОМЕРЗАПИСИ() КАК НаборНагрузки
ПОМЕСТИТЬ НаборыНагрузок
ИЗ
    РегистрСведений.АР_ТестированиеПриводов КАК АР_ТестированиеПриводов
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    АР_КодыПриводов.Код КАК КодПриводаСтрока,
    ЕСТЬNULL(АР_ТестированиеПриводов.ДатаЗаписи, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаТестированияСтенд,
    ЕСТЬNULL(АР_ТестированиеПриводов.КодОшибки, 0) КАК КодОшибки,
    ЕСТЬNULL(АР_ТестированиеПриводов.НагрузкаЛ_Нм, 0) КАК НагрузкаЛ_Нм,
    ЕСТЬNULL(АР_ТестированиеПриводов.НагрузкаП_Нм, 0) КАК НагрузкаП_Нм,
    АР_КодыПриводов.Наименование КАК ПолноеНаименованиеХарактеристики,
    НаборыНагрузок.НаборНагрузки КАК НаборНагрузки,
    ЕСТЬNULL(АР_ДопТестированияПриводовСрезПоследних.РезультатТестирования, "") КАК РезультатДопТестированияНаименование,
    ЕСТЬNULL(АР_ДопТестированияПриводовСрезПоследних.ВидНеисправности, ЗНАЧЕНИЕ(Справочник.АР_ВидыНеисправностейПривода.ПустаяСсылка)) КАК ДопТестированиеВидНеисправности,
    ЕСТЬNULL(АР_ДопТестированияПриводовСрезПоследних.ВидНеисправности.Наименование, "") КАК ДопТестированиеВидНеисправностиНаименование,
    ЕСТЬNULL(АР_ДопТестированияПриводовСрезПоследних.ВидНеисправности.НаименованиеАнглЯзык, "") КАК ДопТестированиеВидНеисправностиНаименованиеАнглЯзык,
    НоменклатураСпр.Наименование КАК НоменклатураПредставление,
    АР_Партии.Наименование КАК ПартияПредставление
ИЗ
    Справочник.АР_КодыПриводов КАК АР_КодыПриводов
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АР_ТестированиеПриводов КАК АР_ТестированиеПриводов
            ЛЕВОЕ СОЕДИНЕНИЕ НаборыНагрузок КАК НаборыНагрузок
            ПО АР_ТестированиеПриводов.НагрузкаЛ_Нм = НаборыНагрузок.НагрузкаЛ_Нм
                И АР_ТестированиеПриводов.НагрузкаП_Нм = НаборыНагрузок.НагрузкаП_Нм
        ПО АР_КодыПриводов.Ссылка = АР_ТестированиеПриводов.КодПривода
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АР_ДопТестированияПриводов.СрезПоследних КАК АР_ДопТестированияПриводовСрезПоследних
        ПО (АР_ДопТестированияПриводовСрезПоследних.КодПривода = АР_КодыПриводов.Ссылка)
            И (АР_ДопТестированияПриводовСрезПоследних.ТипТестирования = ЗНАЧЕНИЕ(Перечисление.АР_ТипыДопТестированийПриводов.ПроверкаРучногоВзвода))
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК НоменклатураСпр
        ПО АР_КодыПриводов.Номенклатура = НоменклатураСпр.Ссылка
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.АР_Партии КАК АР_Партии
        ПО АР_КодыПриводов.Партия = АР_Партии.Ссылка
ГДЕ
    АР_КодыПриводов.Действующий
УПОРЯДОЧИТЬ ПО
    НагрузкаЛ_Нм УБЫВ,
    НагрузкаП_Нм УБЫВ,
    ДатаЗаписи УБЫВ
ИТОГИ ПО
    КодПриводаСтрока,
    НаборНагрузки,
    ДатаЗаписи
1 Valdis2007
 
13.10.23
10:37
(0) объем данных в ерп упп одинаковый?
2 trialex3
 
13.10.23
10:40
(1) Пример тестировался на одном наборе данных.
3 Valdis2007
 
13.10.23
10:44
(2) индексирование как?
4 trialex3
 
13.10.23
10:48
(3) структура справочников и регистров одинаковая. Индексирование нигде дополнительно не настраивалось.
5 Valdis2007
 
13.10.23
10:50
(4) посмотри планы запросов на sql сервере
6 trialex3
 
13.10.23
10:51
(5) Принял буду копать, благодарю
7 shuhard
 
13.10.23
10:56
(0) дык на идентичной серверной группировке ERP работает в разы медленнее
8 trialex3
 
13.10.23
11:00
(7) Мой наивный мозг думал что ерп это новый флагман 1С, где оптимизация и все такое. Ладно у них сама программа сильно перегружена, но и запросы пострадали? не знал...
9 shuhard
 
13.10.23
11:01
(8) меняй мозг
10 trialex3
 
13.10.23
11:06
Блин одна и та же строчка:
ЕРП
ВыборкаДатаЗаписи = ВыборкаНаборНагрузки.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);    6 631    2,834766    27,82

УПП (тестовая, в рабочей еще быстрее)
ВыборкаДатаЗаписи = ВыборкаНаборНагрузки.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);    6 631    1,282631    19,48
11 trialex3
 
13.10.23
11:09
(9) Всенепременнейше :D
12 H A D G E H O G s
 
13.10.23
11:19
Начнем с того, что структуры данных - нетиповые.
Продолжим тем, что сделаны они криво.
Закончим на том, что запросы - моё почтение. Так изнасиловать сервер - надо постараться.
13 trialex3
 
13.10.23
11:22
(12) Благодарю за критику.
1. Если напишите подробнее - будет замечательно. Может мои руки станут чуточку прямее
2. Загвоздка в том что оба запроса "кривые", но работают на разных базах одинаково.
14 lubitelxml
 
13.10.23
11:24
Индексы....
15 Valdis2007
 
13.10.23
11:26
(13)  так обход группировок это уже не запрос как бы... тебе с настройками сервера приложений под ерп поиграться надо, ресурсов  добавь rphost
16 trialex3
 
13.10.23
11:34
(15) Да буду напрягать администратора - мб он что глянет
17 lubitelxml
 
13.10.23
12:09
Регламенты в СУБД настроены? Обновление статистики, и реиндекс хотя бы
18 Bigbro
 
13.10.23
12:33
поддержу (15) запрос уже выполнился, дальше дело за сервером приложений.
и вот в его случае для УПП ему может хватать памяти а для ЕРП нет - и он начинает выделять себе доп память (а это ресурсоемкая операция) и так далее.
например.
19 trialex3
 
13.10.23
12:48
(17) хм кстати спасибо за наводку - рабочая то база исправляется и реиндексируется каждый день. А вот ЕРП незнаю...
20 trialex3
 
13.10.23
12:49
(18) при выполнении запроса потребление мощности процессора rphost-ом вырастает с 0.2% до 3.5%. Объем используемой памяти не меняется.
21 Valdis2007
 
13.10.23
13:19
(20) при выполнении запроса потребление мощности процессора rphost-ом вырастает с 0.2% до 3.5%...- это хорошо.  Какие настройки производительности сервера приложений в консоли кластера посмотри.
22 trialex3
 
13.10.23
13:21
Так а что с запросом то не так? со вторым особенно. Он вроде даже легче стал и ссылки не вытягивает ненужные...
23 trialex3
 
13.10.23
13:23
(21) Не совсем понял что вы имеете ввиду но у кластера в настройках распределения нагрузки - "Приоритет по производительности"
24 Valdis2007
 
13.10.23
13:24
(22) ты планы этих запросов смотрел? замеры производительности , которые ты привел не запросы показывают, а работу на сервере приложения...разницу понимаешь?
25 Valdis2007
 
13.10.23
13:26
(23) у вас лицензия позволяет настраивать производительность кластера?
26 H A D G E H O G s
 
13.10.23
13:42
(22)
1) Ну хотя бы СрезПоследних вынести в отдельную ВТ с отборами внутри ВТ, без обращений через точку к вложенным полям измерений.
2)
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АР_ТестированиеПриводов КАК АР_ТестированиеПриводов
            ЛЕВОЕ СОЕДИНЕНИЕ НаборыНагрузок КАК НаборыНагрузок
            ПО АР_ТестированиеПриводов.НагрузкаЛ_Нм = НаборыНагрузок.НагрузкаЛ_Нм
                И АР_ТестированиеПриводов.НагрузкаП_Нм = НаборыНагрузок.НагрузкаП_Нм

вынести в отдельную ВТ
27 trialex3
 
13.10.23
14:28
(26) Ну как то так...

ВЫБРАТЬ РАЗЛИЧНЫЕ
    АР_ТестированиеПриводов.НагрузкаЛ_Нм КАК НагрузкаЛ_Нм,
    АР_ТестированиеПриводов.НагрузкаП_Нм КАК НагрузкаП_Нм,
    АВТОНОМЕРЗАПИСИ() КАК НаборНагрузки
ПОМЕСТИТЬ НаборыНагрузок
ИЗ
    РегистрСведений.АР_ТестированиеПриводов КАК АР_ТестированиеПриводов
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    АР_ТестированиеПриводов.ДатаЗаписи КАК ДатаЗаписи,
    АР_ТестированиеПриводов.КодОшибки КАК КодОшибки,
    АР_ТестированиеПриводов.НагрузкаЛ_Нм КАК НагрузкаЛ_Нм,
    АР_ТестированиеПриводов.НагрузкаП_Нм КАК НагрузкаП_Нм,
    АР_ТестированиеПриводов.КодПривода КАК КодПривода,
    НаборыНагрузок.НаборНагрузки КАК НаборНагрузки
ПОМЕСТИТЬ ТестированиеСНаборами
ИЗ
    РегистрСведений.АР_ТестированиеПриводов КАК АР_ТестированиеПриводов
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ НаборыНагрузок КАК НаборыНагрузок
        ПО АР_ТестированиеПриводов.НагрузкаЛ_Нм = НаборыНагрузок.НагрузкаЛ_Нм
            И АР_ТестированиеПриводов.НагрузкаП_Нм = НаборыНагрузок.НагрузкаП_Нм

ИНДЕКСИРОВАТЬ ПО
    КодПривода
;

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

ИНДЕКСИРОВАТЬ ПО
    КодПривода
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    АР_КодыПриводов.Код КАК КодПриводаСтрока,
    АР_КодыПриводов.Наименование КАК ПолноеНаименованиеХарактеристики,
    НоменклатураСпр.Наименование КАК НоменклатураПредставление,
    АР_Партии.Наименование КАК ПартияПредставление,
    ДопТестирования.РезультатДопТестированияНаименование КАК РезультатДопТестированияНаименование,
    ДопТестирования.ДопТестированиеВидНеисправности КАК ДопТестированиеВидНеисправности,
    ДопТестирования.ДопТестированиеВидНеисправностиНаименование КАК ДопТестированиеВидНеисправностиНаименование,
    ДопТестирования.ДопТестированиеВидНеисправностиНаименованиеАнглЯзык КАК ДопТестированиеВидНеисправностиНаименованиеАнглЯзык,
    ЕСТЬNULL(ТестированиеСНаборами.ДатаЗаписи, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаТестированияСтенд,
    ЕСТЬNULL(ТестированиеСНаборами.КодОшибки, 0) КАК КодОшибки,
    ЕСТЬNULL(ТестированиеСНаборами.НагрузкаЛ_Нм, 0) КАК НагрузкаЛ_Нм,
    ЕСТЬNULL(ТестированиеСНаборами.НагрузкаП_Нм, 0) КАК НагрузкаП_Нм,
    ТестированиеСНаборами.НаборНагрузки КАК НаборНагрузки
ИЗ
    Справочник.АР_КодыПриводов КАК АР_КодыПриводов
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК НоменклатураСпр
        ПО (АР_КодыПриводов.Номенклатура = НоменклатураСпр.Ссылка)
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.АР_Партии КАК АР_Партии
        ПО (АР_КодыПриводов.Партия = АР_Партии.Ссылка)
        ЛЕВОЕ СОЕДИНЕНИЕ ДопТестирования КАК ДопТестирования
        ПО (АР_КодыПриводов.Ссылка = ДопТестирования.КодПривода)
        ЛЕВОЕ СОЕДИНЕНИЕ ТестированиеСНаборами КАК ТестированиеСНаборами
        ПО (АР_КодыПриводов.Ссылка = ТестированиеСНаборами.КодПривода)
ГДЕ
    АР_КодыПриводов.Действующий

УПОРЯДОЧИТЬ ПО
    НагрузкаЛ_Нм УБЫВ,
    НагрузкаП_Нм УБЫВ,
    ТестированиеСНаборами.ДатаЗаписи УБЫВ
ИТОГИ ПО
    КодПриводаСтрока,
    НаборНагрузки,
    ТестированиеСНаборами.ДатаЗаписи
28 trialex3
 
13.10.23
14:34
(27) Только дольше почему то стало выполнятся...
29 H A D G E H O G s
 
13.10.23
14:40
(28) Верни тогда обратно и позови специалиста.
30 trialex3
 
13.10.23
14:44
(29) OK :D
Ошибка? Это не ошибка, это системная функция.