Оптимизация запроса текущих дел распоряжений на поступление

1. triviumfan 94 31.10.18 23:34 Сейчас в теме
Доброго дня.
Имеем УТ 11.3.3.178. Стал замечать, что текущие дела обновляются очень долго, а зачастую вообще фоновое аварийно завершается.
Смотрю замеры методики APDEX по ключевой операции "Обновление текущих дел%".
Оказывается, что "Обновление текущих дел. Распоряжения на поступление" формируется более часа.
Лезу в код Обработки.УправлениеПоступлением.ПриЗаполненииСпискаТекущихДел() и вижу того самого пресловутого виновника:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВсеРаспоряжения.ДокументПоступления) КАК ЗначениеПоказателя,
	ВсеРаспоряжения.Склад
ПОМЕСТИТЬ ВТРасшифровка
ИЗ
	(ВЫБРАТЬ
		СоглашенияСПоставщиками.Ссылка КАК ДокументПоступления,
		СоглашенияСПоставщиками.Склад КАК Склад
	ИЗ
		Справочник.СоглашенияСПоставщиками КАК СоглашенияСПоставщиками
	ГДЕ
		СоглашенияСПоставщиками.ВариантПриемкиТоваров = ЗНАЧЕНИЕ(Перечисление.ВариантыПриемкиТоваров.МожетПроисходитьБезЗаказовИНакладных)
		И СоглашенияСПоставщиками.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыСоглашенийСПоставщиками.Действует)
		И НЕ СоглашенияСПоставщиками.ПометкаУдаления
		И (СоглашенияСПоставщиками.Склад = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
				ИЛИ СоглашенияСПоставщиками.Склад.ИспользоватьОрдернуюСхемуПриПоступлении)
	
	ОБЪЕДИНИТЬ ВСЕ
	
	ВЫБРАТЬ
		ТоварыКПоступлению.ДокументПоступления,
		ТоварыКПоступлению.Склад
	ИЗ
		(ВЫБРАТЬ
			ТоварыКПоступлениюОстаткиНаДату.ДокументПоступления КАК ДокументПоступления,
			ТоварыКПоступлениюОстаткиНаДату.Склад КАК Склад,
			МИНИМУМ(ВЫБОР
					КОГДА ТоварыКПоступлениюОстаткиНаДату.КПоступлениюОстаток - ТоварыКПоступлениюОстаткиНаДату.ПринимаетсяОстаток < 0
						ТОГДА ИСТИНА
					ИНАЧЕ ЛОЖЬ
				КОНЕЦ) КАК Перепоставка
		ИЗ
			РегистрНакопления.ТоварыКПоступлению.Остатки(&ДатаПоступления, Склад.ИспользоватьОрдернуюСхемуПриПоступлении) КАК ТоварыКПоступлениюОстаткиНаДату
				ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыКПоступлению.Остатки(, Склад.ИспользоватьОрдернуюСхемуПриПоступлении) КАК ТоварыКПоступлениюОстаткиТекущие
				ПО ТоварыКПоступлениюОстаткиНаДату.ДокументПоступления = ТоварыКПоступлениюОстаткиТекущие.ДокументПоступления
					И ТоварыКПоступлениюОстаткиНаДату.Номенклатура = ТоварыКПоступлениюОстаткиТекущие.Номенклатура
					И ТоварыКПоступлениюОстаткиНаДату.Характеристика = ТоварыКПоступлениюОстаткиТекущие.Характеристика
					И ТоварыКПоступлениюОстаткиНаДату.Склад = ТоварыКПоступлениюОстаткиТекущие.Склад
		
		СГРУППИРОВАТЬ ПО
			ТоварыКПоступлениюОстаткиНаДату.ДокументПоступления,
			ТоварыКПоступлениюОстаткиНаДату.Склад) КАК ТоварыКПоступлению
	ГДЕ
		НЕ ТоварыКПоступлению.Перепоставка) КАК ВсеРаспоряжения

СГРУППИРОВАТЬ ПО
	ВсеРаспоряжения.Склад
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТРасшифровка.ЗначениеПоказателя + ЕСТЬNULL(ВТРасшифровкаБезСклада.ЗначениеПоказателя, 0) КАК ЗначениеПоказателя,
	ВТРасшифровка.Склад
ИЗ
	ВТРасшифровка КАК ВТРасшифровка
		ЛЕВОЕ СОЕДИНЕНИЕ ВТРасшифровка КАК ВТРасшифровкаБезСклада
		ПО (ВТРасшифровкаБезСклада.Склад = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка))
ГДЕ
	ВТРасшифровка.Склад <> ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
Показать

Переписал с созданием вспомогательной временной таблицей:
ВЫБРАТЬ
	ТоварыКПоступлениюОстаткиНаДату.ДокументПоступления,
	ТоварыКПоступлениюОстаткиНаДату.Номенклатура,
	ТоварыКПоступлениюОстаткиНаДату.Характеристика,
	ТоварыКПоступлениюОстаткиНаДату.Склад,
	ТоварыКПоступлениюОстаткиНаДату.КПоступлениюОстаток,
	ТоварыКПоступлениюОстаткиНаДату.ПринимаетсяОстаток
ПОМЕСТИТЬ ВТ_ТоварыКПоступлениюОстаткиНаДату
ИЗ
	РегистрНакопления.ТоварыКПоступлению.Остатки(&ДатаПоступления, Склад.ИспользоватьОрдернуюСхемуПриПоступлении) КАК ТоварыКПоступлениюОстаткиНаДату
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВсеРаспоряжения.ДокументПоступления) КАК ЗначениеПоказателя,
	ВсеРаспоряжения.Склад
ПОМЕСТИТЬ ВТРасшифровка
ИЗ
	(ВЫБРАТЬ
		СоглашенияСПоставщиками.Ссылка КАК ДокументПоступления,
		СоглашенияСПоставщиками.Склад КАК Склад
	ИЗ
		Справочник.СоглашенияСПоставщиками КАК СоглашенияСПоставщиками
	ГДЕ
		СоглашенияСПоставщиками.ВариантПриемкиТоваров = ЗНАЧЕНИЕ(Перечисление.ВариантыПриемкиТоваров.МожетПроисходитьБезЗаказовИНакладных)
		И СоглашенияСПоставщиками.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыСоглашенийСПоставщиками.Действует)
		И НЕ СоглашенияСПоставщиками.ПометкаУдаления
		И (СоглашенияСПоставщиками.Склад = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
				ИЛИ СоглашенияСПоставщиками.Склад.ИспользоватьОрдернуюСхемуПриПоступлении)
	
	ОБЪЕДИНИТЬ ВСЕ
	
	ВЫБРАТЬ
		ТоварыКПоступлению.ДокументПоступления,
		ТоварыКПоступлению.Склад
	ИЗ
		(ВЫБРАТЬ
			ТоварыКПоступлениюОстаткиНаДату.ДокументПоступления КАК ДокументПоступления,
			ТоварыКПоступлениюОстаткиНаДату.Склад КАК Склад,
			МИНИМУМ(ВЫБОР
					КОГДА ТоварыКПоступлениюОстаткиНаДату.КПоступлениюОстаток - ТоварыКПоступлениюОстаткиНаДату.ПринимаетсяОстаток < 0
						ТОГДА ИСТИНА
					ИНАЧЕ ЛОЖЬ
				КОНЕЦ) КАК Перепоставка
		ИЗ
			ВТ_ТоварыКПоступлениюОстаткиНаДату КАК ТоварыКПоступлениюОстаткиНаДату
				ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыКПоступлению.Остатки(
						,
						(ДокументПоступления, Номенклатура, Характеристика) В
								(ВЫБРАТЬ
									ВТ_ТоварыКПоступлениюОстаткиНаДату.ДокументПоступления,
									ВТ_ТоварыКПоступлениюОстаткиНаДату.Номенклатура,
									ВТ_ТоварыКПоступлениюОстаткиНаДату.Характеристика
								ИЗ
									ВТ_ТоварыКПоступлениюОстаткиНаДату)
							И Склад.ИспользоватьОрдернуюСхемуПриПоступлении) КАК ТоварыКПоступлениюОстаткиТекущие
				ПО ТоварыКПоступлениюОстаткиНаДату.ДокументПоступления = ТоварыКПоступлениюОстаткиТекущие.ДокументПоступления
					И ТоварыКПоступлениюОстаткиНаДату.Номенклатура = ТоварыКПоступлениюОстаткиТекущие.Номенклатура
					И ТоварыКПоступлениюОстаткиНаДату.Характеристика = ТоварыКПоступлениюОстаткиТекущие.Характеристика
					И ТоварыКПоступлениюОстаткиНаДату.Склад = ТоварыКПоступлениюОстаткиТекущие.Склад
		
		СГРУППИРОВАТЬ ПО
			ТоварыКПоступлениюОстаткиНаДату.ДокументПоступления,
			ТоварыКПоступлениюОстаткиНаДату.Склад) КАК ТоварыКПоступлению
	ГДЕ
		НЕ ТоварыКПоступлению.Перепоставка) КАК ВсеРаспоряжения

СГРУППИРОВАТЬ ПО
	ВсеРаспоряжения.Склад
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТРасшифровка.ЗначениеПоказателя + ЕСТЬNULL(ВТРасшифровкаБезСклада.ЗначениеПоказателя, 0) КАК ЗначениеПоказателя,
	ВТРасшифровка.Склад
ИЗ
	ВТРасшифровка КАК ВТРасшифровка
		ЛЕВОЕ СОЕДИНЕНИЕ ВТРасшифровка КАК ВТРасшифровкаБезСклада
		ПО (ВТРасшифровкаБезСклада.Склад = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка))
ГДЕ
	ВТРасшифровка.Склад <> ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
Показать

Но разница во времени исполнения совсем незначительная (3000с против 2500с).
Конечно, на остатках висит много всего аж с 2015 года (так у нас работает склад). Но может можно все-таки его адаптировать? Или сначала остатки закрыть?
ЗЫ: Завтра постараюсь планы запросов предоставить. Но может кто-то наметённым глазом уже увидит.
Прикрепленные файлы:
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
5. buganov 201 01.11.18 06:39 Сейчас в теме +1 $m
2. Сколько записей в ВТ_ТоварыКПоступлениюОстаткиНаДату?
Если много то:
а) индексировать по полям соединения
б) перенести во вложенный запрос в ВТ_Расшифровка
Если записей миллионы, то очень много времени будет занимать создание временной таблицы. Если оперативной памяти ей не хватит, то СУБД скинет ее на диск, что будет сильно тормозить
sstas007; triviumfan; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. triviumfan 94 31.10.18 23:50 Сейчас в теме
Добавил план ВТ Расшифровка. Именно этот запрос выполняется 3000с.
Прикрепленные файлы:
Plan.txt
3. buganov 201 01.11.18 06:36 Сейчас в теме
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыКПоступлению.Остатки(
,
(ДокументПоступления, Номенклатура, Характеристика) В
(ВЫБРАТЬ
ВТ_ТоварыКПоступлениюОстаткиНаДату.ДокументПоступления,
ВТ_ТоварыКПоступлениюОстаткиНаДату.Номенклатура,
ВТ_ТоварыКПоступлениюОстаткиНаДату.Характеристика
ИЗ
ВТ_ТоварыКПоступлениюОстаткиНаДату)
И Склад.ИспользоватьОрдернуюСхемуПриПоступлении) КАК ТоварыКПоступлениюОстаткиТекущие

Переписать на внутреннее соединение с ВТ_ТоварыКПоступлениюОстаткиНаДату
4. buganov 201 01.11.18 06:37 Сейчас в теме
(3) точнее вообще выпилить
(ДокументПоступления, Номенклатура, Характеристика) В
(ВЫБРАТЬ
ВТ_ТоварыКПоступлениюОстаткиНаДату.ДокументПоступления,
ВТ_ТоварыКПоступлениюОстаткиНаДату.Номенклатура,
ВТ_ТоварыКПоступлениюОстаткиНаДату.Характеристика
ИЗ
ВТ_ТоварыКПоступлениюОстаткиНаДату)
Это не имеет смысла
5. buganov 201 01.11.18 06:39 Сейчас в теме +1 $m
2. Сколько записей в ВТ_ТоварыКПоступлениюОстаткиНаДату?
Если много то:
а) индексировать по полям соединения
б) перенести во вложенный запрос в ВТ_Расшифровка
Если записей миллионы, то очень много времени будет занимать создание временной таблицы. Если оперативной памяти ей не хватит, то СУБД скинет ее на диск, что будет сильно тормозить
sstas007; triviumfan; +2 Ответить
6. triviumfan 94 01.11.18 07:53 Сейчас в теме
(5) я ж прикрепил план запроса. почти 100к записей. На остатках ппц...
Точно! Попробую индексацию...
7. triviumfan 94 01.11.18 09:25 Сейчас в теме
(5) Убрал отбор в РегистрНакопления.ТоварыКПоступлению.Остатки(), оставив лишь соединение, а также проиндексировал ВТ_ТоварыКПоступлениюОстаткиНаДату.
Результат шикарный - 7 секунд!
Прикрепленные файлы:
8. triviumfan 94 01.11.18 09:55 Сейчас в теме
(5) Нашёл ещё одно обновление текущего дела - Документы.РеализацииТоваровУслуг.ПриЗаполненииСпискаТекущихДел();
ВЫБРАТЬ РАЗРЕШЕННЫЕ
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеПоДокументам.РаспоряженияНаОформлениеРеализацийТоваровИУслугВсегоВРаботе) КАК РаспоряженияНаОформлениеРеализацийТоваровИУслугВсегоВРаботе,
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеПоДокументам.РаспоряженияНаОформлениеРеализацийТоваровИУслугНаСегодня) КАК РаспоряженияНаОформлениеРеализацийТоваровИУслугНаСегодня,
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеПоДокументам.РеализацииТоваровИУслугКПредоплате) КАК РеализацииТоваровИУслугКПредоплате
ИЗ
	(ВЫБРАТЬ
		ЗаказыКОформлению.Ссылка КАК РаспоряженияНаОформлениеРеализацийТоваровИУслугВсегоВРаботе,
		NULL КАК РаспоряженияНаОформлениеРеализацийТоваровИУслугНаСегодня,
		NULL КАК РеализацииТоваровИУслугКПредоплате
	ИЗ
		(ВЫБРАТЬ
			ЗаказыКлиентов.ЗаказКлиента КАК Ссылка,
			НЕОПРЕДЕЛЕНО КАК Склад,
			НЕОПРЕДЕЛЕНО КАК Номенклатура,
			НЕОПРЕДЕЛЕНО КАК Характеристика,
			НЕОПРЕДЕЛЕНО КАК Серия
		ИЗ
			РегистрНакопления.ЗаказыКлиентов.ОстаткиИОбороты(
					,
					,
					,
					,
					ЗаказКлиента ССЫЛКА Документ.ЗаказКлиента
						ИЛИ ЗаказКлиента ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента) КАК ЗаказыКлиентов
		ГДЕ
			ЗаказыКлиентов.КОформлениюКонечныйОстаток > 0
			И ЗаказыКлиентов.ЗаказКлиента.Ссылка ЕСТЬ НЕ NULL 
		
		ОБЪЕДИНИТЬ ВСЕ
		
		ВЫБРАТЬ
			ТоварыКОтгрузке.ДокументОтгрузки,
			ТоварыКОтгрузке.Склад,
			ТоварыКОтгрузке.Номенклатура,
			ТоварыКОтгрузке.Характеристика,
			ТоварыКОтгрузке.Серия
		ИЗ
			РегистрНакопления.ТоварыКОтгрузке.ОстаткиИОбороты(
					,
					,
					,
					,
					ДокументОтгрузки ССЫЛКА Документ.ЗаказКлиента
						ИЛИ ДокументОтгрузки ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента
						ИЛИ ДокументОтгрузки ССЫЛКА Документ.РеализацияТоваровУслуг) КАК ТоварыКОтгрузке
				ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыКОтгрузке.ОстаткиИОбороты(
						,
						,
						,
						,
						ДокументОтгрузки ССЫЛКА Документ.ЗаказКлиента
							ИЛИ ДокументОтгрузки ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента
							ИЛИ ДокументОтгрузки ССЫЛКА Документ.РеализацияТоваровУслуг) КАК ТоварыКОтгрузкеОстаткиИОбороты
				ПО ТоварыКОтгрузке.ДокументОтгрузки = ТоварыКОтгрузкеОстаткиИОбороты.ДокументОтгрузки
					И ТоварыКОтгрузке.Склад = ТоварыКОтгрузкеОстаткиИОбороты.Склад
		ГДЕ
			(ТоварыКОтгрузке.КОтгрузкеКонечныйОстаток - ТоварыКОтгрузке.СобраноКонечныйОстаток > 0
					ИЛИ ТоварыКОтгрузке.КОформлениюКонечныйОстаток > 0)
			И ТоварыКОтгрузке.Склад.ИспользоватьОрдернуюСхемуПриОтгрузке
			И ТоварыКОтгрузке.ДокументОтгрузки.Ссылка ЕСТЬ НЕ NULL 
			И ТоварыКОтгрузке.Склад.ДатаНачалаОрдернойСхемыПриОтгрузке <= &ТекущаяДата) КАК ЗаказыКОформлению
	
	ОБЪЕДИНИТЬ ВСЕ
	
	ВЫБРАТЬ
		NULL,
		ЗаказыКОформлениюНаСегодня.Ссылка,
		NULL
	ИЗ
		(ВЫБРАТЬ
			ЗаказыКлиентов.ЗаказКлиента КАК Ссылка,
			НЕОПРЕДЕЛЕНО КАК Склад,
			НЕОПРЕДЕЛЕНО КАК Номенклатура,
			НЕОПРЕДЕЛЕНО КАК Характеристика,
			НЕОПРЕДЕЛЕНО КАК Серия
		ИЗ
			РегистрНакопления.ЗаказыКлиентов.ОстаткиИОбороты(
					&ТекущаяДата,
					,
					,
					,
					ЗаказКлиента ССЫЛКА Документ.ЗаказКлиента
						ИЛИ ЗаказКлиента ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента) КАК ЗаказыКлиентов
		ГДЕ
			ЗаказыКлиентов.КОформлениюКонечныйОстаток > 0
			И ЗаказыКлиентов.ЗаказКлиента.Ссылка ЕСТЬ НЕ NULL 
		
		ОБЪЕДИНИТЬ ВСЕ
		
		ВЫБРАТЬ
			ТоварыКОтгрузке.ДокументОтгрузки,
			ТоварыКОтгрузке.Склад,
			ТоварыКОтгрузке.Номенклатура,
			ТоварыКОтгрузке.Характеристика,
			ТоварыКОтгрузке.Серия
		ИЗ
			РегистрНакопления.ТоварыКОтгрузке.ОстаткиИОбороты(
					&ТекущаяДата,
					,
					,
					,
					ДокументОтгрузки ССЫЛКА Документ.ЗаказКлиента
						ИЛИ ДокументОтгрузки ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента
						ИЛИ ДокументОтгрузки ССЫЛКА Документ.РеализацияТоваровУслуг) КАК ТоварыКОтгрузке
				ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыКОтгрузке.ОстаткиИОбороты(
						,
						,
						,
						,
						ДокументОтгрузки ССЫЛКА Документ.ЗаказКлиента
							ИЛИ ДокументОтгрузки ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента
							ИЛИ ДокументОтгрузки ССЫЛКА Документ.РеализацияТоваровУслуг) КАК ТоварыКОтгрузкеОстаткиИОбороты
				ПО ТоварыКОтгрузке.ДокументОтгрузки = ТоварыКОтгрузкеОстаткиИОбороты.ДокументОтгрузки
					И ТоварыКОтгрузке.Склад = ТоварыКОтгрузкеОстаткиИОбороты.Склад
		ГДЕ
			(ТоварыКОтгрузке.КОтгрузкеКонечныйОстаток - ТоварыКОтгрузке.СобраноКонечныйОстаток > 0
					ИЛИ ТоварыКОтгрузке.КОформлениюКонечныйОстаток > 0)
			И ТоварыКОтгрузке.Склад.ИспользоватьОрдернуюСхемуПриОтгрузке
			И ТоварыКОтгрузке.ДокументОтгрузки.Ссылка ЕСТЬ НЕ NULL 
			И ТоварыКОтгрузке.Склад.ДатаНачалаОрдернойСхемыПриОтгрузке <= &ТекущаяДата) КАК ЗаказыКОформлениюНаСегодня
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ РАЗЛИЧНЫЕ
		NULL,
		NULL,
		NULL
	ИЗ
		Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
	ГДЕ
		РеализацияТоваровУслуг.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыРеализацийТоваровУслуг.ВПути)
		И РеализацияТоваровУслуг.Менеджер = &Пользователь
		И НЕ РеализацияТоваровУслуг.ПометкаУдаления
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ РАЗЛИЧНЫЕ
		NULL,
		NULL,
		РеализацияТоваровУслуг.Ссылка
	ИЗ
		Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
	ГДЕ
		РеализацияТоваровУслуг.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыРеализацийТоваровУслуг.КПредоплате)
		И РеализацияТоваровУслуг.Менеджер = &Пользователь
		И НЕ РеализацияТоваровУслуг.ПометкаУдаления) КАК ДанныеПоДокументам
