Оптимизировать запрос-посмотрите

1. XelOla 17 15.03.17 00:56 Сейчас в теме
Здравствуйте! есть у меня такой запрос,
ВЫБРАТЬ РАЗЛИЧНЫЕ
	РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК Период
ПОМЕСТИТЬ Дни
ИЗ
	РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
	РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &НачалоПериод И &КонецПериод
;

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

УПОРЯДОЧИТЬ ПО
	ВложенныйЗапрос.Номенклатура,
	ВложенныйЗапрос.Период
Показать


Правильно ли я его сделала, можно ли что нибудь оптимизировать?
Суть - собрать по торговым точкам остатки на начало дня каждого дня месяца, продажи, перемещения между складами, цены из документа, цены из регистра.
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. ResetAtreides 15.03.17 09:47 Сейчас в теме
(1) Согласен, это жесть.Сначала подумал что первая таблица нормально выбрана, но потом не понял зачем вообще из производственного календаря выбирать дни без отбора между &Начало и &Конец
Пробуйте упростить ВСЕ. И пока не особо получается запросы писать, вместо вложенных запросов используйте временные таблицы(да и вообще лучше их не использовать без крайней необходимости). Куча маленьких временных таблиц хоть нормально читается
2. dvk09 2 15.03.17 05:12 Сейчас в теме
Мне вот это не нравится: ЦеныНоменклатуры.ТипЦен.Наименование = "Розничная базовая"
Я бы параметр передавать пытался, может на константу ссылался...
3. XelOla 17 15.03.17 07:04 Сейчас в теме
(2) только это не понравилось?
а это критично?
4. kolya_tlt 86 15.03.17 09:16 Сейчас в теме
(3) да у вас тут вообще жесть. начните со списка ниже

соединения с подзапросами;
соединения с виртуальными таблицами;
несоответствие индексов и условий запроса;
использование логического ИЛИ в условиях;
использование подзапросов в условии соединения;
получение данных через точку от полей составного типа;
фильтрация виртуальных таблиц без использования параметров.
7. XelOla 17 15.03.17 10:00 Сейчас в теме
(4)
но я... я пользовалась запросами с этого сайта...
9. vadim1011985 100 15.03.17 10:12 Сейчас в теме
(7) это конечно хорошо , но опять же не все что тут написано является правильным , я конечно понимаю что написать правильный , хороший и сложный запрос не так просто , но есть определённые рекомендациии которые желательно соблюдать для достижения хорошего результата , а не копировать все подряд
11. kolya_tlt 86 15.03.17 10:17 Сейчас в теме
(7) Сергей Нуралиев говорит: "копируй, но переосмысли"
6. ditp 91 15.03.17 09:56 Сейчас в теме
Да ладно, нормально написано.
Подзапрос слева, остатки/цены на каждый день вполне ок реализованы.

Если время выполнения устраивает, то можно и так оставить.
Если нет, то
1) ЦеныНоменклатуры.ТипЦен.Наименование = "Розничная базовая" - заменить на условие по параметру
2) перемещения за период заранее выбрать вов временную таблицу с полями склад и НачалоДня(дата), все таки условия через две точки не очень.
3) Я б наверно вирт таблицу заменил на вирт таблицу остатков + прост выборка из таблицы регистра за период
4) цены номенклатуры лучше б все таки заранее на каждый день посчитать
5) а что б реализовать п. 4, то неплохо бы наложить фильтр по номенклатуре, а для этого и вложенный запрос заменить на врем таблицу.

Но это все опять таки, если не устраивает время выполнения.
10. XelOla 17 15.03.17 10:14 Сейчас в теме
(6) (7) (5)
я попробую
выполняется не слишком долго, дольше перебирает строки ТЗ для csv
(6) спасибо за подробности
8. YanSergey 145 15.03.17 10:06 Сейчас в теме
Во напугали девушку. Согласен с товарищем, если время устраивает, то и так можно оставить.
Но стоит начать изучать тему, как правильно запросы писать.
Запросы, такая штука, вон у нас некоторые ведущие программисты с 10-летним стажем ужасы похуже пишут.
Оставьте свое сообщение

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