Оптимизация запроса текущих дел распоряжений на поступление
Доброго дня.
Имеем УТ 11.3.3.178. Стал замечать, что текущие дела обновляются очень долго, а зачастую вообще фоновое аварийно завершается.
Смотрю замеры методики APDEX по ключевой операции "Обновление текущих дел%".
Оказывается, что "Обновление текущих дел. Распоряжения на поступление" формируется более часа.
Лезу в код Обработки.УправлениеПоступлением.ПриЗаполненииСпискаТекущихДел() и вижу того самого пресловутого виновника:
Переписал с созданием вспомогательной временной таблицей:
Но разница во времени исполнения совсем незначительная (3000с против 2500с).
Конечно, на остатках висит много всего аж с 2015 года (так у нас работает склад). Но может можно все-таки его адаптировать? Или сначала остатки закрыть?
ЗЫ: Завтра постараюсь планы запросов предоставить. Но может кто-то наметённым глазом уже увидит.
Имеем УТ 11.3.3.178. Стал замечать, что текущие дела обновляются очень долго, а зачастую вообще фоновое аварийно завершается.
Смотрю замеры методики APDEX по ключевой операции "Обновление текущих дел%".
Оказывается, что "Обновление текущих дел. Распоряжения на поступление" формируется более часа.
Лезу в код Обработки.УправлениеПоступлением.ПриЗаполненииСпискаТекущихДел() и вижу того самого пресловутого виновника:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВсеРаспоряжения.ДокументПоступления) КАК ЗначениеПоказателя,
ВсеРаспоряжения.Склад
ПОМЕСТИТЬ ВТРасшифровка
ИЗ
(ВЫБРАТЬ
СоглашенияСПоставщиками.Ссылка КАК ДокументПоступления,
СоглашенияСПоставщиками.Склад КАК Склад
ИЗ
Справочник.СоглашенияСПоставщиками КАК СоглашенияСПоставщиками
ГДЕ
СоглашенияСПоставщиками.ВариантПриемкиТоваров = ЗНАЧЕНИЕ(Перечисление.ВариантыПриемкиТоваров.МожетПроисходитьБезЗаказовИНакладных)
И СоглашенияСПоставщиками.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыСоглашенийСПоставщиками.Действует)
И НЕ СоглашенияСПоставщиками.ПометкаУдаления
И (СоглашенияСПоставщиками.Склад = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
ИЛИ СоглашенияСПоставщиками.Склад.ИспользоватьОрдернуюСхемуПриПоступлении)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ТоварыКПоступлению.ДокументПоступления,
ТоварыКПоступлению.Склад
ИЗ
(ВЫБРАТЬ
ТоварыКПоступлениюОстаткиНаДату.ДокументПоступления КАК ДокументПоступления,
ТоварыКПоступлениюОстаткиНаДату.Склад КАК Склад,
МИНИМУМ(ВЫБОР
КОГДА ТоварыКПоступлениюОстаткиНаДату.КПоступлениюОстаток - ТоварыКПоступлениюОстаткиНаДату.ПринимаетсяОстаток < 0
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ) КАК Перепоставка
ИЗ
РегистрНакопления.ТоварыКПоступлению.Остатки(&ДатаПоступления, Склад.ИспользоватьОрдернуюСхемуПриПоступлении) КАК ТоварыКПоступлениюОстаткиНаДату
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыКПоступлению.Остатки(, Склад.ИспользоватьОрдернуюСхемуПриПоступлении) КАК ТоварыКПоступлениюОстаткиТекущие
ПО ТоварыКПоступлениюОстаткиНаДату.ДокументПоступления = ТоварыКПоступлениюОстаткиТекущие.ДокументПоступления
И ТоварыКПоступлениюОстаткиНаДату.Номенклатура = ТоварыКПоступлениюОстаткиТекущие.Номенклатура
И ТоварыКПоступлениюОстаткиНаДату.Характеристика = ТоварыКПоступлениюОстаткиТекущие.Характеристика
И ТоварыКПоступлениюОстаткиНаДату.Склад = ТоварыКПоступлениюОстаткиТекущие.Склад
СГРУППИРОВАТЬ ПО
ТоварыКПоступлениюОстаткиНаДату.ДокументПоступления,
ТоварыКПоступлениюОстаткиНаДату.Склад) КАК ТоварыКПоступлению
ГДЕ
НЕ ТоварыКПоступлению.Перепоставка) КАК ВсеРаспоряжения
СГРУППИРОВАТЬ ПО
ВсеРаспоряжения.Склад
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТРасшифровка.ЗначениеПоказателя + ЕСТЬNULL(ВТРасшифровкаБезСклада.ЗначениеПоказателя, 0) КАК ЗначениеПоказателя,
ВТРасшифровка.Склад
ИЗ
ВТРасшифровка КАК ВТРасшифровка
ЛЕВОЕ СОЕДИНЕНИЕ ВТРасшифровка КАК ВТРасшифровкаБезСклада
ПО (ВТРасшифровкаБезСклада.Склад = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка))
ГДЕ
ВТРасшифровка.Склад <> ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
ПоказатьПереписал с созданием вспомогательной временной таблицей:
ВЫБРАТЬ
ТоварыКПоступлениюОстаткиНаДату.ДокументПоступления,
ТоварыКПоступлениюОстаткиНаДату.Номенклатура,
ТоварыКПоступлениюОстаткиНаДату.Характеристика,
ТоварыКПоступлениюОстаткиНаДату.Склад,
ТоварыКПоступлениюОстаткиНаДату.КПоступлениюОстаток,
ТоварыКПоступлениюОстаткиНаДату.ПринимаетсяОстаток
ПОМЕСТИТЬ ВТ_ТоварыКПоступлениюОстаткиНаДату
ИЗ
РегистрНакопления.ТоварыКПоступлению.Остатки(&ДатаПоступления, Склад.ИспользоватьОрдернуюСхемуПриПоступлении) КАК ТоварыКПоступлениюОстаткиНаДату
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВсеРаспоряжения.ДокументПоступления) КАК ЗначениеПоказателя,
ВсеРаспоряжения.Склад
ПОМЕСТИТЬ ВТРасшифровка
ИЗ
(ВЫБРАТЬ
СоглашенияСПоставщиками.Ссылка КАК ДокументПоступления,
СоглашенияСПоставщиками.Склад КАК Склад
ИЗ
Справочник.СоглашенияСПоставщиками КАК СоглашенияСПоставщиками
ГДЕ
СоглашенияСПоставщиками.ВариантПриемкиТоваров = ЗНАЧЕНИЕ(Перечисление.ВариантыПриемкиТоваров.МожетПроисходитьБезЗаказовИНакладных)
И СоглашенияСПоставщиками.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыСоглашенийСПоставщиками.Действует)
И НЕ СоглашенияСПоставщиками.ПометкаУдаления
И (СоглашенияСПоставщиками.Склад = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
ИЛИ СоглашенияСПоставщиками.Склад.ИспользоватьОрдернуюСхемуПриПоступлении)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ТоварыКПоступлению.ДокументПоступления,
ТоварыКПоступлению.Склад
ИЗ
(ВЫБРАТЬ
ТоварыКПоступлениюОстаткиНаДату.ДокументПоступления КАК ДокументПоступления,
ТоварыКПоступлениюОстаткиНаДату.Склад КАК Склад,
МИНИМУМ(ВЫБОР
КОГДА ТоварыКПоступлениюОстаткиНаДату.КПоступлениюОстаток - ТоварыКПоступлениюОстаткиНаДату.ПринимаетсяОстаток < 0
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ) КАК Перепоставка
ИЗ
ВТ_ТоварыКПоступлениюОстаткиНаДату КАК ТоварыКПоступлениюОстаткиНаДату
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыКПоступлению.Остатки(
,
(ДокументПоступления, Номенклатура, Характеристика) В
(ВЫБРАТЬ
ВТ_ТоварыКПоступлениюОстаткиНаДату.ДокументПоступления,
ВТ_ТоварыКПоступлениюОстаткиНаДату.Номенклатура,
ВТ_ТоварыКПоступлениюОстаткиНаДату.Характеристика
ИЗ
ВТ_ТоварыКПоступлениюОстаткиНаДату)
И Склад.ИспользоватьОрдернуюСхемуПриПоступлении) КАК ТоварыКПоступлениюОстаткиТекущие
ПО ТоварыКПоступлениюОстаткиНаДату.ДокументПоступления = ТоварыКПоступлениюОстаткиТекущие.ДокументПоступления
И ТоварыКПоступлениюОстаткиНаДату.Номенклатура = ТоварыКПоступлениюОстаткиТекущие.Номенклатура
И ТоварыКПоступлениюОстаткиНаДату.Характеристика = ТоварыКПоступлениюОстаткиТекущие.Характеристика
И ТоварыКПоступлениюОстаткиНаДату.Склад = ТоварыКПоступлениюОстаткиТекущие.Склад
СГРУППИРОВАТЬ ПО
ТоварыКПоступлениюОстаткиНаДату.ДокументПоступления,
ТоварыКПоступлениюОстаткиНаДату.Склад) КАК ТоварыКПоступлению
ГДЕ
НЕ ТоварыКПоступлению.Перепоставка) КАК ВсеРаспоряжения
СГРУППИРОВАТЬ ПО
ВсеРаспоряжения.Склад
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТРасшифровка.ЗначениеПоказателя + ЕСТЬNULL(ВТРасшифровкаБезСклада.ЗначениеПоказателя, 0) КАК ЗначениеПоказателя,
ВТРасшифровка.Склад
ИЗ
ВТРасшифровка КАК ВТРасшифровка
ЛЕВОЕ СОЕДИНЕНИЕ ВТРасшифровка КАК ВТРасшифровкаБезСклада
ПО (ВТРасшифровкаБезСклада.Склад = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка))
ГДЕ
ВТРасшифровка.Склад <> ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
ПоказатьНо разница во времени исполнения совсем незначительная (3000с против 2500с).
Конечно, на остатках висит много всего аж с 2015 года (так у нас работает склад). Но может можно все-таки его адаптировать? Или сначала остатки закрыть?
ЗЫ: Завтра постараюсь планы запросов предоставить. Но может кто-то наметённым глазом уже увидит.
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
2. Сколько записей в ВТ_ТоварыКПоступлениюОстаткиНаДату?
Если много то:
а) индексировать по полям соединения
б) перенести во вложенный запрос в ВТ_Расшифровка
Если записей миллионы, то очень много времени будет занимать создание временной таблицы. Если оперативной памяти ей не хватит, то СУБД скинет ее на диск, что будет сильно тормозить
Если много то:
а) индексировать по полям соединения
б) перенести во вложенный запрос в ВТ_Расшифровка
Если записей миллионы, то очень много времени будет занимать создание временной таблицы. Если оперативной памяти ей не хватит, то СУБД скинет ее на диск, что будет сильно тормозить
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыКПоступлению.Остатки(
,
(ДокументПоступления, Номенклатура, Характеристика) В
(ВЫБРАТЬ
ВТ_ТоварыКПоступлениюОстаткиНаДату.ДокументПоступления,
ВТ_ТоварыКПоступлениюОстаткиНаДату.Номенклатура,
ВТ_ТоварыКПоступлениюОстаткиНаДату.Характеристика
ИЗ
ВТ_ТоварыКПоступлениюОстаткиНаДату)
И Склад.ИспользоватьОрдернуюСхемуПриПоступлении) КАК ТоварыКПоступлениюОстаткиТекущие
Переписать на внутреннее соединение с ВТ_ТоварыКПоступлениюОстаткиНаДату
,
(ДокументПоступления, Номенклатура, Характеристика) В
(ВЫБРАТЬ
ВТ_ТоварыКПоступлениюОстаткиНаДату.ДокументПоступления,
ВТ_ТоварыКПоступлениюОстаткиНаДату.Номенклатура,
ВТ_ТоварыКПоступлениюОстаткиНаДату.Характеристика
ИЗ
ВТ_ТоварыКПоступлениюОстаткиНаДату)
И Склад.ИспользоватьОрдернуюСхемуПриПоступлении) КАК ТоварыКПоступлениюОстаткиТекущие
Переписать на внутреннее соединение с ВТ_ТоварыКПоступлениюОстаткиНаДату
(3) точнее вообще выпилить
(ДокументПоступления, Номенклатура, Характеристика) В
(ВЫБРАТЬ
ВТ_ТоварыКПоступлениюОстаткиНаДату.ДокументПоступления,
ВТ_ТоварыКПоступлениюОстаткиНаДату.Номенклатура,
ВТ_ТоварыКПоступлениюОстаткиНаДату.Характеристика
ИЗ
ВТ_ТоварыКПоступлениюОстаткиНаДату)
Это не имеет смысла
(ДокументПоступления, Номенклатура, Характеристика) В
(ВЫБРАТЬ
ВТ_ТоварыКПоступлениюОстаткиНаДату.ДокументПоступления,
ВТ_ТоварыКПоступлениюОстаткиНаДату.Номенклатура,
ВТ_ТоварыКПоступлениюОстаткиНаДату.Характеристика
ИЗ
ВТ_ТоварыКПоступлениюОстаткиНаДату)
Это не имеет смысла
2. Сколько записей в ВТ_ТоварыКПоступлениюОстаткиНаДату?
Если много то:
а) индексировать по полям соединения
б) перенести во вложенный запрос в ВТ_Расшифровка
Если записей миллионы, то очень много времени будет занимать создание временной таблицы. Если оперативной памяти ей не хватит, то СУБД скинет ее на диск, что будет сильно тормозить
Если много то:
а) индексировать по полям соединения
б) перенести во вложенный запрос в ВТ_Расшифровка
Если записей миллионы, то очень много времени будет занимать создание временной таблицы. Если оперативной памяти ей не хватит, то СУБД скинет ее на диск, что будет сильно тормозить
(5) Нашёл ещё одно обновление текущего дела - Документы.РеализацииТоваровУслуг.ПриЗаполненииСпискаТекущихДел();
Порядка 30с выполняется, что тоже неприемлимо. Но тут же объединения... такой трюк не прокатит
Ппикрепил план.
ВЫБРАТЬ РАЗРЕШЕННЫЕ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеПоДокументам.РаспоряженияНаОформлениеРеализацийТоваровИУслугВсегоВРаботе) КАК РаспоряженияНаОформлениеРеализацийТоваровИУслугВсегоВРаботе,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеПоДокументам.РаспоряженияНаОформлениеРеализацийТоваровИУслугНаСегодня) КАК РаспоряженияНаОформлениеРеализацийТоваровИУслугНаСегодня,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеПоДокументам.РеализацииТоваровИУслугКПредоплате) КАК РеализацииТоваровИУслугКПредоплате
ИЗ
(ВЫБРАТЬ
ЗаказыКОформлению.Ссылка КАК РаспоряженияНаОформлениеРеализацийТоваровИУслугВсегоВРаботе,
NULL КАК РаспоряженияНаОформлениеРеализацийТоваровИУслугНаСегодня,
NULL КАК РеализацииТоваровИУслугКПредоплате
ИЗ
(ВЫБРАТЬ
ЗаказыКлиентов.ЗаказКлиента КАК Ссылка,
НЕОПРЕДЕЛЕНО КАК Склад,
НЕОПРЕДЕЛЕНО КАК Номенклатура,
НЕОПРЕДЕЛЕНО КАК Характеристика,
НЕОПРЕДЕЛЕНО КАК Серия
ИЗ
РегистрНакопления.ЗаказыКлиентов.ОстаткиИОбороты(
,
,
,
,
ЗаказКлиента ССЫЛКА Документ.ЗаказКлиента
ИЛИ ЗаказКлиента ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента) КАК ЗаказыКлиентов
ГДЕ
ЗаказыКлиентов.КОформлениюКонечныйОстаток > 0
И ЗаказыКлиентов.ЗаказКлиента.Ссылка ЕСТЬ НЕ NULL
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ТоварыКОтгрузке.ДокументОтгрузки,
ТоварыКОтгрузке.Склад,
ТоварыКОтгрузке.Номенклатура,
ТоварыКОтгрузке.Характеристика,
ТоварыКОтгрузке.Серия
ИЗ
РегистрНакопления.ТоварыКОтгрузке.ОстаткиИОбороты(
,
,
,
,
ДокументОтгрузки ССЫЛКА Документ.ЗаказКлиента
ИЛИ ДокументОтгрузки ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента
ИЛИ ДокументОтгрузки ССЫЛКА Документ.РеализацияТоваровУслуг) КАК ТоварыКОтгрузке
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыКОтгрузке.ОстаткиИОбороты(
,
,
,
,
ДокументОтгрузки ССЫЛКА Документ.ЗаказКлиента
ИЛИ ДокументОтгрузки ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента
ИЛИ ДокументОтгрузки ССЫЛКА Документ.РеализацияТоваровУслуг) КАК ТоварыКОтгрузкеОстаткиИОбороты
ПО ТоварыКОтгрузке.ДокументОтгрузки = ТоварыКОтгрузкеОстаткиИОбороты.ДокументОтгрузки
И ТоварыКОтгрузке.Склад = ТоварыКОтгрузкеОстаткиИОбороты.Склад
ГДЕ
(ТоварыКОтгрузке.КОтгрузкеКонечныйОстаток - ТоварыКОтгрузке.СобраноКонечныйОстаток > 0
ИЛИ ТоварыКОтгрузке.КОформлениюКонечныйОстаток > 0)
И ТоварыКОтгрузке.Склад.ИспользоватьОрдернуюСхемуПриОтгрузке
И ТоварыКОтгрузке.ДокументОтгрузки.Ссылка ЕСТЬ НЕ NULL
И ТоварыКОтгрузке.Склад.ДатаНачалаОрдернойСхемыПриОтгрузке <= &ТекущаяДата) КАК ЗаказыКОформлению
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
NULL,
ЗаказыКОформлениюНаСегодня.Ссылка,
NULL
ИЗ
(ВЫБРАТЬ
ЗаказыКлиентов.ЗаказКлиента КАК Ссылка,
НЕОПРЕДЕЛЕНО КАК Склад,
НЕОПРЕДЕЛЕНО КАК Номенклатура,
НЕОПРЕДЕЛЕНО КАК Характеристика,
НЕОПРЕДЕЛЕНО КАК Серия
ИЗ
РегистрНакопления.ЗаказыКлиентов.ОстаткиИОбороты(
&ТекущаяДата,
,
,
,
ЗаказКлиента ССЫЛКА Документ.ЗаказКлиента
ИЛИ ЗаказКлиента ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента) КАК ЗаказыКлиентов
ГДЕ
ЗаказыКлиентов.КОформлениюКонечныйОстаток > 0
И ЗаказыКлиентов.ЗаказКлиента.Ссылка ЕСТЬ НЕ NULL
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ТоварыКОтгрузке.ДокументОтгрузки,
ТоварыКОтгрузке.Склад,
ТоварыКОтгрузке.Номенклатура,
ТоварыКОтгрузке.Характеристика,
ТоварыКОтгрузке.Серия
ИЗ
РегистрНакопления.ТоварыКОтгрузке.ОстаткиИОбороты(
&ТекущаяДата,
,
,
,
ДокументОтгрузки ССЫЛКА Документ.ЗаказКлиента
ИЛИ ДокументОтгрузки ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента
ИЛИ ДокументОтгрузки ССЫЛКА Документ.РеализацияТоваровУслуг) КАК ТоварыКОтгрузке
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыКОтгрузке.ОстаткиИОбороты(
,
,
,
,
ДокументОтгрузки ССЫЛКА Документ.ЗаказКлиента
ИЛИ ДокументОтгрузки ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента
ИЛИ ДокументОтгрузки ССЫЛКА Документ.РеализацияТоваровУслуг) КАК ТоварыКОтгрузкеОстаткиИОбороты
ПО ТоварыКОтгрузке.ДокументОтгрузки = ТоварыКОтгрузкеОстаткиИОбороты.ДокументОтгрузки
И ТоварыКОтгрузке.Склад = ТоварыКОтгрузкеОстаткиИОбороты.Склад
ГДЕ
(ТоварыКОтгрузке.КОтгрузкеКонечныйОстаток - ТоварыКОтгрузке.СобраноКонечныйОстаток > 0
ИЛИ ТоварыКОтгрузке.КОформлениюКонечныйОстаток > 0)
И ТоварыКОтгрузке.Склад.ИспользоватьОрдернуюСхемуПриОтгрузке
И ТоварыКОтгрузке.ДокументОтгрузки.Ссылка ЕСТЬ НЕ NULL
И ТоварыКОтгрузке.Склад.ДатаНачалаОрдернойСхемыПриОтгрузке <= &ТекущаяДата) КАК ЗаказыКОформлениюНаСегодня
ОБЪЕДИНИТЬ
ВЫБРАТЬ РАЗЛИЧНЫЕ
NULL,
NULL,
NULL
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
РеализацияТоваровУслуг.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыРеализацийТоваровУслуг.ВПути)
И РеализацияТоваровУслуг.Менеджер = &Пользователь
И НЕ РеализацияТоваровУслуг.ПометкаУдаления
ОБЪЕДИНИТЬ
ВЫБРАТЬ РАЗЛИЧНЫЕ
NULL,
NULL,
РеализацияТоваровУслуг.Ссылка
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
РеализацияТоваровУслуг.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыРеализацийТоваровУслуг.КПредоплате)
И РеализацияТоваровУслуг.Менеджер = &Пользователь
И НЕ РеализацияТоваровУслуг.ПометкаУдаления) КАК ДанныеПоДокументам
ПоказатьПорядка 30с выполняется, что тоже неприемлимо. Но тут же объединения... такой трюк не прокатит
Ппикрепил план.
Прикрепленные файлы:
Plan.txt
(8) В последнем релизе УТ такая же шляпа:
Похоже, что это делают специально.
Его невозможно переписать, если требуются оборотные данные за весь период.
РегистрНакопления.ТоварыКОтгрузке.ОстаткиИОбороты(,,,)
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыКОтгрузке.ОстаткиИОбороты(,,,)
Похоже, что это делают специально.
Его невозможно переписать, если требуются оборотные данные за весь период.
(8) Переписал. Убрал лишние соединения, обращаюсь к таблице остатков.
Запрос выполняется 0.1с вместо 30с.
Не могу понять, зачем проверка на Поле.Ссылка ЕСТЬ НЕ NULL. Подскажете? Я убрал лишнее обращение к ссылке. Может есть какая хитрость?
ВЫБРАТЬ РАЗРЕШЕННЫЕ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеПоДокументам.РаспоряженияНаОформлениеРеализацийТоваровИУслугВсегоВРаботе) КАК РаспоряженияНаОформлениеРеализацийТоваровИУслугВсегоВРаботе,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеПоДокументам.РаспоряженияНаОформлениеРеализацийТоваровИУслугНаСегодня) КАК РаспоряженияНаОформлениеРеализацийТоваровИУслугНаСегодня,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеПоДокументам.РеализацииТоваровИУслугВПути) КАК РеализацииТоваровИУслугВПути,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеПоДокументам.РеализацииТоваровИУслугКПредоплате) КАК РеализацииТоваровИУслугКПредоплате
ИЗ
(ВЫБРАТЬ
ЗаказыКОформлению.Ссылка КАК РаспоряженияНаОформлениеРеализацийТоваровИУслугВсегоВРаботе,
NULL КАК РаспоряженияНаОформлениеРеализацийТоваровИУслугНаСегодня,
NULL КАК РеализацииТоваровИУслугВПути,
NULL КАК РеализацииТоваровИУслугКПредоплате
ИЗ
(ВЫБРАТЬ
ЗаказыКлиентовОстатки.ЗаказКлиента КАК Ссылка,
НЕОПРЕДЕЛЕНО КАК Склад,
НЕОПРЕДЕЛЕНО КАК Номенклатура,
НЕОПРЕДЕЛЕНО КАК Характеристика,
НЕОПРЕДЕЛЕНО КАК Серия
ИЗ
РегистрНакопления.ЗаказыКлиентов.Остатки(, ) КАК ЗаказыКлиентовОстатки
ГДЕ
(ЗаказыКлиентовОстатки.ЗаказКлиента ССЫЛКА Документ.ЗаказКлиента
ИЛИ ЗаказыКлиентовОстатки.ЗаказКлиента ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента)
И ЗаказыКлиентовОстатки.КОформлениюОстаток > 0
И ЗаказыКлиентовОстатки.ЗаказКлиента ЕСТЬ НЕ NULL
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ТоварыКОтгрузкеОстатки.ДокументОтгрузки,
ТоварыКОтгрузкеОстатки.Склад,
ТоварыКОтгрузкеОстатки.Номенклатура,
ТоварыКОтгрузкеОстатки.Характеристика,
ТоварыКОтгрузкеОстатки.Серия
ИЗ
РегистрНакопления.ТоварыКОтгрузке.Остатки(, ) КАК ТоварыКОтгрузкеОстатки
ГДЕ
(ТоварыКОтгрузкеОстатки.ДокументОтгрузки ССЫЛКА Документ.ЗаказКлиента
ИЛИ ТоварыКОтгрузкеОстатки.ДокументОтгрузки ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента
ИЛИ ТоварыКОтгрузкеОстатки.ДокументОтгрузки ССЫЛКА Документ.РеализацияТоваровУслуг)
И (ТоварыКОтгрузкеОстатки.КОтгрузкеОстаток - ТоварыКОтгрузкеОстатки.СобраноОстаток > 0
ИЛИ ТоварыКОтгрузкеОстатки.КОформлениюОстаток > 0)
И ТоварыКОтгрузкеОстатки.Склад.ИспользоватьОрдернуюСхемуПриОтгрузке
И ТоварыКОтгрузкеОстатки.ДокументОтгрузки ЕСТЬ НЕ NULL
И ТоварыКОтгрузкеОстатки.Склад.ИспользоватьОрдернуюСхемуПриОтгрузке
И ТоварыКОтгрузкеОстатки.Склад.ДатаНачалаОрдернойСхемыПриОтгрузке <= &ТекущаяДата) КАК ЗаказыКОформлению
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
NULL,
ЗаказыКОформлениюНаСегодня.Ссылка,
NULL,
NULL
ИЗ
(ВЫБРАТЬ
ЗаказыКлиентовОстаткиНаДату.ЗаказКлиента КАК Ссылка,
НЕОПРЕДЕЛЕНО КАК Склад,
НЕОПРЕДЕЛЕНО КАК Номенклатура,
НЕОПРЕДЕЛЕНО КАК Характеристика,
НЕОПРЕДЕЛЕНО КАК Серия
ИЗ
РегистрНакопления.ЗаказыКлиентов.Остатки(&ТекущаяДата, ) КАК ЗаказыКлиентовОстаткиНаДату
ГДЕ
(ЗаказыКлиентовОстаткиНаДату.ЗаказКлиента ССЫЛКА Документ.ЗаказКлиента
ИЛИ ЗаказыКлиентовОстаткиНаДату.ЗаказКлиента ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента)
И ЗаказыКлиентовОстаткиНаДату.КОформлениюОстаток > 0
И ЗаказыКлиентовОстаткиНаДату.ЗаказКлиента ЕСТЬ НЕ NULL
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ТоварыКОтгрузкеОстаткиНаДату.ДокументОтгрузки,
ТоварыКОтгрузкеОстаткиНаДату.Склад,
ТоварыКОтгрузкеОстаткиНаДату.Номенклатура,
ТоварыКОтгрузкеОстаткиНаДату.Характеристика,
ТоварыКОтгрузкеОстаткиНаДату.Серия
ИЗ
РегистрНакопления.ТоварыКОтгрузке.Остатки(&ТекущаяДата, ) КАК ТоварыКОтгрузкеОстаткиНаДату
ГДЕ
(ТоварыКОтгрузкеОстаткиНаДату.ДокументОтгрузки ССЫЛКА Документ.ЗаказКлиента
ИЛИ ТоварыКОтгрузкеОстаткиНаДату.ДокументОтгрузки ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента
ИЛИ ТоварыКОтгрузкеОстаткиНаДату.ДокументОтгрузки ССЫЛКА Документ.РеализацияТоваровУслуг)
И (ТоварыКОтгрузкеОстаткиНаДату.КОтгрузкеОстаток - ТоварыКОтгрузкеОстаткиНаДату.СобраноОстаток > 0
ИЛИ ТоварыКОтгрузкеОстаткиНаДату.КОформлениюОстаток > 0)
И ТоварыКОтгрузкеОстаткиНаДату.Склад.ИспользоватьОрдернуюСхемуПриОтгрузке
И ТоварыКОтгрузкеОстаткиНаДату.ДокументОтгрузки ЕСТЬ НЕ NULL
И ТоварыКОтгрузкеОстаткиНаДату.Склад.ДатаНачалаОрдернойСхемыПриОтгрузке <= &ТекущаяДата) КАК ЗаказыКОформлениюНаСегодня
ОБЪЕДИНИТЬ
ВЫБРАТЬ РАЗЛИЧНЫЕ
NULL,
NULL,
РеализацияТоваровУслуг.Ссылка,
NULL
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
РеализацияТоваровУслуг.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыРеализацийТоваровУслуг.ВПути)
И РеализацияТоваровУслуг.Менеджер = &Пользователь
И НЕ РеализацияТоваровУслуг.ПометкаУдаления
ОБЪЕДИНИТЬ
ВЫБРАТЬ РАЗЛИЧНЫЕ
NULL,
NULL,
NULL,
РеализацияТоваровУслуг.Ссылка
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
РеализацияТоваровУслуг.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыРеализацийТоваровУслуг.КПредоплате)
И РеализацияТоваровУслуг.Менеджер = &Пользователь
И НЕ РеализацияТоваровУслуг.ПометкаУдаления) КАК ДанныеПоДокументам
ПоказатьЗапрос выполняется 0.1с вместо 30с.
Не могу понять, зачем проверка на Поле.Ссылка ЕСТЬ НЕ NULL. Подскажете? Я убрал лишнее обращение к ссылке. Может есть какая хитрость?
ВЫБРАТЬ
ТоварыКОтгрузке.ДокументОтгрузки,
ТоварыКОтгрузке.Склад,
ТоварыКОтгрузке.Номенклатура,
ТоварыКОтгрузке.Характеристика,
ТоварыКОтгрузке.Серия
ИЗ
РегистрНакопления.ТоварыКОтгрузке.ОстаткиИОбороты(
,
,
,
,
ДокументОтгрузки ССЫЛКА Документ.ЗаказКлиента
ИЛИ ДокументОтгрузки ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента
ИЛИ ДокументОтгрузки ССЫЛКА Документ.РеализацияТоваровУслуг) КАК ТоварыКОтгрузке
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыКОтгрузке.ОстаткиИОбороты(
,
,
,
,
ДокументОтгрузки ССЫЛКА Документ.ЗаказКлиента
ИЛИ ДокументОтгрузки ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента
ИЛИ ДокументОтгрузки ССЫЛКА Документ.РеализацияТоваровУслуг) КАК ТоварыКОтгрузкеОстаткиИОбороты
ПО ТоварыКОтгрузке.ДокументОтгрузки = ТоварыКОтгрузкеОстаткиИОбороты.ДокументОтгрузки
И ТоварыКОтгрузке.Склад = ТоварыКОтгрузкеОстаткиИОбороты.Склад
ГДЕ
(ТоварыКОтгрузке.КОтгрузкеКонечныйОстаток - ТоварыКОтгрузке.СобраноКонечныйОстаток > 0
ИЛИ ТоварыКОтгрузке.КОформлениюКонечныйОстаток > 0)
И ТоварыКОтгрузке.Склад.ИспользоватьОрдернуюСхемуПриОтгрузке
И ТоварыКОтгрузке.ДокументОтгрузки.Ссылка ЕСТЬ НЕ NULL
И ТоварыКОтгрузке.Склад.ДатаНачалаОрдернойСхемыПриОтгрузке <= &ТекущаяДата) КАК ЗаказыКОформлению
ПоказатьДля Чего сам на себя соединяется?
Отказывайтесь от Или в условиях
ДокументОтгрузки ССЫЛКА Документ.ЗаказКлиента
ИЛИ ДокументОтгрузки ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента
ИЛИ ДокументОтгрузки ССЫЛКА Документ.РеализацияТоваровУслуг
Лучше переписать на внутреннее соединение с шапками документов.
Вообще, лучше выкинуть запрос и построить свою логику с блэкджеком и оптимизацией.
(11) SQL очень любит точное определение параметров без функций и списков(обрабатывает как Или).
Опытным путем было выявлено, что соединение с таблицей документа(документов с объединением результатов) работает быстрее, чем указание типа через Ссылка. На маленьких данных выигрыш копеечный, на больших может быть больше.
Опытным путем было выявлено, что соединение с таблицей документа(документов с объединением результатов) работает быстрее, чем указание типа через Ссылка. На маленьких данных выигрыш копеечный, на больших может быть больше.
(12) В целом, проблема тут:
Данных нереально много, большее время выполняется оно.
ВЫБРАТЬ
ТоварыКОтгрузке.ДокументОтгрузки КАК ДокументОтгрузки,
ТоварыКОтгрузке.Склад КАК Склад,
ТоварыКОтгрузке.Номенклатура КАК Номенклатура,
ТоварыКОтгрузке.Характеристика КАК Характеристика,
ТоварыКОтгрузке.Серия КАК Серия,
ТоварыКОтгрузке.КОтгрузкеКонечныйОстаток КАК КОтгрузкеКонечныйОстаток,
ТоварыКОтгрузке.КОформлениюКонечныйОстаток КАК КОформлениюКонечныйОстаток,
ТоварыКОтгрузке.СобираетсяКонечныйОстаток КАК СобираетсяКонечныйОстаток,
ТоварыКОтгрузке.СобраноКонечныйОстаток КАК СобраноКонечныйОстаток
ИЗ
РегистрНакопления.ТоварыКОтгрузке.ОстаткиИОбороты(, , , , ) КАК ТоварыКОтгрузке
ПоказатьДанных нереально много, большее время выполняется оно.
(17) Да не могу же я у ста человек узнать нужны они или нет. Теоретически руководители ими пользуются. И по умолчанию они обновляются только при загрузке рабочего стола и вручную. Хотя там можно и автообновление указать.
Попробую переписать, обращаясь только к итогам, т.к. движения тут вроде не нужны.
Попробую переписать, обращаясь только к итогам, т.к. движения тут вроде не нужны.
(11) Это типовой запрос, логика мне не до конца ясна. С ИЛИ эксперементировал - скуль 2014 норм съедает.
Предполагаю, что ОстаткиИОбороты вообще не нужны, а достаточно лишь Остатков/Итогов, ведь выводятся данные _КонечныйОстаток.
Даже проверил результаты запросов:
И
Результаты совпадают, а время выполнения 30с против 0.1
Вопрос в том, зачем разработчики использовали ОстаткиИОбороты...
Предполагаю, что ОстаткиИОбороты вообще не нужны, а достаточно лишь Остатков/Итогов, ведь выводятся данные _КонечныйОстаток.
Даже проверил результаты запросов:
ВЫБРАТЬ
ТоварыКОтгрузке.ДокументОтгрузки КАК ДокументОтгрузки,
ТоварыКОтгрузке.Склад КАК Склад,
ТоварыКОтгрузке.Номенклатура КАК Номенклатура,
ТоварыКОтгрузке.Характеристика КАК Характеристика,
ТоварыКОтгрузке.Серия КАК Серия,
ТоварыКОтгрузке.КОтгрузкеКонечныйОстаток КАК КОтгрузкеКонечныйОстаток,
ТоварыКОтгрузке.КОформлениюКонечныйОстаток КАК КОформлениюКонечныйОстаток,
ТоварыКОтгрузке.СобираетсяКонечныйОстаток КАК СобираетсяКонечныйОстаток,
ТоварыКОтгрузке.СобраноКонечныйОстаток КАК СобраноКонечныйОстаток
ИЗ
РегистрНакопления.ТоварыКОтгрузке.ОстаткиИОбороты(, , , , ) КАК ТоварыКОтгрузке
ГДЕ
(ТоварыКОтгрузке.ДокументОтгрузки ССЫЛКА Документ.ЗаказКлиента
ИЛИ ТоварыКОтгрузке.ДокументОтгрузки ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента
ИЛИ ТоварыКОтгрузке.ДокументОтгрузки ССЫЛКА Документ.РеализацияТоваровУслуг)
И (ТоварыКОтгрузке.КОтгрузкеКонечныйОстаток - ТоварыКОтгрузке.СобраноКонечныйОстаток > 0
ИЛИ ТоварыКОтгрузке.КОформлениюКонечныйОстаток > 0)
И ТоварыКОтгрузке.Склад.ИспользоватьОрдернуюСхемуПриОтгрузке
И ТоварыКОтгрузке.ДокументОтгрузки.Ссылка ЕСТЬ НЕ NULL
И ТоварыКОтгрузке.Склад.ДатаНачалаОрдернойСхемыПриОтгрузке <= &ТекущаяДата
ПоказатьИ
ВЫБРАТЬ
ТоварыКОтгрузкеОстатки.ДокументОтгрузки КАК ДокументОтгрузки,
ТоварыКОтгрузкеОстатки.Склад КАК Склад,
ТоварыКОтгрузкеОстатки.Номенклатура КАК Номенклатура,
ТоварыКОтгрузкеОстатки.Характеристика КАК Характеристика,
ТоварыКОтгрузкеОстатки.Серия КАК Серия,
ТоварыКОтгрузкеОстатки.КОтгрузкеОстаток КАК КОтгрузкеОстаток,
ТоварыКОтгрузкеОстатки.КОформлениюОстаток КАК КОформлениюОстаток,
ТоварыКОтгрузкеОстатки.СобираетсяОстаток КАК СобираетсяОстаток,
ТоварыКОтгрузкеОстатки.СобраноОстаток КАК СобраноОстаток
ИЗ
РегистрНакопления.ТоварыКОтгрузке.Остатки(, ) КАК ТоварыКОтгрузкеОстатки
ГДЕ
(ТоварыКОтгрузкеОстатки.ДокументОтгрузки ССЫЛКА Документ.ЗаказКлиента
ИЛИ ТоварыКОтгрузкеОстатки.ДокументОтгрузки ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента
ИЛИ ТоварыКОтгрузкеОстатки.ДокументОтгрузки ССЫЛКА Документ.РеализацияТоваровУслуг)
И (ТоварыКОтгрузкеОстатки.КОтгрузкеОстаток - ТоварыКОтгрузкеОстатки.СобраноОстаток > 0
ИЛИ ТоварыКОтгрузкеОстатки.КОформлениюОстаток > 0)
И ТоварыКОтгрузкеОстатки.Склад.ИспользоватьОрдернуюСхемуПриОтгрузке
И ТоварыКОтгрузкеОстатки.ДокументОтгрузки.Ссылка ЕСТЬ НЕ NULL
И ТоварыКОтгрузкеОстатки.Склад.ДатаНачалаОрдернойСхемыПриОтгрузке <= &ТекущаяДата
ПоказатьРезультаты совпадают, а время выполнения 30с против 0.1
Вопрос в том, зачем разработчики использовали ОстаткиИОбороты...
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот