Имя: Пароль:
1C
 
Оптимизация запроса с 2-ля левыми соединениями.
0 tabarigen
 
07.02.19
16:56
Здравствуйте  друзья.
Есть запроса подбора остатков, который выполняется очень долго. Около 3-4 секунд.
        ВЫБРАТЬ ПЕРВЫЕ 200
            Номен.Ссылка КАК Номенклатура,
            ТоварыНаСкладахОстатки.Характеристика КАК Серия,
            ТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток,
            ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
        ИЗ
            Справочник.Номенклатура КАК Номен
                ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &РозничныйСклад) КАК ТоварыНаСкладахОстатки
                    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &Розничная) КАК ЦеныНоменклатурыСрезПоследних
                    ПО ТоварыНаСкладахОстатки.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика
                ПО Номен.Ссылка = ТоварыНаСкладахОстатки.Характеристика.Владелец
        ГДЕ
           Номен.НАИМЕНОВАНИЕ ПОДОБНО "%" + &СтрокаПоиска + "%"
        УПОРЯДОЧИТЬ ПО
            Остаток УБЫВ

Я примерно понимаю в чем дело. Каждый раз у меня при запросе отбираются все цены которые когда либо были и все остатки.
В идеале как то сделать так, чтоб цены и остатки брались только для той номенклатуры которая соответствует условию отбора Номен.НАИМЕНОВАНИЕ ПОДОБНО "%" + &СтрокаПоиска + "%"
1 tabarigen
 
07.02.19
16:58
Первая мысль задать в параметрых виртуальных таблиц конструкцию вида ВидЦены = &Розничная И Характеристика ВСПИСКЕ &ТаблицаОтобранныхНоменклатур
2 ДенисЧ
 
07.02.19
16:58
Ну так сначала отбери номенклатуру в временную таблицу, потом уже её соединяй с остальным...
3 FIXXXL
 
07.02.19
16:59
(0) разбей на временные таблицы
1-товар
2 и 3 - данные по товару
а потом уже соединяй
4 serg-lom89
 
07.02.19
16:59
(0) разнеси по виртуальным таблицам.
а то получатся что сразу выполняется весь запрос а потом уже идет отсечение по твоему условию.
5 FIXXXL
 
07.02.19
17:00
ну и ПОДОБНО - это вообще тормозная штука...
6 FIXXXL
 
07.02.19
17:01
плюс условие ГДЕ на левую таблицу надо в связи выносить
но тут не поможет...
7 tabarigen
 
07.02.19
17:03
хм..

ВЫБРАТЬ ПЕРВЫЕ 200
    Номен.Ссылка КАК Номенклатура,
    ТоварыНаСкладахОстатки.Характеристика КАК Серия,
    ТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток,
    ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
ИЗ
    Справочник.Номенклатура КАК Номен
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &РозничныйСклад И Характеристика.Владелец.Наименование ПОДОБНО "%" + &СтрокаПоиска + "%") КАК ТоварыНаСкладахОстатки
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &Розничная И Характеристика.Наименование ПОДОБНО "%" + &СтрокаПоиска + "%") КАК ЦеныНоменклатурыСрезПоследних
            ПО (ТоварыНаСкладахОстатки.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика)
        ПО (Номен.Ссылка = ТоварыНаСкладахОстатки.Характеристика.Владелец)
ГДЕ
    Номен.Наименование ПОДОБНО "%" + &СтрокаПоиска + "%"

УПОРЯДОЧИТЬ ПО
    Остаток УБЫВ


Сделал так.. Я гений??
8 vicof
 
07.02.19
17:03
Где условие по номенклатуре при соединении с ценами?
ПОДОБНО - зло
9 vicof
 
07.02.19
17:03
(7) Гений с большой буквы Г
10 tabarigen
 
07.02.19
17:05
(9) да точноо... туплю под вечер
11 tabarigen
 
07.02.19
17:07
(2) разве когда я буду создавать ВременныеТаблицы они не будут содержать всех данных?
И ЛЕВОЕ СОЕДИНЕНИЕ опять таки будет по огромному регистру цены..
Но все равно щас попробую
12 ДенисЧ
 
07.02.19
17:08
(11) Во временной таблице ты сам регулируешь объём данных, которые в ней хранянтся
13 serg-lom89
 
07.02.19
17:08
Выбери в первом запросе все товары тебе нужные
помести их в виртуальную.
потом
во втором получи остатки и их в виртуальную
потом цены и их в виртуальную.
а итогом запросе склей
14 tabarigen
 
07.02.19
17:09
(13) ок ща сделаю
15 tabarigen
 
07.02.19
17:16
(13) ВЫБРАТЬ ПЕРВЫЕ 200
    Номен.Ссылка КАК Номенклатура
ПОМЕСТИТЬ ВрТовары
ИЗ
    Справочник.Номенклатура КАК Номен
ГДЕ
    Номен.Наименование ПОДОБНО "%" + &СтрокаПоиска + "%"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Остатки.Характеристика КАК Характеристика,
    Остатки.КоличествоОстаток КАК КоличествоОстаток
ПОМЕСТИТЬ ВрОстатки
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОстатков, Склад = &РозничныйСклад) КАК Остатки
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Цены.Характеристика КАК Характеристика,
    Цены.Цена КАК Цена
ПОМЕСТИТЬ ВрЦены
ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &Розничная) КАК Цены
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВрТовары.Номенклатура КАК Номенклатура,
    ВрОстатки.Характеристика КАК Характеристика,
    ВрОстатки.КоличествоОстаток КАК КоличествоОстаток,
    ВрЦены.Цена КАК Цена
ИЗ
    ВрТовары КАК ВрТовары
        ЛЕВОЕ СОЕДИНЕНИЕ ВрОстатки КАК ВрОстатки
            ЛЕВОЕ СОЕДИНЕНИЕ ВрЦены КАК ВрЦены
            ПО (ВрОстатки.Характеристика = ВрЦены.Характеристика)
        ПО (ВрТовары.Номенклатура = ВрОстатки.Характеристика.Владелец)


___
Переделал прирост не такой большой..
время выполнения  = 1.891с
16 Вафель
 
07.02.19
17:18
Зачем вот так
ВрТовары.Номенклатура = ВрОстатки.Характеристика.Владелец
17 Вафель
 
07.02.19
17:18
у регистра цен стоит галка итоги по срез послдедних?
18 tabarigen
 
07.02.19
17:18
(16) ну а как по другому то..
19 tabarigen
 
07.02.19
17:19
(17) не стоит
20 tabarigen
 
07.02.19
17:22
ВрТовары.Номенклатура = ВрОстатки.Характеристика.Владелец
поменял на
ВрТовары.Номенклатура = ВрОстатки.Номенклатура

стало еще чуть дольше выполняться 2.54 - 3 сек
21 AllJoke
 
07.02.19
17:25
Параметр в виртуальные таблиц Остатки Цены поставить.
Где Номенклатура в (Выбрать Товар из ВТ_Товары)
22 Вафель
 
07.02.19
17:27
(19) ну так поставь
23 tabarigen
 
07.02.19
17:28
(22) конфа на поддержке
24 tabarigen
 
07.02.19
17:59
(21) Спасибо тебе добрый человек.
И всем остальным тоже.
25 Puzoter
 
07.02.19
18:01
(21) Как-то так:

ВЫБРАТЬ
    Номен.Ссылка КАК Номенклатура
ПОМЕСТИТЬ ВрТовары
ИЗ
    Справочник.Номенклатура КАК Номен
ГДЕ
    Номен.Наименование ПОДОБНО "%" + &СтрокаПоиска + "%"
Индексировать по Номенклатура    
;

////////////////////////////////////////////////////////////////////////////////

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

////////////////////////////////////////////////////////////////////////////////

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

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ Первые 200
    ВрТовары.Номенклатура КАК Номенклатура,
    ВрОстатки.Характеристика КАК Характеристика,
    ВрОстатки.КоличествоОстаток КАК КоличествоОстаток,
    ВрЦены.Цена КАК Цена
ИЗ
    ВрТовары КАК ВрТовары
        ЛЕВОЕ СОЕДИНЕНИЕ ВрОстатки КАК ВрОстатки
            ЛЕВОЕ СОЕДИНЕНИЕ ВрЦены КАК ВрЦены
            ПО (ВрОстатки.Характеристика = ВрЦены.Характеристика)
        ПО (ВрТовары.Номенклатура = ВрОстатки.Номенклатура)
26 H A D G E H O G s
 
07.02.19
18:17
Первые 200
в самый первый запрос
27 H A D G E H O G s
 
07.02.19
18:18
И пользователи скажут тебе спасибо, когда забьют пустую строку
28 Puzoter
 
07.02.19
18:23
(26) Не факт, что у этих первых двухсот будут какие-то остатки, а значит такая выборка не имеет особого смысла.
29 Puzoter
 
07.02.19
18:26
(26) Хотя если в последнем запросе нет отбора по NULL то действительно лучше в первый.
30 H A D G E H O G s
 
07.02.19
18:28
(29) Да
31 serg-lom89
 
08.02.19
08:40
(14) наложи отбор на таблицы товара из первого запроса. как в (25)
32 tabarigen
 
08.02.19
11:46
(25) спасибо за ваш вариант.
мой запрос который я написал уже работает очень быстро.
Еше бы понять зачем индексирование в вашем варианте.
33 Eiffil123
 
11.02.19
18:20
(32) рекомендации 1С - индексировать поля временных таблиц, по которым идет отбор или соединение. Далеко не всегда влияет на результат, но общий подход такой.
Ошибка? Это не ошибка, это системная функция.