Имя: Пароль:
1C
1С v8
Долго выполняется запрос
0 Guerro
 
11.03.19
16:54
При Замере Производительности увидел, что долго выболняется:
"РезультатЗапроса = Запрос.Выполнить();"
Хочу понять почему долго выполняется, может что-то не вижу или как оптимизировать?
Нашел запрос:
"//Таб=Новый ТабличныйДокумент;
    Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
                 |    Доки.Номер,
                 |    ВЫРАЗИТЬ(Доки.НомерСтр КАК СТРОКА(5)) КАК НомерСтр,
                 |    Доки.Ссылка КАК Ссылка
                 |ПОМЕСТИТЬ Доки
                 |ИЗ
                 |    &Табл КАК Доки
                 |
                 |ИНДЕКСИРОВАТЬ ПО
                 |    НомерСтр,
                 |    Ссылка
                 |;
                 |
                 |////////////////////////////////////////////////////////////////////////////////
                 |ВЫБРАТЬ
                 |    СостояниеПотолковОстатки.Код,
                 |    СостояниеПотолковОстатки.Состояние,
                 |    СостояниеПотолковОстатки.Контрагент,
                 |    СостояниеПотолковОстатки.Материал,
                 |    СУММА(СостояниеПотолковОстатки.Площадь) КАК Площадь,
                 |    СУММА(СостояниеПотолковОстатки.КоличествоОстаток) КАК КоличествоОстаток
                 |ПОМЕСТИТЬ ОстСостПотолка
                 |ИЗ
                 |    РегистрНакопления.СостояниеПотолков.Остатки(
                 |            ,
                 |            ПОДСТРОКА(Код, 1, 1) = &ОбщийПрефиск
                 |                И (Контрагент = &ВыбДилер
                 |                    ИЛИ Контрагент.Родитель = &ВыбДилер)
                 |                И (Контрагент.Ответственный = &ВыбОтветственный
                 |                    ИЛИ &ВыбОтветственный = ЗНАЧЕНИЕ(Справочник.Контрагент.ПустаяСсылка))) КАК СостояниеПотолковОстатки
                 |
                 |СГРУППИРОВАТЬ ПО
                 |    СостояниеПотолковОстатки.Код,
                 |    СостояниеПотолковОстатки.Состояние,
                 |    СостояниеПотолковОстатки.Контрагент,
                 |    СостояниеПотолковОстатки.Материал
                 |;
                 |
                 |////////////////////////////////////////////////////////////////////////////////
                 |ВЫБРАТЬ
                 |    ОстСостПотолка.Код КАК Код,
                 |    ОстСостПотолка.Состояние КАК Состояние,
                 |    ОстСостПотолка.Контрагент КАК Контрагент,
                 |    ОстСостПотолка.Материал КАК Материал,
                 |    ОстСостПотолка.Площадь КАК Площадь,
                 |    ОстСостПотолка.КоличествоОстаток КАК КоличествоОстаток
                 |ПОМЕСТИТЬ ОстФильтр
                 |ИЗ
                 |    ОстСостПотолка КАК ОстСостПотолка
                 |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Доки КАК Доки
                 |        ПО (ПОДСТРОКА(ОстСостПотолка.Код, 8, 5) = Доки.НомерСтр)
                 |            И (ПОДСТРОКА(ОстСостПотолка.Код, 2, 2) = &ПрефиксПотолка)
                 |            И (Доки.Ссылка ССЫЛКА Документ.ДилЗаказ)
                 |
                 |СГРУППИРОВАТЬ ПО
                 |    ОстСостПотолка.Код,
                 |    ОстСостПотолка.Состояние,
                 |    ОстСостПотолка.Контрагент,
                 |    ОстСостПотолка.Материал,
                 |    ОстСостПотолка.Площадь,
                 |    ОстСостПотолка.КоличествоОстаток
                 |
                 |ОБЪЕДИНИТЬ ВСЕ
                 |
                 |ВЫБРАТЬ
                 |    ОстСостПотолка.Код,
                 |    ОстСостПотолка.Состояние,
                 |    ОстСостПотолка.Контрагент,
                 |    ОстСостПотолка.Материал,
                 |    ОстСостПотолка.Площадь,
                 |    ОстСостПотолка.КоличествоОстаток
                 |ИЗ
                 |    ОстСостПотолка КАК ОстСостПотолка
                 |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Доки КАК Доки
                 |        ПО (ПОДСТРОКА(ОстСостПотолка.Код, 8, 5) = Доки.НомерСтр)
                 |            И (ПОДСТРОКА(ОстСостПотолка.Код, 2, 2) = &ПрефиксОтреза)
                 |            И (Доки.Ссылка ССЫЛКА Документ.Отрез)
                 |
                 |СГРУППИРОВАТЬ ПО
                 |    ОстСостПотолка.Код,
                 |    ОстСостПотолка.Состояние,
                 |    ОстСостПотолка.Материал,
                 |    ОстСостПотолка.Контрагент,
                 |    ОстСостПотолка.Площадь,
                 |    ОстСостПотолка.КоличествоОстаток
                 |
                 |ОБЪЕДИНИТЬ ВСЕ
                 |
                 |ВЫБРАТЬ
                 |    ОстСостПотолка.Код,
                 |    ОстСостПотолка.Состояние,
                 |    ОстСостПотолка.Контрагент,
                 |    ОстСостПотолка.Материал,
                 |    ОстСостПотолка.Площадь,
                 |    ОстСостПотолка.КоличествоОстаток
                 |ИЗ
                 |    ОстСостПотолка КАК ОстСостПотолка
                 |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Доки КАК Доки
                 |        ПО (ПОДСТРОКА(ОстСостПотолка.Код, 8, 5) = Доки.НомерСтр)
                 |            И (ПОДСТРОКА(ОстСостПотолка.Код, 2, 2) = &ПрефиксПечати)
                 |            И (Доки.Ссылка ССЫЛКА Документ.ПечатьЗаказ)
                 |
                 |СГРУППИРОВАТЬ ПО
                 |    ОстСостПотолка.Контрагент,
                 |    ОстСостПотолка.Материал,
                 |    ОстСостПотолка.Код,
                 |    ОстСостПотолка.Состояние,
                 |    ОстСостПотолка.Площадь,
                 |    ОстСостПотолка.КоличествоОстаток
                 |;
                 |
                 |////////////////////////////////////////////////////////////////////////////////
                 |ВЫБРАТЬ
                 |    ВложенныйЗапрос.Код,
                 |    ВложенныйЗапрос.Состояние КАК Состояние,
                 |    ВложенныйЗапрос.Контрагент КАК Контрагент,
                 |    ВложенныйЗапрос.Материал,
                 |    ВложенныйЗапрос.Площадь КАК Площадь,
                 |    ВложенныйЗапрос.КоличествоОстаток КАК КоличествоОстаток,
                 |    ТоварыОстатки.Склад,
                 |    ТоварыОстатки.Ячейка,
                 |    МАКСИМУМ(СостояниеПотолковОбороты.Период) КАК Период
                 |ИЗ
                 |    (ВЫБРАТЬ
                 |        СостояниеПотолковОстатки.Код КАК Код,
                 |        СостояниеПотолковОстатки.Состояние КАК Состояние,
                 |        СостояниеПотолковОстатки.Контрагент КАК Контрагент,
                 |        СостояниеПотолковОстатки.Материал КАК Материал,
                 |        СостояниеПотолковОстатки.Площадь КАК Площадь,
                 |        СостояниеПотолковОстатки.КоличествоОстаток КАК КоличествоОстаток
                 |    ИЗ
                 |        РегистрНакопления.СостояниеПотолков.Остатки КАК СостояниеПотолковОстатки
                 |            ВНУТРЕННЕЕ СОЕДИНЕНИЕ Доки КАК Доки
                 |            ПО (ПОДСТРОКА(СостояниеПотолковОстатки.Код, 8, 5) = Доки.НомерСтр)
                 |                И (ПОДСТРОКА(СостояниеПотолковОстатки.Код, 2, 2) = &ПрефиксПотолка)
                 |                И (Доки.Ссылка ССЫЛКА Документ.ДилЗаказ)
                 |    ГДЕ
                 |        ПОДСТРОКА(СостояниеПотолковОстатки.Код, 1, 1) = &ОбщийПрефиск
                 |        И (СостояниеПотолковОстатки.Контрагент = &ВыбДилер
                 |                ИЛИ &ВыбДилер = ЗНАЧЕНИЕ(Справочник.Контрагент.ПустаяСсылка))
                 |        И (СостояниеПотолковОстатки.Контрагент.Ответственный В ИЕРАРХИИ (&ВыбОтветственный)
                 |                ИЛИ &ВыбОтветственный = ЗНАЧЕНИЕ(Справочник.Контрагент.ПустаяСсылка))
                 |    
                 |    СГРУППИРОВАТЬ ПО
                 |        СостояниеПотолковОстатки.Код,
                 |        СостояниеПотолковОстатки.Состояние,
                 |        СостояниеПотолковОстатки.Контрагент,
                 |        СостояниеПотолковОстатки.Материал,
                 |        СостояниеПотолковОстатки.Площадь,
                 |        СостояниеПотолковОстатки.КоличествоОстаток
                 |    
                 |    ОБЪЕДИНИТЬ ВСЕ
                 |    
                 |    ВЫБРАТЬ
                 |        СостояниеПотолковОстатки.Код,
                 |        СостояниеПотолковОстатки.Состояние,
                 |        СостояниеПотолковОстатки.Контрагент,
                 |        СостояниеПотолковОстатки.Материал,
                 |        СостояниеПотолковОстатки.Площадь,
                 |        СостояниеПотолковОстатки.КоличествоОстаток
                 |    ИЗ
                 |        РегистрНакопления.СостояниеПотолков.Остатки КАК СостояниеПотолковОстатки
                 |            ВНУТРЕННЕЕ СОЕДИНЕНИЕ Доки КАК Доки
                 |            ПО (ПОДСТРОКА(СостояниеПотолковОстатки.Код, 8, 5) = Доки.НомерСтр)
                 |                И (ПОДСТРОКА(СостояниеПотолковОстатки.Код, 2, 2) = &ПрефиксОтреза)
                 |                И (Доки.Ссылка ССЫЛКА Документ.Отрез)
                 |    ГДЕ
                 |        ПОДСТРОКА(СостояниеПотолковОстатки.Код, 1, 1) = &ОбщийПрефиск
                 |        И (СостояниеПотолковОстатки.Контрагент = &ВыбДилер
                 |                ИЛИ &ВыбДилер = ЗНАЧЕНИЕ(Справочник.Контрагент.ПустаяСсылка))
                 |        И (СостояниеПотолковОстатки.Контрагент.Ответственный = &ВыбОтветственный
                 |                ИЛИ &ВыбОтветственный = ЗНАЧЕНИЕ(Справочник.Контрагент.ПустаяСсылка))
                 |    
                 |    СГРУППИРОВАТЬ ПО
                 |        СостояниеПотолковОстатки.Код,
                 |        СостояниеПотолковОстатки.Состояние,
                 |        СостояниеПотолковОстатки.Материал,
                 |        СостояниеПотолковОстатки.Контрагент,
                 |        СостояниеПотолковОстатки.Площадь,
                 |        СостояниеПотолковОстатки.КоличествоОстаток
                 |    
                 |    ОБЪЕДИНИТЬ ВСЕ
                 |    
                 |    ВЫБРАТЬ
                 |        СостояниеПотолковОстатки.Код,
                 |        СостояниеПотолковОстатки.Состояние,
                 |        СостояниеПотолковОстатки.Контрагент,
                 |        СостояниеПотолковОстатки.Материал,
                 |        СостояниеПотолковОстатки.Площадь,
                 |        СостояниеПотолковОстатки.КоличествоОстаток
                 |    ИЗ
                 |        РегистрНакопления.СостояниеПотолков.Остатки КАК СостояниеПотолковОстатки
                 |            ВНУТРЕННЕЕ СОЕДИНЕНИЕ Доки КАК Доки
                 |            ПО (ПОДСТРОКА(СостояниеПотолковОстатки.Код, 8, 5) = Доки.НомерСтр)
                 |                И (ПОДСТРОКА(СостояниеПотолковОстатки.Код, 2, 2) = &ПрефиксПечати)
                 |                И (Доки.Ссылка ССЫЛКА Документ.ПечатьЗаказ)
                 |    ГДЕ
                 |        ПОДСТРОКА(СостояниеПотолковОстатки.Код, 1, 1) = &ОбщийПрефиск
                 |        И (СостояниеПотолковОстатки.Контрагент = &ВыбДилер
                 |                ИЛИ &ВыбДилер = ЗНАЧЕНИЕ(Справочник.Контрагент.ПустаяСсылка))
                 |        И (СостояниеПотолковОстатки.Контрагент.Ответственный = &ВыбОтветственный
                 |                ИЛИ &ВыбОтветственный = ЗНАЧЕНИЕ(Справочник.Контрагент.ПустаяСсылка))
                 |    
                 |    СГРУППИРОВАТЬ ПО
                 |        СостояниеПотолковОстатки.Контрагент,
                 |        СостояниеПотолковОстатки.Материал,
                 |        СостояниеПотолковОстатки.Код,
                 |        СостояниеПотолковОстатки.Состояние,
                 |        СостояниеПотолковОстатки.Площадь,
                 |        СостояниеПотолковОстатки.КоличествоОстаток) КАК ВложенныйЗапрос
                 |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Товары.Остатки КАК ТоварыОстатки
                 |        ПО ВложенныйЗапрос.Код = ТоварыОстатки.ШтрихКод.Код
                 |            И (ВложенныйЗапрос.Состояние.Код = 7)
                 |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СостояниеПотолков.Обороты(
                 |                ,
                 |                ,
                 |                Регистратор,
                 |                ПОДСТРОКА(Код, 1, 1) = &ОбщийПрефиск
                 |                    И (Контрагент = &ВыбДилер
                 |                        ИЛИ &ВыбДилер = ЗНАЧЕНИЕ(Справочник.Контрагент.ПустаяСсылка))
                 |                    И (Контрагент.Ответственный = &ВыбОтветственный
                 |                        ИЛИ &ВыбОтветственный = ЗНАЧЕНИЕ(Справочник.Контрагент.ПустаяСсылка))) КАК СостояниеПотолковОбороты
                 |        ПО ВложенныйЗапрос.Код = СостояниеПотолковОбороты.Код
                 |            И ВложенныйЗапрос.Состояние = СостояниеПотолковОбороты.Состояние
                 |            И ВложенныйЗапрос.Контрагент = СостояниеПотолковОбороты.Контрагент
                 |            И ВложенныйЗапрос.Материал = СостояниеПотолковОбороты.Материал
                 |            И ВложенныйЗапрос.Площадь = СостояниеПотолковОбороты.Площадь
                 |            И (СостояниеПотолковОбороты.Регистратор ССЫЛКА Документ.ИзмСостоянияПотолка)
                 |
                 |СГРУППИРОВАТЬ ПО
                 |    ВложенныйЗапрос.Состояние,
                 |    ВложенныйЗапрос.Контрагент,
                 |    ВложенныйЗапрос.Код,
                 |    ВложенныйЗапрос.Материал,
                 |    ТоварыОстатки.Склад,
                 |    ТоварыОстатки.Ячейка,
                 |    ВложенныйЗапрос.Площадь,
                 |    ВложенныйЗапрос.КоличествоОстаток
                 |
                 |УПОРЯДОЧИТЬ ПО
                 |    Состояние УБЫВ
                 |ИТОГИ
                 |    СУММА(КоличествоОстаток)
                 |ПО
                 |    ОБЩИЕ,
                 |    Контрагент";
    Запрос.УстановитьПараметр("ВыбДилер",ВыбДилер);
    Запрос.УстановитьПараметр("ВыбОтветственный",ВыбОтветственный);
    Запрос.УстановитьПараметр("Табл",Табл);
    Запрос.УстановитьПараметр("ОбщийПрефиск",Строка(Константы.ОбщийПрефикс.Получить()));
    Запрос.УстановитьПараметр("ПрефиксПотолка",Строка(Константы.ПрефиксПотолка.Получить()));
    Запрос.УстановитьПараметр("ПрефиксОтреза",Строка(Константы.ПрефиксОтреза.Получить()));
    Запрос.УстановитьПараметр("ПрефиксПечати",Строка(Константы.ПрефиксПечати.Получить()));"
1 ВикторП
 
11.03.19
17:03
Для начала вложенный запрос вынесите
2 OldCondom
 
11.03.19
17:03
Я считаю здесь слишком мало группировок, как минимум можно еще 1 запихать.
3 sqr4
 
11.03.19
17:04
А он в цикл не обернут, этот запрос
4 OldCondom
 
11.03.19
17:05
И вот от этих может избавиться? Вынести поля в выборку, чтобы в условии не рассчитывать.
ПО (ПОДСТРОКА(ОстСостПотолка.Код, 8, 5) = Доки.НомерСтр
5 Guerro
 
11.03.19
17:06
(3) нет
6 sqr4
 
11.03.19
17:07
(5) По количеству вызовов проверял?
7 Asmody
 
11.03.19
17:07
С архитектурой регистра всё, конечно, печально.
Вот это " ПОДСТРОКА(Код, 1, 1) = &ОбщийПрефиск " - дичь дичайшая. Скажите индексам "НИКОГДА!"
8 Guerro
 
11.03.19
17:08
(6) нет, как
P.S. не опытный
9 sqr4
 
11.03.19
17:09
(8) Колонка "Кол."
10 OldCondom
 
11.03.19
17:10
Cоединения с подзапросами
Рекомендации
При написании запросов не следует использовать соединения с подзапросами. Следует соединять друг с другом только объекты метаданных или временные таблицы. Если запрос использует соединения с подзапросами, то его следует переписать с использованием временных таблиц.
11 Guerro
 
11.03.19
17:11
(9) 1 запрос
12 Guerro
 
11.03.19
17:15
(10) Не я писал запрос, просто пытаюсь разобрать
13 OldCondom
 
11.03.19
17:17
(12)а потом?
14 MrStomak
 
11.03.19
17:20
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СостояниеПотолков.Обороты(
                 |                ,
                 |                ,
                 |                Регистратор,

Дальше можно не читать - виртуальная таблица оборотов, развернутая по регистратору за ВЕСЬ период. Тут даже уже пофиг, что далее отбор по полям соединения с результатом вложенного сгрупированного запроса идёт.
И всё это только для того, чтобы получить дату последнего движения!! Браво!!
15 Guerro
 
11.03.19
17:32
(13) исправить костыли
16 Guerro
 
11.03.19
17:33
(14) пытаюсь найти, где засунуть период?
17 OldCondom
 
11.03.19
17:36
(14) а и правда. Причем регистратор нигде не используется.
18 sqr4
 
11.03.19
17:39
я вообще не могу читать такие запросы без визуализации
19 Ёпрст
 
гуру
11.03.19
17:55
(16) не нужен там период никуда засовывать, нужно выкинуть соединение с этой вт.
Да и весь запрос в топку
20 xXeNoNx
 
11.03.19
17:58
мне тока кажется что это:

                 |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Доки КАК Доки
                 |        ПО (ПОДСТРОКА(ОстСостПотолка.Код, 8, 5) = Доки.НомерСтр)
                 |            И (ПОДСТРОКА(ОстСостПотолка.Код, 2, 2) = &ПрефиксОтреза)
                 |            И (Доки.Ссылка ССЫЛКА Документ.Отрез
Полное УГ
21 xXeNoNx
 
11.03.19
17:59
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СостояниеПотолков.Обороты(
                 |                ,
                 |                ,
                 |                Регистратор,
                 |                ПОДСТРОКА(Код, 1, 1) = &ОбщийПрефиск
УГ
22 Ёпрст
 
гуру
11.03.19
18:00
тут дело не в запросе, а в неверном проектировании объектов бд, где требуются вообще Подстрока() потом, и еще хуже, использовать это в соединении
23 MrStomak
 
11.03.19
18:09
(22) Да не, в запросе тоже. Убрать это соединение одного вложенного запроса с другим вложенным запросом (виртуальная таблица оборотов), раскидать по ВТ и ускорится в несколько раз. Даже с учетом того, что ни один индекс не будет использован - скуль хоть поймёт, что нужно делать фуллскан и не будет умничать, пытаясь прикидывать статистику и предсказать результат этих безумных вложенных запросов.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший