Имя: Пароль:
1C
1С v8
Медленная работа запроса
,
0 Lepochkin
 
09.10.12
11:06
Имеем следующий запрос
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
                         |    Остатки.Номенклатура.Наименование КАК Наименование,
                         |    Остатки.Номенклатура,
                         |    Остатки.Номенклатура.Код КАК Код,
                         |    Остатки.Номенклатура.НоменклатурнаяГруппа КАК Номенклатурнаягруппа,
                         |    Остатки.Номенклатура.КолФас КАК КолвоУпак,
                         |    Остатки.КоличествоОстаток - ЕСТЬNULL(Резервы.КоличествоОстаток, 0) КАК Остаток,
                         |    &Коэффициент * срез.Цена КАК Цена,
                         |    ЕСТЬNULL(МинимальныеПартии.Количество, 0) КАК МинимальнаяПартия
                         |ИЗ
                         |    РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад) КАК Остатки
                         |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен = &ТипЦены) КАК срез
                         |        ПО Остатки.Номенклатура = срез.Номенклатура
                         |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИНМинимальныеПартии КАК МинимальныеПартии
                         |        ПО (МинимальныеПартии.Номенклатура = Остатки.Номенклатура)
                         |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&Дата, ДокументРезерва.Контрагент <> &Контрагент) КАК Резервы
                         |        ПО Остатки.Номенклатура = Резервы.Номенклатура
                         |
                         |УПОРЯДОЧИТЬ ПО
                         |    Наименование

Он вызывается при открытии одной обработки. Дак вот. При открытии обработки он почему-то выполняется примерно 30 секунд, а если я этот запрос делаю в консоли запросов, то примерно 2 секунды. Откуда такая разница в производительности???
1 DrShad
 
09.10.12
11:07
точно именно запрос или все таки обработка результата тормозит?
2 Lepochkin
 
09.10.12
11:09
Результат = Запрос.Выполнить(); //99.6% времени выполнения
   НоменклатураДляПодбора.Загрузить(Результат.Выгрузить());
3 DrShad
 
09.10.12
11:10
НоменклатураДляПодбора.Загрузить(Результат.Выгрузить());

а это сколько?
4 Lepochkin
 
09.10.12
11:12
НоменклатураДляПодбора - табличная часть обработки
5 Lepochkin
 
09.10.12
11:12
(3)0,03%. за (4) сорри не так прочитал
6 DrShad
 
09.10.12
11:14
и эта разница под одним юзером?
7 Lepochkin
 
09.10.12
11:14
ага
8 DrShad
 
09.10.12
11:15
странно, но проверить не на чем ибо у тебя конфа не типовая уже
9 Fragster
 
гуру
09.10.12
11:15
перенести все виртуальные таблицы во временные
10 hhhh
 
09.10.12
11:16
(7) похоже вот эта фигня тормозит

ДокументРезерва.Контрагент <> &Контрагент

попытайтесь избавиться от нее любым способом.
11 Fragster
 
гуру
09.10.12
11:16
запрос в обработке в транзакции??
12 chelentano
 
09.10.12
11:16
(0) выбери сначала номенклатуру из остатков во временную таблицу, потом в виртуальных таблицах накладывай условие на номенклатуру
13 Lepochkin
 
09.10.12
11:21
(11) Нет. И честно у меня сомнения что выполнения запроса в транзакции даст прирост в скорости.
(7) Попробую как-нибудь...
14 Fragster
 
гуру
09.10.12
11:23
(13) наоборот, выполнение запроса в транзакции замедляет
15 GLazNik
 
09.10.12
11:28
(0) разная скорость выполнения запроса в консоли и в обработке - не показатель. там кеши какие нить могут быть и прочее.
а вот оптимизировать запрос есть куда. например см (12). Кстати постепенно подключая таблицы можно будет понять где именно возникают тормаза.
16 Lepochkin
 
09.10.12
11:30
(14)Ну у меня такое же мнение было.
(7) Пообщавшись с менеджерами выяснил, что резервный товар через эту обработку никто и не смотрит, потому переделал на
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&Дата) КАК Резервы
Результат - 7 секунд. Весьма неплохо, но все равно в 2,5 раза дольше чем в консоли...
17 Lepochkin
 
09.10.12
11:46
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
                         |    ТоварыОстатки.Номенклатура КАК Номенклатура,
                         |    ТоварыОстатки.КоличествоОстаток            
                         |ПОМЕСТИТЬ Остатки    
                         |ИЗ
                         |    РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад) КАК ТоварыОстатки
                         |ИНДЕКСИРОВАТЬ ПО
                         |    ТоварыОстатки.Номенклатура;
                         |////////////////////////////////////////////////
                   ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
                         |    ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
                         |    ЦеныНоменклатуры.Цена            
                         |ПОМЕСТИТЬ срез    
                         |ИЗ
                         |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен = &ТипЦены) КАК ЦеныНоменклатуры
                         |ИНДЕКСИРОВАТЬ ПО
                         |    ЦеныНоменклатуры.Номенклатура;
                         
                   ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
                         |    Остатки.Номенклатура.Наименование КАК Наименование,
                         |    Остатки.Номенклатура,
                         |    Остатки.Номенклатура.Код КАК Код,
                         |    Остатки.Номенклатура.НоменклатурнаяГруппа КАК Номенклатурнаягруппа,
                         |    Остатки.Номенклатура.КолФас КАК КолвоУпак,
                         |    Остатки.КоличествоОстаток - ЕСТЬNULL(Резервы.КоличествоОстаток, 0) КАК Остаток,
                         |    &Коэффициент * срез.Цена КАК Цена,
                         |    ЕСТЬNULL(МинимальныеПартии.Количество, 0) КАК МинимальнаяПартия
                         |ИЗ
                         |    Остатки КАК Остатки
                         |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ срез КАК срез
                         |        ПО Остатки.Номенклатура = срез.Номенклатура
                         |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИНМинимальныеПартии КАК МинимальныеПартии
                         |        ПО (МинимальныеПартии.Номенклатура = Остатки.Номенклатура)
                         |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&Дата) КАК Резервы
                         |        ПО Остатки.Номенклатура = Резервы.Номенклатура
                         |
                         |УПОРЯДОЧИТЬ ПО
                         |    Наименование
Этот вариант работает значительно дольше
18 GLazNik
 
09.10.12
11:49
(17) эмъ... а что мешает при формировании таблицы срез использовать только номенклатуру из остатки?
19 Lepochkin
 
09.10.12
11:51
(17)Человек может отгружать только с конкретного склада, так что срез в разрезе номенклатура-склад мне нужен
20 Fragster
 
гуру
09.10.12
11:54
обращение через две точки перенеси в первую таблицу
21 Fragster
 
гуру
09.10.12
11:56
(19) РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, Номенклатура в (Выбрать Остатки.Номенклатура из Остатки) И ТипЦен = &ТипЦены)
22 Fragster
 
гуру
09.10.12
11:56
ну и товары в резерве тоже в ВТ.
23 SUA
 
09.10.12
12:01
(16)а вообще выкинуть тогда?
24 Fragster
 
гуру
09.10.12
12:02
а резервы тоже, наверное, в разрезе склада
25 Lepochkin
 
09.10.12
12:02
(23)Вообще выкинуть нельзя. Тогда резервы будут видны
26 Lepochkin
 
09.10.12
12:05
Конечный вариант. Более менее приемлемый.
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
                         |    ТоварыОстатки.Номенклатура КАК Номенклатура,
                         |    ТоварыОстатки.Номенклатура.Наименование КАК Наименование,
                         |    ТоварыОстатки.Номенклатура.Код КАК Код,
                         |    ТоварыОстатки.Номенклатура.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа,
                         |    ТоварыОстатки.Номенклатура.КолФас КАК КолФас,
                         |    ТоварыОстатки.КоличествоОстаток            
                         |ПОМЕСТИТЬ Остатки    
                         |ИЗ
                         |    РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад) КАК ТоварыОстатки
                         |ИНДЕКСИРОВАТЬ ПО
                         |    ТоварыОстатки.Номенклатура;
                         |////////////////////////////////////////////////
                         |ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
                         |    ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
                         |    ЦеныНоменклатуры.Цена            
                         |ПОМЕСТИТЬ срез    
                         |ИЗ
                         |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата,Номенклатура в (Выбрать Остатки.Номенклатура из Остатки) И ТипЦен = &ТипЦены) КАК ЦеныНоменклатуры
                         |ИНДЕКСИРОВАТЬ ПО
                         |    ЦеныНоменклатуры.Номенклатура;
                         |////////////////////////////////////////////////
                         |ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
                         |    РезервыОстатки.Номенклатура КАК Номенклатура,
                         |    РезервыОстатки.КоличествоОстаток            
                         |ПОМЕСТИТЬ Резервы    
                         |ИЗ
                         |    РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&Дата,Номенклатура в (Выбрать Остатки.Номенклатура из Остатки)) КАК РезервыОстатки
                         |ИНДЕКСИРОВАТЬ ПО
                         |    РезервыОстатки.Номенклатура;
                         |////////////////////////////////////////////////
                         |ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
                         |    Остатки.Наименование КАК Наименование,
                         |    Остатки.Номенклатура,
                         |    Остатки.Код КАК Код,
                         |    Остатки.НоменклатурнаяГруппа КАК Номенклатурнаягруппа,
                         |    Остатки.КолФас КАК КолвоУпак,
                         |    Остатки.КоличествоОстаток - ЕСТЬNULL(Резервы.КоличествоОстаток, 0) КАК Остаток,
                         |    &Коэффициент * срез.Цена КАК Цена,
                         |    ЕСТЬNULL(МинимальныеПартии.Количество, 0) КАК МинимальнаяПартия
                         |ИЗ
                         |    Остатки КАК Остатки
                         |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ срез КАК срез
                         |        ПО Остатки.Номенклатура = срез.Номенклатура
                         |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИНМинимальныеПартии КАК МинимальныеПартии
                         |        ПО (МинимальныеПартии.Номенклатура = Остатки.Номенклатура)
                         |        ЛЕВОЕ СОЕДИНЕНИЕ Резервы КАК Резервы
                         |        ПО Остатки.Номенклатура = Резервы.Номенклатура
                         |
                         |УПОРЯДОЧИТЬ ПО
                         |    Наименование
Если есть еще идеи по оптимизации буду рад выслушать
27 Fragster
 
гуру
09.10.12
12:06
(26) резервы не по складу?
29 akcent25
 
09.10.12
12:10
(26)А здесь - РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад) измерение Склад идет первым у регистра? Если нет, то его лучше проиндексировать.
30 НЕА123
 
09.10.12
12:11
НоменклатураДляПодбора.Загрузить(Запрос.Выполнить().Выгрузить());
31 Александр_
Тверь
 
09.10.12
12:12
а ты случайно обработку запускаешь не под другим пользователем?
А то как вариант у тебя полные права и нет RLS, а у пользователя под которым ты запускаешь - есть контроль RLS
конструация "РАЗРЕШЕННЫЕ" указывает на то, что нужно выполнить дополнительную фильтрацию полученных данных в соответствии с RLs и это может вызывать существенное замедление.
32 Рыжий Лис
 
09.10.12
12:17
(26) Убрать РАЗЛИЧНЫЕ