Имя: Пароль:
1C
1С v8
Как ускорить этот небольшой запрос? ☑
0 dinam
 
01.07.14
✎
08:12
День добрый. Есть не очень большой запрос, который выполняется больше 20 секунд, к сожалению не хватает знаний, чтобы его ускорить. Подскажите примерное направление для ускорения сего чуда:

ТекстЗапросаСписокНоменклатуры = "ВЫБРАТЬ РАЗЛИЧНЫЕ
                                     |    ПереоценкаТоваровВРозницеТовары.Номенклатура
                                     |ИЗ
                                     |    Документ.ПереоценкаТоваровВРознице.Товары КАК ПереоценкаТоваровВРозницеТовары
                                     |ГДЕ
                                     |    ПереоценкаТоваровВРозницеТовары.Ссылка = &ДокСсылка";
                                    
    
    Запрос1 = Новый Запрос;
    Запрос1.УстановитьПараметр("ДокСсылка", Ссылка);
    Запрос1.Текст = ТекстЗапросаСписокНоменклатуры;
    Табл = Запрос1.Выполнить().Выгрузить();
                                    
    ТекстЗапросаСписокХарактеристик ="ВЫБРАТЬ РАЗЛИЧНЫЕ
                                     |    ПереоценкаТоваровВРозницеТовары.ХарактеристикаНоменклатуры
                                     |ИЗ
                                     |    Документ.ПереоценкаТоваровВРознице.Товары КАК ПереоценкаТоваровВРозницеТовары
                                     |ГДЕ
                                     |    ПереоценкаТоваровВРозницеТовары.Ссылка = &ДокСсылка";                                    
                                    
                                    
    Запрос1.Текст = ТекстЗапросаСписокХарактеристик;
    Табл = Запрос1.Выполнить().Выгрузить();


    ТекстЗапроса = "
    |ВЫБРАТЬ
    |    &Склад КАК Склад,
    |    Док.Номенклатура КАК Номенклатура,
    |    ЕСТЬNULL(Характеристики.Ссылка, Док.ХарактеристикаНоменклатуры) КАК ХарактеристикаНоменклатуры,
    |    Остатки.СерияНоменклатуры КАК СерияНоменклатуры,
    |    Остатки.Качество КАК Качество,
    |    Док.ЦенаВРознице * Остатки.КоличествоОстаток - Остатки.СуммаПродажнаяОстаток КАК СуммаПродажная
    |ИЗ
    |    Документ.ПереоценкаТоваровВРознице.Товары КАК Док
    |ЛЕВОЕ СОЕДИНЕНИЕ
    |    (ВЫБРАТЬ
    |        Характеристики.Ссылка КАК Ссылка,
    |        Характеристики.Владелец КАК Владелец
    |    ИЗ
    |        Справочник.ХарактеристикиНоменклатуры КАК Характеристики
    |    ГДЕ
    |        Характеристики.Владелец
    |        И Характеристики.Ссылка
    |        И Характеристики.Ссылка НЕ В (
    |            ВЫБРАТЬ
    |                ЦеныПродажные.ХарактеристикаНоменклатуры
    |            ИЗ
    |                РегистрСведений.ЦеныАТТ.СрезПоследних(&Дата,
    |                   Номенклатура В (" + ТекстЗапросаСписокНоменклатуры + ")) КАК ЦеныПродажные
    |        )
    |    ОБЪЕДИНИТЬ ВСЕ
    |    ВЫБРАТЬ
    |        ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК Ссылка,
    |        Номенклатура.Ссылка КАК Владелец
    |    ИЗ
    |        Справочник.Номенклатура КАК Номенклатура
    |    ГДЕ
    |        Номенклатура.Ссылка В (" + ТекстЗапросаСписокНоменклатуры + ")
    |    ) КАК Характеристики
    |ПО
    |    Док.Номенклатура = Характеристики.Владелец
    |    И Док.ХарактеристикаНоменклатуры = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
    |СОЕДИНЕНИЕ
    |    РегистрНакопления.ТоварыВРознице.Остатки(&Дата, Склад = &Склад И Номенклатура В (" + ТекстЗапросаСписокНоменклатуры + ")) КАК Остатки
    |ПО
    |    Док.Номенклатура = Остатки.Номенклатура
    |    И ЕСТЬNULL(Характеристики.Ссылка, Док.ХарактеристикаНоменклатуры) = Остатки.ХарактеристикаНоменклатуры
    |ГДЕ
    |    Док.Ссылка = &ДокСсылка
    |    И Док.ЦенаВРознице * Остатки.КоличествоОстаток - Остатки.СуммаПродажнаяОстаток <> 0
    |";
1 Мимохожий Однако
 
01.07.14
✎
08:25
Здесь три запроса и две выгрузки результатов.
Сделай пакетный запрос с временными таблицами.
2 kosts
 
01.07.14
✎
08:29
Вот это вызывает подозрение, зачем получать посторонние характеристики (НЕ В)

ВЫБРАТЬ
            Характеристики.Ссылка КАК Ссылка,
            Характеристики.Владелец КАК Владелец
        ИЗ
            Справочник.ХарактеристикиНоменклатуры КАК Характеристики
        ГДЕ
            Характеристики.Владелец
            И Характеристики.Ссылка
            И Характеристики.Ссылка НЕ В (ВЫБРАТЬ
                        ЦеныПродажные.ХарактеристикаНоменклатуры
                    ИЗ
                        РегистрСведений.ЦеныАТТ.СрезПоследних(&Дата, Номенклатура В (&ТекстЗапросаСписокНоменклатуры)
3 kosts
 
01.07.14
✎
08:32

Док.ЦенаВРознице * Остатки.КоличествоОстаток - Остатки.СуммаПродажнаяОстаток

Тут скорее всего нужно использовать ЕстьNull(Остатки.КоличествоОстаток,0) и ЕстьNull(Остатки.СуммаПродажнаяОстаток,0)
4 ChiginAV
 
01.07.14
✎
08:38
СписокНоменклатуры уже получен выше, зачем его еще несколько раз получать в большом запросе?

Вложенный запрос из условия лучше вынести как отдельный. Выгрузить в массив и использовать этот массив в условии
5 kosts
 
01.07.14
✎
08:42
(2) + В этом же куске, зачем получать характеристики через цены, возможно лучше цены если цены как то влияют, то их левым соединением к главному запросу присоединить.

Напиши цель запроса. Тогда лучше подскажут.
6 Мимохожий Однако
 
01.07.14
✎
08:45
(5)+1
7 Fragster
 
гуру
01.07.14
✎
08:55
сделать так, чтобы запрос открывался конструктором
Закон Брукера: Даже маленькая практика стоит большой теории.