Оптимизировать запрос-посмотрите
Здравствуйте! есть у меня такой запрос,
Правильно ли я его сделала, можно ли что нибудь оптимизировать?
Суть - собрать по торговым точкам остатки на начало дня каждого дня месяца, продажи, перемещения между складами, цены из документа, цены из регистра.
ВЫБРАТЬ РАЗЛИЧНЫЕ
РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК Период
ПОМЕСТИТЬ Дни
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &НачалоПериод И &КонецПериод
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВложенныйЗапрос.Период,
ВложенныйЗапрос.Склад,
ВложенныйЗапрос.Номенклатура,
ВложенныйЗапрос.КолВоКонОст - ВложенныйЗапрос.КолВоОборот КАК КолВоНачОст,
ВложенныйЗапрос.КолВоПриход,
ВложенныйЗапрос.КолВоОборот,
ПеремещениеТоваровТовары.Количество КАК Перемещения,
ВложенныйЗапрос.КолВоРасход - ЕСТЬNULL(ПеремещениеТоваровТовары.Количество, 0) КАК КолВоРасход,
ВложенныйЗапрос.КолВоКонОст,
ЦеныНоменклатуры.Цена КАК ЦенаРег,
ВложенныйЗапрос.ЦенаДок
ИЗ
(ВЫБРАТЬ
НАЧАЛОПЕРИОДА(ДНИ.Период, ДЕНЬ) КАК Период,
Движения.Номенклатура КАК Номенклатура,
СУММА(ВЫБОР
КОГДА Движения.Период = ДНИ.Период
ТОГДА Движения.КоличествоПриход
ИНАЧЕ 0
КОНЕЦ) КАК КолВоПриход,
СУММА(ВЫБОР
КОГДА Движения.Период = ДНИ.Период
ТОГДА Движения.КоличествоРасход
ИНАЧЕ 0
КОНЕЦ) КАК КолВоРасход,
СУММА(ВЫБОР
КОГДА Движения.Период = ДНИ.Период
ТОГДА Движения.КоличествоОборот
ИНАЧЕ 0
КОНЕЦ) КАК КолВоОборот,
СУММА(ВЫБОР
КОГДА Движения.Период = &НачалоПериод
ТОГДА Движения.КоличествоКонечныйОстаток
ИНАЧЕ ВЫБОР
КОГДА Движения.Период <= ДНИ.Период
ТОГДА Движения.КоличествоОборот
ИНАЧЕ 0
КОНЕЦ
КОНЕЦ) КАК КолВоКонОст,
Движения.Склад КАК Склад,
ВЫБОР
КОГДА СУММА(Движения.КоличествоРасход) = 0
ТОГДА 0
ИНАЧЕ СУММА(Движения.СуммаПродажнаяРасход) / СУММА(Движения.КоличествоРасход)
КОНЕЦ КАК ЦенаДок
ИЗ
РегистрНакопления.ТоварыВРознице.ОстаткиИОбороты(НАЧАЛОПЕРИОДА(&НачалоПериод, ДЕНЬ), КОНЕЦПЕРИОДА(&КонецПериод, ДЕНЬ), День, , ) КАК Движения,
Дни КАК ДНИ
СГРУППИРОВАТЬ ПО
Движения.Номенклатура,
Движения.Склад,
НАЧАЛОПЕРИОДА(ДНИ.Период, ДЕНЬ)) КАК ВложенныйЗапрос
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
ПО (ВложенныйЗапрос.Период = НАЧАЛОПЕРИОДА(ПеремещениеТоваровТовары.Ссылка.Дата, ДЕНЬ))
И ВложенныйЗапрос.Склад = ПеремещениеТоваровТовары.Ссылка.СкладОтправитель
И ВложенныйЗапрос.Номенклатура = ПеремещениеТоваровТовары.Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ПО ВложенныйЗапрос.Номенклатура = ЦеныНоменклатуры.Номенклатура
И (ЦеныНоменклатуры.ТипЦен.Наименование = "Розничная базовая")
И (ЦеныНоменклатуры.Период В
(ВЫБРАТЬ
МАКСИМУМ(Цены.Период)
ИЗ
РегистрСведений.ЦеныНоменклатуры КАК Цены
ГДЕ
Цены.Период <= ВложенныйЗапрос.Период
И Цены.Номенклатура = ВложенныйЗапрос.Номенклатура
И Цены.ТипЦен.Наименование = "Розничная базовая"))
УПОРЯДОЧИТЬ ПО
ВложенныйЗапрос.Номенклатура,
ВложенныйЗапрос.Период
ПоказатьПравильно ли я его сделала, можно ли что нибудь оптимизировать?
Суть - собрать по торговым точкам остатки на начало дня каждого дня месяца, продажи, перемещения между складами, цены из документа, цены из регистра.
Ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
(1) Согласен, это жесть.Сначала подумал что первая таблица нормально выбрана, но потом не понял зачем вообще из производственного календаря выбирать дни без отбора между &Начало и &Конец
Пробуйте упростить ВСЕ. И пока не особо получается запросы писать, вместо вложенных запросов используйте временные таблицы(да и вообще лучше их не использовать без крайней необходимости). Куча маленьких временных таблиц хоть нормально читается
Пробуйте упростить ВСЕ. И пока не особо получается запросы писать, вместо вложенных запросов используйте временные таблицы(да и вообще лучше их не использовать без крайней необходимости). Куча маленьких временных таблиц хоть нормально читается
(3) да у вас тут вообще жесть. начните со списка ниже
соединения с подзапросами;
соединения с виртуальными таблицами;
несоответствие индексов и условий запроса;
использование логического ИЛИ в условиях;
использование подзапросов в условии соединения;
получение данных через точку от полей составного типа;
фильтрация виртуальных таблиц без использования параметров.
соединения с подзапросами;
соединения с виртуальными таблицами;
несоответствие индексов и условий запроса;
использование логического ИЛИ в условиях;
использование подзапросов в условии соединения;
получение данных через точку от полей составного типа;
фильтрация виртуальных таблиц без использования параметров.
(7) это конечно хорошо , но опять же не все что тут написано является правильным , я конечно понимаю что написать правильный , хороший и сложный запрос не так просто , но есть определённые рекомендациии которые желательно соблюдать для достижения хорошего результата , а не копировать все подряд
Да ладно, нормально написано.
Подзапрос слева, остатки/цены на каждый день вполне ок реализованы.
Если время выполнения устраивает, то можно и так оставить.
Если нет, то
1) ЦеныНоменклатуры.ТипЦен.Наименование = "Розничная базовая" - заменить на условие по параметру
2) перемещения за период заранее выбрать вов временную таблицу с полями склад и НачалоДня(дата), все таки условия через две точки не очень.
3) Я б наверно вирт таблицу заменил на вирт таблицу остатков + прост выборка из таблицы регистра за период
4) цены номенклатуры лучше б все таки заранее на каждый день посчитать
5) а что б реализовать п. 4, то неплохо бы наложить фильтр по номенклатуре, а для этого и вложенный запрос заменить на врем таблицу.
Но это все опять таки, если не устраивает время выполнения.
Подзапрос слева, остатки/цены на каждый день вполне ок реализованы.
Если время выполнения устраивает, то можно и так оставить.
Если нет, то
1) ЦеныНоменклатуры.ТипЦен.Наименование = "Розничная базовая" - заменить на условие по параметру
2) перемещения за период заранее выбрать вов временную таблицу с полями склад и НачалоДня(дата), все таки условия через две точки не очень.
3) Я б наверно вирт таблицу заменил на вирт таблицу остатков + прост выборка из таблицы регистра за период
4) цены номенклатуры лучше б все таки заранее на каждый день посчитать
5) а что б реализовать п. 4, то неплохо бы наложить фильтр по номенклатуре, а для этого и вложенный запрос заменить на врем таблицу.
Но это все опять таки, если не устраивает время выполнения.
Вакансии
Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)