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

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 99 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-летним стажем ужасы похуже пишут.
Оставьте свое сообщение
Вакансии
Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 250 000 руб.
Полный день