Имя: Пароль:
1C
1С v8
Оптимизация запроса
,
0 Domanoff26
 
10.10.11
15:55
вроде регистр один и условия не сложные, а работает долго что посоветуете по оптимизации?
"ВЫБРАТЬ
   |    УчетТоваровОстатки.Номенклатура,
   |    УчетТоваровОстатки.ХарактеристикаНоменклатуры,
   |    УчетТоваровОстатки.СерияНоменклатуры,
   |    УчетТоваровОстатки.Заказ,
   |    УчетТоваровОстатки.Размещение,
   |    СУММА(УчетТоваровОстатки.КоличествоОстаток) КАК ОстатокВЗ
   |ПОМЕСТИТЬ ВТ_ВнутренниеЗаказы
   |ИЗ
   |    РегистрНакопления.УчетТоваров.Остатки(
   |            &МоментВремени,
   |            Заказ ССЫЛКА Документ.ВнутреннийЗаказ
   |                И Заказ.Заказчик = &Объект
   |                И Заказ.РазделКВ = &РазделКВ
   |                И (НЕ Размещение ССЫЛКА Справочник.Пользователи)
   |                И (НЕ Размещение ССЫЛКА Справочник.ФизическиеЛица)) КАК УчетТоваровОстатки
   |
   |СГРУППИРОВАТЬ ПО
   |    УчетТоваровОстатки.Номенклатура,
   |    УчетТоваровОстатки.Заказ,
   |    УчетТоваровОстатки.Размещение,
   |    УчетТоваровОстатки.ХарактеристикаНоменклатуры,
   |    УчетТоваровОстатки.СерияНоменклатуры
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |    УчетТоваровОстатки.Номенклатура,
   |    УчетТоваровОстатки.ХарактеристикаНоменклатуры,
   |    УчетТоваровОстатки.СерияНоменклатуры,
   |    УчетТоваровОстатки.Заказ,
   |    УчетТоваровОстатки.Размещение,
   |    СУММА(УчетТоваровОстатки.КоличествоОстаток) КАК ОстатокВРезерве
   |ПОМЕСТИТЬ ВТ_ВрезервеНаСкладах
   |ИЗ
   |    РегистрНакопления.УчетТоваров.Остатки(
   |            &МоментВремени,
   |            Заказ ССЫЛКА Документ.ВнутреннийЗаказ
   |                И Заказ.Заказчик = &Объект
   |                И Заказ.РазделКВ = &РазделКВ
   |                И Размещение ССЫЛКА Справочник.Склады
   |                И Размещение = &Склад) КАК УчетТоваровОстатки
   |
   |СГРУППИРОВАТЬ ПО
   |    УчетТоваровОстатки.Номенклатура,
   |    УчетТоваровОстатки.Заказ,
   |    УчетТоваровОстатки.Размещение,
   |    УчетТоваровОстатки.ХарактеристикаНоменклатуры,
   |    УчетТоваровОстатки.СерияНоменклатуры
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |    УчетТоваровОстатки.Номенклатура,
   |    УчетТоваровОстатки.ХарактеристикаНоменклатуры,
   |    УчетТоваровОстатки.СерияНоменклатуры,
   |    УчетТоваровОстатки.Заказ,
   |    УчетТоваровОстатки.Размещение,
   |    СУММА(УчетТоваровОстатки.КоличествоОстаток) КАК СвободныйОстаток
   |ПОМЕСТИТЬ ВТ_СвободныйОстаток
   |ИЗ
   |    РегистрНакопления.УчетТоваров.Остатки(
   |            &МоментВремени,
   |            Заказ = НЕОПРЕДЕЛЕНО
   |                И Номенклатура.СК_НеРезервироватьПодКВ = ИСТИНА
   |                И Размещение = &Склад) КАК УчетТоваровОстатки
   |
   |СГРУППИРОВАТЬ ПО
   |    УчетТоваровОстатки.Номенклатура,
   |    УчетТоваровОстатки.Заказ,
   |    УчетТоваровОстатки.Размещение,
   |    УчетТоваровОстатки.ХарактеристикаНоменклатуры,
   |    УчетТоваровОстатки.СерияНоменклатуры
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |    ЛистыПодбораОстатки.Склад,
   |    ЛистыПодбораОстатки.Объект,
   |    ЛистыПодбораОстатки.РазделКВ,
   |    ЛистыПодбораОстатки.Номенклатура,
   |    СУММА(ЛистыПодбораОстатки.КоличествоОстаток) КАК ОстатокЛП
   |ПОМЕСТИТЬ ВТ_ЛистыПодбора
   |ИЗ
   |    РегистрНакопления.ЛистыПодбора.Остатки(
   |            &МоментВремени,
   |            Склад = &Склад
   |                И Объект = &Объект
   |                И РазделКВ = &РазделКВ) КАК ЛистыПодбораОстатки
   |
   |СГРУППИРОВАТЬ ПО
   |    ЛистыПодбораОстатки.Объект,
   |    ЛистыПодбораОстатки.РазделКВ,
   |    ЛистыПодбораОстатки.Номенклатура,
   |    ЛистыПодбораОстатки.Склад
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |    СтрокиКВ.Объект,
   |    СтрокиКВ.РазделКВ,
   |    СтрокиКВ.Номенклатура,
   |    СтрокиКВ.ЕдиницаИзмерения,
   |    СУММА(СтрокиКВ.УтвержденоГИП) КАК УтвержденоГИП
   |ПОМЕСТИТЬ ВТ_СтрокиКВ
   |ИЗ
   |    РегистрСведений.СтрокиКВ КАК СтрокиКВ
   |ГДЕ
   |    СтрокиКВ.Объект = &Объект
   |    И СтрокиКВ.РазделКВ = &РазделКВ
   |
   |СГРУППИРОВАТЬ ПО
   |    СтрокиКВ.Объект,
   |    СтрокиКВ.РазделКВ,
   |    СтрокиКВ.Номенклатура,
   |    СтрокиКВ.ЕдиницаИзмерения
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |    ВТ_СтрокиКВ.Номенклатура,
   |    ВТ_СтрокиКВ.ЕдиницаИзмерения,
   |    ВТ_СтрокиКВ.РазделКВ,
   |    ЕСТЬNULL(ВТ_ЛистыПодбора.ОстатокЛП, 0) * ЕСТЬNULL(ВТ_СтрокиКВ.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / ВТ_СтрокиКВ.ЕдиницаИзмерения.Коэффициент, 1) КАК Заказано,
   |    ЕСТЬNULL(ВТ_ВнутренниеЗаказы.ОстатокВЗ, 0) * ЕСТЬNULL(ВТ_СтрокиКВ.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / ВТ_СтрокиКВ.ЕдиницаИзмерения.Коэффициент, 1) КАК НаЗаказе,
   |    ЕСТЬNULL(ВТ_ВрезервеНаСкладах.ОстатокВРезерве, 0) * ЕСТЬNULL(ВТ_СтрокиКВ.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / ВТ_СтрокиКВ.ЕдиницаИзмерения.Коэффициент, 1) КАК Резерв,
   |    ЕСТЬNULL(ВТ_СвободныйОстаток.СвободныйОстаток, 0) * ЕСТЬNULL(ВТ_СтрокиКВ.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / ВТ_СтрокиКВ.ЕдиницаИзмерения.Коэффициент, 1) КАК СвободныйОстаток
   |ИЗ
   |    ВТ_СтрокиКВ КАК ВТ_СтрокиКВ
   |        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ВнутренниеЗаказы КАК ВТ_ВнутренниеЗаказы
   |        ПО ВТ_СтрокиКВ.Номенклатура = ВТ_ВнутренниеЗаказы.Номенклатура
   |            И ВТ_СтрокиКВ.РазделКВ = ВТ_ВнутренниеЗаказы.Заказ.РазделКВ
   |            И ВТ_СтрокиКВ.Объект = ВТ_ВнутренниеЗаказы.Заказ.Заказчик
   |        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ВрезервеНаСкладах КАК ВТ_ВрезервеНаСкладах
   |        ПО ВТ_СтрокиКВ.Объект = ВТ_ВрезервеНаСкладах.Заказ.Заказчик
   |            И ВТ_СтрокиКВ.РазделКВ = ВТ_ВрезервеНаСкладах.Заказ.РазделКВ
   |            И ВТ_СтрокиКВ.Номенклатура = ВТ_ВрезервеНаСкладах.Номенклатура
   |        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ЛистыПодбора КАК ВТ_ЛистыПодбора
   |        ПО ВТ_СтрокиКВ.Объект = ВТ_ЛистыПодбора.Объект
   |            И ВТ_СтрокиКВ.РазделКВ = ВТ_ЛистыПодбора.РазделКВ
   |            И ВТ_СтрокиКВ.Номенклатура = ВТ_ЛистыПодбора.Номенклатура
   |        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СвободныйОстаток КАК ВТ_СвободныйОстаток
   |        ПО ВТ_СтрокиКВ.Номенклатура = ВТ_СвободныйОстаток.Номенклатура"
1 zak555
 
10.10.11
15:56
Заказ ССЫЛКА Документ.ВнутреннийЗаказ
   |                И Заказ.Заказчик = &Объект
   |                И Заказ.РазделКВ = &РазделКВ
   |                И (НЕ Размещение ССЫЛКА Справочник.Пользователи)
   |                И (НЕ Размещение ССЫЛКА Справочник.ФизическиеЛица)) КАК УчетТоваровОстатки


что это ?
2 Широкий
 
10.10.11
15:57
|            Заказ ССЫЛКА Документ.ВнутреннийЗаказ
|                И Заказ.Заказчик = &Объект
|                И Заказ.РазделКВ = &РазделКВ

а где "Выразить"?
3 Ненавижу 1С
 
гуру
10.10.11
15:58
да... дали возможность писать пакетные запросы...
4 unregistered
 
10.10.11
15:58
Зачем столько группировок? Виртуальные таблицы выдают данные уже сгруппированными по измерениям. Собственно они по другому и не умеют.
5 Domanoff26
 
10.10.11
16:01
(1) размещение только определенного типа, как то подругому можно?
(2) а как конкретно?
6 Широкий
 
10.10.11
16:04
Выразить(Заказ КАК Документ.ВнутреннийЗаказ).Заказчик=&Объект
7 Широкий
 
10.10.11
16:05
С временными таблицами реально перебор
8 Axel2009
 
10.10.11
16:05
(0) а какой запрос тормозит то?
9 unregistered
 
10.10.11
16:07
Для всех таблиц Остатки можно сделать отбор по Номенклатуре из СтрокиКВ. Если сделать запрос к СтрокиКВ первым в пакете, то во всех остальных можно использовать условие в параметрах таблиц типа Номенклатура В (ВЫБРАТЬ РАЗЛИЧНЫЕ ВТ_СтрокиКВ.Номенклатура ИЗ ВТ_СтрокиКВ КАК ВТ_СтрокиКВ).
10 fimanich
 
10.10.11
16:13
(0) когда создаешь временные таблицы, с которыми потом соединение будет, то используй "ИНДЕКСИРОВАТЬ ПО" для тех полей, по которым будет соединение
11 Amiralnar
 
10.10.11
16:13
Поля для соединений нужно получить сразу. Уточнение поля в условии соединения плохо влияет на время выполнения запроса.

Не ясно, сколько остатков лежит на регистрах накопления - отсюда не ясно, являются ли они трудными для получения.
12 Amiralnar
 
10.10.11
16:14
(10) Да, самое главное - индексировать. Забыл.
13 Axel2009
 
10.10.11
16:37
РегистрНакопления.УчетТоваров.Остатки используется 3 раза. переделать на 1. и 3 колонки через ВЫБОР считать.
14 Domanoff26
 
11.10.11
13:13
(13) но параметры виртуальной таблицы работают быстрее же чем выбор когда...
15 Axel2009
 
11.10.11
14:15
(14) если в итоге 3 запроса суммарно возвращают все записи, то проще 1 раз получить все и просуммировать так как нужно.
16 Domanoff26
 
11.10.11
16:50
еще вопрос, а вот будет быстрее работать если не в запросе обращаться к реквизитам объекта-измерения, а уже в СКД? и если использовать эти объекты в группировках?
17 unregistered
 
11.10.11
17:13
(16) Вряд ли. Ради интереса можно в консоли СКД посмотреть и сравнить текс исходного запроса в схеме с текстом запроса в макете компоновки данных.
18 Amiralnar
 
12.10.11
10:40
А что, (9), (10), (11) не помогло?
СКД обрабатывается сервером 1С. Работает медленнее, чем обрабтка на СУБД.
19 Axel2009
 
12.10.11
10:44
(18) в каком месте медленнее и на сколько?
20 Defender aka LINN
 
12.10.11
10:47
(16) Запрос СКД, по-твоему, их откуда-то из другого места получит? К (17) тот же вопрос.
21 unregistered
 
12.10.11
11:08
(20) >> Запрос СКД, по-твоему, их откуда-то из другого места получит?
Я собственно про то и написал в (17), что "вряд ли".
22 Amiralnar
 
12.10.11
11:09
(19) В ряде случаев, будет происходить получение объекта при разыменовывании реквизита.