Показать

Порядка 30с выполняется, что тоже неприемлимо. Но тут же объединения... такой трюк не прокатит
Ппикрепил план.
Прикрепленные файлы:
Plan.txt
9. triviumfan 94 01.11.18 10:11 Сейчас в теме
(8) Вру, есть соединение ОстаткиИОбороты :(
10. triviumfan 94 01.11.18 11:09 Сейчас в теме
(8) В последнем релизе УТ такая же шляпа:
РегистрНакопления.ТоварыКОтгрузке.ОстаткиИОбороты(,,,)
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыКОтгрузке.ОстаткиИОбороты(,,,)

Похоже, что это делают специально.
Его невозможно переписать, если требуются оборотные данные за весь период.
13. Sashares 35 01.11.18 11:45 Сейчас в теме
(10)В запросе не используется нигде ТоварыКОтгрузкеОстаткиИОбороты - только для соединения.
В чем смысл?
14. triviumfan 94 01.11.18 11:52 Сейчас в теме
19. buganov 201 01.11.18 13:26 Сейчас в теме
(13)скорее всего для остатков на каждую запись
21. triviumfan 94 01.11.18 20:14 Сейчас в теме
(8) Переписал. Убрал лишние соединения, обращаюсь к таблице остатков.
ВЫБРАТЬ РАЗРЕШЕННЫЕ
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеПоДокументам.РаспоряженияНаОформлениеРеализацийТоваровИУслугВсегоВРаботе) КАК РаспоряженияНаОформлениеРеализацийТоваровИУслугВсегоВРаботе,
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеПоДокументам.РаспоряженияНаОформлениеРеализацийТоваровИУслугНаСегодня) КАК РаспоряженияНаОформлениеРеализацийТоваровИУслугНаСегодня,
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеПоДокументам.РеализацииТоваровИУслугВПути) КАК РеализацииТоваровИУслугВПути,
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеПоДокументам.РеализацииТоваровИУслугКПредоплате) КАК РеализацииТоваровИУслугКПредоплате
ИЗ
	(ВЫБРАТЬ
		ЗаказыКОформлению.Ссылка КАК РаспоряженияНаОформлениеРеализацийТоваровИУслугВсегоВРаботе,
		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. Подскажете? Я убрал лишнее обращение к ссылке. Может есть какая хитрость?
22. buganov 201 02.11.18 05:51 Сейчас в теме
(21)
ЕСТЬ НЕ NULL

Такая конструкция сравнивает значение поле с NULL.
Без соединений в запросе не имеет смысла
23. triviumfan 94 02.11.18 08:55 Сейчас в теме
(22) Да это очевидно, но зачем там лишнее обращение к ссылке? Есть какой-то сакральный смысл? В окончательном примере я уже убрал лишнее обращение. Но гляньте исходный запрос, там жесть...
20. triviumfan 94 01.11.18 18:57 Сейчас в теме
11. buganov 201 01.11.18 11:33 Сейчас в теме
ВЫБРАТЬ
            ТоварыКОтгрузке.ДокументОтгрузки,
            ТоварыКОтгрузке.Склад,
            ТоварыКОтгрузке.Номенклатура,
            ТоварыКОтгрузке.Характеристика,
            ТоварыКОтгрузке.Серия
        ИЗ
            РегистрНакопления.ТоварыКОтгрузке.ОстаткиИОбороты(
                    ,
                    ,
                    ,
                    ,
                    ДокументОтгрузки ССЫЛКА Документ.ЗаказКлиента
                        ИЛИ ДокументОтгрузки ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента
                        ИЛИ ДокументОтгрузки ССЫЛКА Документ.РеализацияТоваровУслуг) КАК ТоварыКОтгрузке
                ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыКОтгрузке.ОстаткиИОбороты(
                        ,
                        ,
                        ,
                        ,
                        ДокументОтгрузки ССЫЛКА Документ.ЗаказКлиента
                            ИЛИ ДокументОтгрузки ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента
                            ИЛИ ДокументОтгрузки ССЫЛКА Документ.РеализацияТоваровУслуг) КАК ТоварыКОтгрузкеОстаткиИОбороты
                ПО ТоварыКОтгрузке.ДокументОтгрузки = ТоварыКОтгрузкеОстаткиИОбороты.ДокументОтгрузки
                    И ТоварыКОтгрузке.Склад = ТоварыКОтгрузкеОстаткиИОбороты.Склад
        ГДЕ
            (ТоварыКОтгрузке.КОтгрузкеКонечныйОстаток - ТоварыКОтгрузке.СобраноКонечныйОстаток > 0
                    ИЛИ ТоварыКОтгрузке.КОформлениюКонечныйОстаток > 0)
            И ТоварыКОтгрузке.Склад.ИспользоватьОрдернуюСхемуПриОтгрузке
            И ТоварыКОтгрузке.ДокументОтгрузки.Ссылка ЕСТЬ НЕ NULL 
            И ТоварыКОтгрузке.Склад.ДатаНачалаОрдернойСхемыПриОтгрузке <= &ТекущаяДата) КАК ЗаказыКОформлению
