|
Производительность базы при запросе данных | ☑ | ||
---|---|---|---|---|
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
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |