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