Показать


Для Чего сам на себя соединяется?

Отказывайтесь от Или в условиях

ДокументОтгрузки ССЫЛКА Документ.ЗаказКлиента
                            ИЛИ ДокументОтгрузки ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента
                            ИЛИ ДокументОтгрузки ССЫЛКА Документ.РеализацияТоваровУслуг

Лучше переписать на внутреннее соединение с шапками документов.

Вообще, лучше выкинуть запрос и построить свою логику с блэкджеком и оптимизацией.
12. buganov 201 01.11.18 11:38 Сейчас в теме
(11) SQL очень любит точное определение параметров без функций и списков(обрабатывает как Или).
Опытным путем было выявлено, что соединение с таблицей документа(документов с объединением результатов) работает быстрее, чем указание типа через Ссылка. На маленьких данных выигрыш копеечный, на больших может быть больше.
16. triviumfan 94 01.11.18 11:57 Сейчас в теме
(12) В целом, проблема тут:

ВЫБРАТЬ
	ТоварыКОтгрузке.ДокументОтгрузки КАК ДокументОтгрузки,
	ТоварыКОтгрузке.Склад КАК Склад,
	ТоварыКОтгрузке.Номенклатура КАК Номенклатура,
	ТоварыКОтгрузке.Характеристика КАК Характеристика,
	ТоварыКОтгрузке.Серия КАК Серия,
	ТоварыКОтгрузке.КОтгрузкеКонечныйОстаток КАК КОтгрузкеКонечныйОстаток,
	ТоварыКОтгрузке.КОформлениюКонечныйОстаток КАК КОформлениюКонечныйОстаток,
	ТоварыКОтгрузке.СобираетсяКонечныйОстаток КАК СобираетсяКонечныйОстаток,
	ТоварыКОтгрузке.СобраноКонечныйОстаток КАК СобраноКонечныйОстаток
ИЗ
	РегистрНакопления.ТоварыКОтгрузке.ОстаткиИОбороты(, , , , ) КАК ТоварыКОтгрузке
Показать

Данных нереально много, большее время выполняется оно.
17. buganov 201 01.11.18 12:16 Сейчас в теме
(16) Если текущие дела не нужны, можно просто выпилить вызов этой функции
18. triviumfan 94 01.11.18 12:21 Сейчас в теме
(17) Да не могу же я у ста человек узнать нужны они или нет. Теоретически руководители ими пользуются. И по умолчанию они обновляются только при загрузке рабочего стола и вручную. Хотя там можно и автообновление указать.
Попробую переписать, обращаясь только к итогам, т.к. движения тут вроде не нужны.
15. triviumfan 94 01.11.18 11:55 Сейчас в теме
(11) Это типовой запрос, логика мне не до конца ясна. С ИЛИ эксперементировал - скуль 2014 норм съедает.
Предполагаю, что ОстаткиИОбороты вообще не нужны, а достаточно лишь Остатков/Итогов, ведь выводятся данные _КонечныйОстаток.

Даже проверил результаты запросов:
ВЫБРАТЬ
	ТоварыКОтгрузке.ДокументОтгрузки КАК ДокументОтгрузки,
	ТоварыКОтгрузке.Склад КАК Склад,
	ТоварыКОтгрузке.Номенклатура КАК Номенклатура,
	ТоварыКОтгрузке.Характеристика КАК Характеристика,
	ТоварыКОтгрузке.Серия КАК Серия,
	ТоварыКОтгрузке.КОтгрузкеКонечныйОстаток КАК КОтгрузкеКонечныйОстаток,
	ТоварыКОтгрузке.КОформлениюКонечныйОстаток КАК КОформлениюКонечныйОстаток,
	ТоварыКОтгрузке.СобираетсяКонечныйОстаток КАК СобираетсяКонечныйОстаток,
	ТоварыКОтгрузке.СобраноКонечныйОстаток КАК СобраноКонечныйОстаток
ИЗ
	РегистрНакопления.ТоварыКОтгрузке.ОстаткиИОбороты(, , , , ) КАК ТоварыКОтгрузке
ГДЕ
	(ТоварыКОтгрузке.ДокументОтгрузки ССЫЛКА Документ.ЗаказКлиента
			ИЛИ ТоварыКОтгрузке.ДокументОтгрузки ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента
			ИЛИ ТоварыКОтгрузке.ДокументОтгрузки ССЫЛКА Документ.РеализацияТоваровУслуг)
	И (ТоварыКОтгрузке.КОтгрузкеКонечныйОстаток - ТоварыКОтгрузке.СобраноКонечныйОстаток > 0
					ИЛИ ТоварыКОтгрузке.КОформлениюКонечныйОстаток > 0)
			И ТоварыКОтгрузке.Склад.ИспользоватьОрдернуюСхемуПриОтгрузке
			И ТоварыКОтгрузке.ДокументОтгрузки.Ссылка ЕСТЬ НЕ NULL 
			И ТоварыКОтгрузке.Склад.ДатаНачалаОрдернойСхемыПриОтгрузке <= &ТекущаяДата
Показать

И
ВЫБРАТЬ
	ТоварыКОтгрузкеОстатки.ДокументОтгрузки КАК ДокументОтгрузки,
	ТоварыКОтгрузкеОстатки.Склад КАК Склад,
	ТоварыКОтгрузкеОстатки.Номенклатура КАК Номенклатура,
	ТоварыКОтгрузкеОстатки.Характеристика КАК Характеристика,
	ТоварыКОтгрузкеОстатки.Серия КАК Серия,
	ТоварыКОтгрузкеОстатки.КОтгрузкеОстаток КАК КОтгрузкеОстаток,
	ТоварыКОтгрузкеОстатки.КОформлениюОстаток КАК КОформлениюОстаток,
	ТоварыКОтгрузкеОстатки.СобираетсяОстаток КАК СобираетсяОстаток,
	ТоварыКОтгрузкеОстатки.СобраноОстаток КАК СобраноОстаток
ИЗ
	РегистрНакопления.ТоварыКОтгрузке.Остатки(, ) КАК ТоварыКОтгрузкеОстатки
ГДЕ
	(ТоварыКОтгрузкеОстатки.ДокументОтгрузки ССЫЛКА Документ.ЗаказКлиента
			ИЛИ ТоварыКОтгрузкеОстатки.ДокументОтгрузки ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента
			ИЛИ ТоварыКОтгрузкеОстатки.ДокументОтгрузки ССЫЛКА Документ.РеализацияТоваровУслуг)
	И (ТоварыКОтгрузкеОстатки.КОтгрузкеОстаток - ТоварыКОтгрузкеОстатки.СобраноОстаток > 0
			ИЛИ ТоварыКОтгрузкеОстатки.КОформлениюОстаток > 0)
	И ТоварыКОтгрузкеОстатки.Склад.ИспользоватьОрдернуюСхемуПриОтгрузке
	И ТоварыКОтгрузкеОстатки.ДокументОтгрузки.Ссылка ЕСТЬ НЕ NULL 
	И ТоварыКОтгрузкеОстатки.Склад.ДатаНачалаОрдернойСхемыПриОтгрузке <= &ТекущаяДата
Показать

Результаты совпадают, а время выполнения 30с против 0.1
Вопрос в том, зачем разработчики использовали ОстаткиИОбороты...
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот