|
Оптимизация типового запроса ут 10 | ☑ | ||
---|---|---|---|---|
0
aptomilov
16.05.21
✎
06:39
|
Уже пришлось перейти на новый сервак
сервер 1С и сервер скуль разделены на ssd дисках запрос выполняется почти минуту. Строчек в документе 700. Документ Отчет о розничных продажах. Магазинов 20 шт и когда заканчивается рабочий день начинается коллапс. На старом серваке этот же запрос выполнялся по 5 минут. Запрос типовой. Вопрос как можно соптимизировать сие чудо а может есть какие другие решения данного вопроса. ///////////////////////////////////// ВЫБРАТЬ СписанныеТовары.НомерСтрокиДокумента КАК НомерСтрокиДокумента, ПартииТоваровНаСкладах.Номенклатура, ПартииТоваровНаСкладах.ДокументОприходования КАК ДокументОприходования, ПартииТоваровНаСкладах.ДокументОприходования.Дата КАК ДокументОприходованияДата, ПартииТоваровНаСкладах.Склад, ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры, ПартииТоваровНаСкладах.СерияНоменклатуры, ПартииТоваровНаСкладах.Качество, ПартииТоваровНаСкладах.Заказ, ПартииТоваровНаСкладах.КоличествоОстаток КАК Количество, ПартииТоваровНаСкладах.СтоимостьОстаток КАК Стоимость, ПартииТоваровНаСкладах.СтатусПартии, ВЫБОР КОГДА СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры ТОГДА 0 ИНАЧЕ 1 КОНЕЦ КАК ЧислоСерияНоменклатуры, ВЫБОР КОГДА СписанныеТовары.ДокументПартии = НЕОПРЕДЕЛЕНО ТОГДА 0 ИНАЧЕ ВЫБОР КОГДА СписанныеТовары.ДокументПартии = ПартииТоваровНаСкладах.ДокументОприходования ТОГДА 0 ИНАЧЕ 1 КОНЕЦ КОНЕЦ КАК ЧислоДокументОприходования, ВЫБОР КОГДА СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО ТОГДА 0 ИНАЧЕ ВЫБОР КОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ ТОГДА 1 ИНАЧЕ 0 КОНЕЦ КОНЕЦ КАК ЧислоЗаказ, ВЫБОР КОГДА ПартииТоваровНаСкладах.СтатусПартии = &НаКомиссию ТОГДА 1 ИНАЧЕ 0 КОНЕЦ КАК ЧислоСтатусПартии ИЗ РегистрСведений.СписанныеТовары КАК СписанныеТовары ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки( &Дат, Номенклатура В (ВЫБРАТЬ РегистрСведений.СписанныеТовары.Номенклатура ИЗ РегистрСведений.СписанныеТовары ГДЕ РегистрСведений.СписанныеТовары.Регистратор = &Ссылка) И (Склад В (ВЫБРАТЬ РегистрСведений.СписанныеТовары.Склад ИЗ РегистрСведений.СписанныеТовары ГДЕ РегистрСведений.СписанныеТовары.Регистратор = &Ссылка) ИЛИ Склад = &ПустойСклад)) КАК ПартииТоваровНаСкладах ПО СписанныеТовары.Номенклатура = ПартииТоваровНаСкладах.Номенклатура И СписанныеТовары.ХарактеристикаНоменклатуры = ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры И (ВЫБОР КОГДА ПартииТоваровНаСкладах.Качество = &ПустоеКачество ТОГДА ИСТИНА ИНАЧЕ ВЫБОР КОГДА СписанныеТовары.Качество = &ПустоеКачество ТОГДА ПартииТоваровНаСкладах.Качество = &КачествоНовый ИНАЧЕ ПартииТоваровНаСкладах.Качество = СписанныеТовары.Качество КОНЕЦ КОНЕЦ) И (ПартииТоваровНаСкладах.Склад = СписанныеТовары.Склад ИЛИ ПартииТоваровНаСкладах.Склад = &ПустойСклад) И (ВЫБОР КОГДА СписанныеТовары.ДопустимыйСтатус1 <> &ПустойСтатус ИЛИ СписанныеТовары.ДопустимыйСтатус2 <> &ПустойСтатус ИЛИ СписанныеТовары.ДопустимыйСтатус3 <> &ПустойСтатус ИЛИ СписанныеТовары.ДопустимыйСтатус4 <> &ПустойСтатус ТОГДА ПартииТоваровНаСкладах.СтатусПартии = &ПустойСтатус ИЛИ ПартииТоваровНаСкладах.СтатусПартии = &СтатусПартииПоОрдеру ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус1 ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус2 ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус3 ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус4 ИНАЧЕ ИСТИНА КОНЕЦ) И (ВЫБОР КОГДА СписанныеТовары.СписыватьТолькоПоЗаказу = ИСТИНА ТОГДА ВЫБОР КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии ТОГДА ВЫБОР КОГДА (НЕ СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО) ТОГДА ЛОЖЬ ИНАЧЕ ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ КОНЕЦ ИНАЧЕ ИСТИНА КОНЕЦ ИНАЧЕ ВЫБОР КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии ТОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ ИНАЧЕ ИСТИНА КОНЕЦ КОНЕЦ) И (СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры ИЛИ ПартииТоваровНаСкладах.СерияНоменклатуры = &ПустаяСерияНоменклатуры ИЛИ СписанныеТовары.КодОперацииПартииТоваров = &КодРезервирование) ГДЕ СписанныеТовары.Регистратор = &ОсновнойДокумент УПОРЯДОЧИТЬ ПО ЧислоСерияНоменклатуры, ЧислоДокументОприходования, ЧислоЗаказ, ЧислоСтатусПартии, ДокументОприходованияДата, ДокументОприходования ИТОГИ ПО НомерСтрокиДокумента |
|||
1
ДенисЧ
16.05.21
✎
06:50
|
Для начала выдерни все внутренние запросы в временные таблицы (опционально проиндексируй).
А потом смотри план запроса. |
|||
2
ASV
16.05.21
✎
12:16
|
ПартииТоваровНаСкладах.ДокументОприходования.Дата КАК ДокументОприходованияДата,
убрать |
|||
3
ASV
16.05.21
✎
12:20
|
добавить ВЫРАЗИТЬ
ВЫРАЗИТЬ(СписанныеТовары.Регистратор КАК Документ.ОтчетОККК) = &ОсновнойДокумент ВЫРАЗИТЬ(РегистрСведений.СписанныеТовары.Регистратор КАК Документ.ОтчетОККК) = &Ссылка |
|||
4
RomanYS
16.05.21
✎
12:21
|
Запрос конечно можно пооптимизировать... но в данной ситуации имхо нужно думать о переносе списания партий в оффлайн-режим. Возможно даже в УТ10 есть что-то типовое
|
|||
5
RomanYS
16.05.21
✎
12:32
|
(3) Это должно что-то ускорить? Сомневаюсь
|
|||
6
Timon1405
16.05.21
✎
12:32
|
(3) выражать нужно получение реквизитов от составной ссылки. сама ссылка суть строка из 36 символов, не нужно её никуда выражать.
вот (2) - потенциальный источник проблем. лечится архитектурно: заведение отдельного регистра с реквизитами документов и соединением с ним. посмотреть реализацию можно в УТ11. |
|||
7
hhhh
16.05.21
✎
12:45
|
еще советуют ИЛИ убрать и заменить на объединение запросов. Вот это вообще какая-то фигня
И (ПартииТоваровНаСкладах.Склад = СписанныеТовары.Склад ИЛИ ПартииТоваровНаСкладах.Склад = &ПустойСклад) И (ВЫБОР КОГДА СписанныеТовары.ДопустимыйСтатус1 <> &ПустойСтатус ИЛИ СписанныеТовары.ДопустимыйСтатус2 <> &ПустойСтатус ИЛИ СписанныеТовары.ДопустимыйСтатус3 <> &ПустойСтатус ИЛИ СписанныеТовары.ДопустимыйСтатус4 <> &ПустойСтатус ТОГДА ПартииТоваровНаСкладах.СтатусПартии = &ПустойСтатус ИЛИ ПартииТоваровНаСкладах.СтатусПартии = &СтатусПартииПоОрдеру ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус1 ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус2 ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус3 ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус4 ИНАЧЕ ИСТИНА КОНЕЦ) |
|||
8
braynt
16.05.21
✎
15:59
|
Запрос.Текст =
"ВЫБРАТЬ * |ПОМЕСТИТЬ СписанныеТовары |ИЗ | РегистрСведений.СписанныеТовары КАК СписанныеТовары |ГДЕ | СписанныеТовары.Регистратор = &ОсновнойДокумент | |ИНДЕКСИРОВАТЬ ПО |Склад, |Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | СписанныеТовары.НомерСтрокиДокумента КАК НомерСтрокиДокумента, | ПартииТоваровНаСкладах.Номенклатура, | ПартииТоваровНаСкладах.ДокументОприходования КАК ДокументОприходования, | ПартииТоваровНаСкладах.ДокументОприходования.Дата КАК ДокументОприходованияДата, | ПартииТоваровНаСкладах.Склад, | ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры, | ПартииТоваровНаСкладах.СерияНоменклатуры, | ПартииТоваровНаСкладах.Качество, | ПартииТоваровНаСкладах.Заказ, | ПартииТоваровНаСкладах.КоличествоОстаток КАК Количество, | ПартииТоваровНаСкладах.СтоимостьОстаток КАК Стоимость, | ПартииТоваровНаСкладах.СтатусПартии, | ВЫБОР | КОГДА СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры | ТОГДА 0 | ИНАЧЕ 1 | КОНЕЦ КАК ЧислоСерияНоменклатуры, | ВЫБОР | КОГДА СписанныеТовары.ДокументПартии = НЕОПРЕДЕЛЕНО | ТОГДА 0 | ИНАЧЕ ВЫБОР | КОГДА СписанныеТовары.ДокументПартии = ПартииТоваровНаСкладах.ДокументОприходования | ТОГДА 0 | ИНАЧЕ 1 | КОНЕЦ | КОНЕЦ КАК ЧислоДокументОприходования, | ВЫБОР | КОГДА СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО | ТОГДА 0 | ИНАЧЕ ВЫБОР | КОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ | ТОГДА 1 | ИНАЧЕ 0 | КОНЕЦ | КОНЕЦ КАК ЧислоЗаказ, | ВЫБОР | КОГДА ПартииТоваровНаСкладах.СтатусПартии = &НаКомиссию | ТОГДА 1 | ИНАЧЕ 0 | КОНЕЦ КАК ЧислоСтатусПартии |ИЗ | СписанныеТовары КАК СписанныеТовары | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки( | &Дат, | Номенклатура В | (ВЫБРАТЬ | СписанныеТовары.Номенклатура | ИЗ | СписанныеТовары | ГДЕ | СписанныеТовары.Регистратор = &Ссылка)" + ?(ВестиПартионныйУчетПоСкладам, " | И (Склад В | (ВЫБРАТЬ | СписанныеТовары.Склад | ИЗ | СписанныеТовары | ГДЕ | СписанныеТовары.Регистратор = &Ссылка) ИЛИ Склад = &ПустойСклад)", "") + ") КАК ПартииТоваровНаСкладах | ПО СписанныеТовары.Номенклатура = ПартииТоваровНаСкладах.Номенклатура | И СписанныеТовары.ХарактеристикаНоменклатуры = ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры | И (ВЫБОР | КОГДА ПартииТоваровНаСкладах.Качество = &ПустоеКачество | ТОГДА ИСТИНА | ИНАЧЕ ВЫБОР | КОГДА СписанныеТовары.Качество = &ПустоеКачество | ТОГДА ПартииТоваровНаСкладах.Качество = &КачествоНовый | ИНАЧЕ ПартииТоваровНаСкладах.Качество = СписанныеТовары.Качество | КОНЕЦ | КОНЕЦ) | " + ?(ВестиПартионныйУчетПоСкладам, "И (ПартииТоваровНаСкладах.Склад = СписанныеТовары.Склад ИЛИ ПартииТоваровНаСкладах.Склад = &ПустойСклад)", "") + " | И (ВЫБОР | КОГДА СписанныеТовары.ДопустимыйСтатус1 <> &ПустойСтатус | ИЛИ СписанныеТовары.ДопустимыйСтатус2 <> &ПустойСтатус | ИЛИ СписанныеТовары.ДопустимыйСтатус3 <> &ПустойСтатус | ИЛИ СписанныеТовары.ДопустимыйСтатус4 <> &ПустойСтатус | ТОГДА ПартииТоваровНаСкладах.СтатусПартии = &ПустойСтатус | ИЛИ ПартииТоваровНаСкладах.СтатусПартии = &СтатусПартииПоОрдеру | ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус1 | ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус2 | ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус3 | ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус4 | ИНАЧЕ ИСТИНА | КОНЕЦ) | | И (ВЫБОР | КОГДА СписанныеТовары.СписыватьТолькоПоЗаказу = ИСТИНА | ТОГДА ВЫБОР | КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии | ТОГДА ВЫБОР | КОГДА (НЕ СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО) | ТОГДА ЛОЖЬ | ИНАЧЕ ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ | КОНЕЦ | ИНАЧЕ ИСТИНА | КОНЕЦ | ИНАЧЕ ВЫБОР | КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии | ТОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ | ИНАЧЕ ИСТИНА | КОНЕЦ | КОНЕЦ) | И (СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры | ИЛИ ПартииТоваровНаСкладах.СерияНоменклатуры = &ПустаяСерияНоменклатуры) |ГДЕ | СписанныеТовары.Регистратор = &ОсновнойДокумент | |УПОРЯДОЧИТЬ ПО | ЧислоСерияНоменклатуры, | ЧислоДокументОприходования, | ЧислоЗаказ, | ЧислоСтатусПартии" + ?(СтратегияСтатусПартии = Перечисления.СтретегииСписанияПартийТоваровПоСтатусам.СначалаПринятыеПотомСобственные, " Убыв", "") + ", | ДокументОприходованияДата" + ?(СпособОценкиМПЗ = "ЛИФО", " Убыв","") + ", | ДокументОприходования" + ?(СпособОценкиМПЗ = "ЛИФО", " Убыв","") + " |ИТОГИ ПО | НомерСтрокиДокумента"; |
|||
9
ndrv
16.05.21
✎
19:54
|
(0), (8)
"ВЫБРАТЬ * |ПОМЕСТИТЬ СписанныеТовары |ИЗ | РегистрСведений.СписанныеТовары КАК СписанныеТовары |ГДЕ | СписанныеТовары.Регистратор = &ОсновнойДокумент | |ИНДЕКСИРОВАТЬ ПО |Склад, |Номенклатура |; | //////////////////////////////////////////////////////////////////////////////// --- |ИЗ | СписанныеТовары КАК СписанныеТовары | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки( | &Дат, | (Номенклатура, Склад) В (Выбрать Номенклатура, Склад ИЗ СписанныеТовары) |
|||
11
RomanYS
16.05.21
✎
19:58
|
(9) нельзя, склад пустой может быть
|
|||
12
rsv
16.05.21
✎
20:24
|
(0) в условиях джойна куча кейсов ( выбор когда)
|
|||
13
Ivan_495
16.05.21
✎
20:26
|
а где блокировки на уровне записей?
|
|||
14
Ivan_495
16.05.21
✎
20:50
|
что за бред
ИЗ РегистрСведений.СписанныеТовары КАК СписанныеТовары ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки( &Дат, Номенклатура В (ВЫБРАТЬ РегистрСведений.СписанныеТовары.Номенклатура ИЗ РегистрСведений здесь циклит |
|||
15
RomanYS
16.05.21
✎
21:41
|
(14) Это не бред. Использовать отборы в параметрах ВТ - почти обязательное правило. Конкретно без этого точно будет хуже, если конечно они каждый день весь ассортимент не продают.
|
|||
16
Ivan_495
16.05.21
✎
21:55
|
ну хотя бы в вт сначала отобранную номенклатуру положить , а вообще профайле смотреть надо.
|
|||
17
RomanYS
16.05.21
✎
22:10
|
(16) Ну это уже много раз выше предложили. Другой вопрос насколько эффективно, движения с отбором по регистратору по идее и так должны быстро читаться. Не факт что создать ВТ и читать из неё будет прямо заметно быстрее, но выглядит логично. Основные тормоза в соединении. И не факт что запрос удастся ускорить на порядок, а ускорение в 2-3 раза всех проблем не решит, поэтому выход в (4)
|
|||
18
xXeNoNx
16.05.21
✎
22:14
|
(15) А использование подзапросов в запросе прямо идеально, так?
|
|||
19
Ivan_495
16.05.21
✎
22:14
|
если в join ах действительно много отборов, убирать отборы и смотреть скорость
|
|||
20
xXeNoNx
16.05.21
✎
22:16
|
(17) ну ну..., соединение с подзапрсом будет идеально читаться, а про ошибки оптимизатора при соединении с подзапросом слыхали?
|
|||
21
xXeNoNx
16.05.21
✎
22:17
|
(15) >> Конкретно без этого точно будет хуже - ой не факт
|
|||
22
Ivan_495
16.05.21
✎
22:18
|
узнать как работает оптимизатор 1с можно только в профайлере
|
|||
23
Ivan_495
16.05.21
✎
22:19
|
либо упрощая запросик
|
|||
24
xXeNoNx
16.05.21
✎
22:21
|
(22) в чем мысль?
|
|||
25
Ivan_495
16.05.21
✎
22:22
|
пусть (0) профайлер покажет
|
|||
26
Ivan_495
16.05.21
✎
22:24
|
и фигню про которую (7) пишет убрать
|
|||
27
RomanYS
16.05.21
✎
22:29
|
(18) 1. "Прочитать" таблицу остатков целиком в среднем явно большее зло.
2. Использование временной таблицы от подзапроса к ней вроде не освобождает. Мне как бы чтение много раз из базы тоже не нравится на подсознательном уровне, но в данном случае сомневаюсь что это решит проблему. (20) где здесь соединение с подзапросом? |
|||
28
RomanYS
16.05.21
✎
22:33
|
(21) В среднем будет хуже, если у тебя остатков по десятку тысяч позиций, а в накладной десяток позиций - точно будет медленнее без отбора. В данном конкретном случае может и не быть медленнее, если в этой рознице за день в среднем продается 50-100% ассортимента
|
|||
29
Ivan_495
16.05.21
✎
22:33
|
нужно сделать запрос , как в (9) потом сохранить его в вт и уже с этой маленкой вт играться с отборами, тогда все будет летать
|
|||
30
xXeNoNx
16.05.21
✎
22:34
|
(27) Соединение с виртуальной таблицей посмотри как разворачивается + твои отборы этой виртуальной таблицей
1. Никто не говорит что читать нужно всю таблицу остатков 2. Использование временной таблицы освобождает от соединения с подзапросом, подзапросом...., |
|||
31
xXeNoNx
16.05.21
✎
22:38
|
(28) -> (30) Соединение с виртуальной таблицей остатков(считай с подзапросом) отбор обязательно нужен. но никак не в соединении
|
|||
32
Ivan_495
16.05.21
✎
22:44
|
запрос ТС может обрабатывать миллиарды строк, после отбора по номенклатуре и помещения этого отбора в вт , мы уже работаем с таблицей в 700 строк ))
|
|||
33
xXeNoNx
16.05.21
✎
22:53
|
(32) врятли
ГДЕ СписанныеТовары.Регистратор = &ОсновнойДокумент |
|||
34
RomanYS
16.05.21
✎
22:58
|
(32) вроде для этого и нужен отбор в параметрах виртуальной таблицы.
(31) о, хоть понятно стало про какие подзапросы идёт речь. Именно что не в соединении а параметрах. Ладно, что-то я запутался что вы предлагаете. Против (8) я не возражаю, сам бы так сделал. Но на порядок это не ускорит (33) кстати по идее это условие как раз правильнее в соединение засунуть, хотя оптимизатор наверняка это сам разруливает |
|||
35
Cthulhu
16.05.21
✎
23:15
|
https://its.1c.ru/db/metod8dev#content:5842:hdoc
(не один пункт причем) |
|||
36
xXeNoNx
16.05.21
✎
23:19
|
(34) Вынос запроса к вирт таблице остатков в подзапрос, вычисление полей соединений заранее, не в параметрах соединения
|
|||
37
xXeNoNx
16.05.21
✎
23:23
|
(36) подзапрос = ВТ
|
|||
38
RomanYS
16.05.21
✎
23:41
|
(36) я только "за", только не очень очевидно что им как вычислить заранее.
Кстати в статье от 2013 года утверждается, что (8) даёт ускорение почти на порядок https://infostart.ru/1c/articles/191732/ |
|||
39
RomanYS
16.05.21
✎
23:59
|
(36) В актуальной УПП кстати как раз остатки собираются в ВрТ без какого-либо вычисления полей, дальнейшее соединение - чисто как в (0). И (8) там тоже нет.
|
|||
40
aptomilov
17.05.21
✎
07:54
|
По (4) да там есть в уч политике проводить партии сразу или потом, если потом то проведение партий не исполнятся и запрос тоже.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |