![]() |
|
Долго выполняется запрос | ☑ | ||
---|---|---|---|---|
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) Да не, в запросе тоже. Убрать это соединение одного вложенного запроса с другим вложенным запросом (виртуальная таблица оборотов), раскидать по ВТ и ускорится в несколько раз. Даже с учетом того, что ни один индекс не будет использован - скуль хоть поймёт, что нужно делать фуллскан и не будет умничать, пытаясь прикидывать статистику и предсказать результат этих безумных вложенных запросов.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |