Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Как ускорить выполнение запроса

Как ускорить выполнение  запроса
Я
   Shikolosa
 
23.10.20 - 14:52
Здравствуйте, подскажите пожалуйста, как можно ускорить выполнение запроса:  Необходимо выбрать списание материалов за определённый период, в разрезе складов.
                        "ВЫБРАТЬ
                   |    ТоварыНаСкладахОбороты.Склад,
                   |    ТоварыНаСкладахОбороты.Номенклатура,
                   |    ТоварыНаСкладахОбороты.КоличествоРасход,
                   |    ТоварыНаСкладахОбороты.Регистратор
                   |ИЗ
                   |    РегистрНакопления.ТоварыНаСкладах.Обороты(&ДатаНачала, &ДатаКонца, Запись, Номенклатура.ВидНоменклатуры = &Материал) КАК ТоварыНаСкладахОбороты
                   |ГДЕ
                   |    ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОбороты.Регистратор) = ТИП(Документ.ТребованиеНакладная)";
Запрос.УстановитьПараметр("ДатаНачала", ЭтотОбъект.ДатаНачала);
  Запрос.УстановитьПараметр("ДатаКонца", ЭтотОбъект.ДатаКонец);
   Результат= Запрос.Выполнить();
   Выборка = Результат.Выбрать();
   Пока Выборка.Следующий() Цикл
    НоваяСтрока= ЭтотОбъект.Точка.Добавить();
    НоваяСтрока.Номенклатура=Выборка.Номенклатура;
    НоваяСтрока.Менеджер=НоваяСтрока.Номенклатура.ОтветственныйМенеджерЗаПокупки;
    НоваяСтрока.Единица=Выборка.Номенклатура.ЕдиницаХраненияОстатков;
Если Выборка.Склад=Справочники.Склады.НайтиПоКоду("000000003")Тогда
    НоваяСтрока.СписаноМех=Выборка.КоличествоРасход;
ИначеЕсли Выборка.Склад=Справочники.Склады.НайтиПоКоду("000000004")Тогда
    НоваяСтрока.СписаноРЭАиП=Выборка.КоличествоРасход;
ИначеЕсли Выборка.Склад=Справочники.Склады.НайтиПоКоду("000000005")Тогда
    НоваяСтрока.СписаноТиТ=Выборка.КоличествоРасход;
ИначеЕсли Выборка.Склад=Справочники.Склады.НайтиПоКоду("000000001")Тогда
    НоваяСтрока.СписаноОсновной=Выборка.КоличествоРасход;
ИначеЕсли Выборка.Склад=Справочники.Склады.НайтиПоКоду("000000002")Тогда
    НоваяСтрока.СписаноМеханика=Выборка.КоличествоРасход;
КонецЕсли;
   shuhard
 
1 - 23.10.20 - 14:56
(0)[Справочники.Склады.НайтиПоКоду("000000003")] - в цикле зачем ? сравни в запросе со значением
   Shikolosa
 
2 - 23.10.20 - 15:02
(1) Не совсем понимаю как. Движения нужны в разрезе 5 складов.
   Said_We
 
3 - 23.10.20 - 15:06
ВЫБРАТЬ
    ТоварыНаСкладахОбороты.Склад,
    ТоварыНаСкладахОбороты.Номенклатура,
    ТоварыНаСкладахОбороты.КоличествоРасход,
    ТоварыНаСкладахОбороты.Регистратор
    ,ВЫБОР КОГДА ТоварыНаСкладахОбороты.Склад = &Склад_СписаноМех ТОГДА ТоварыНаСкладахОбороты.КоличествоРасход ИНАЧЕ 0 КОНЕЦ КАК СписаноМех
    ,ВЫБОР КОГДА ТоварыНаСкладахОбороты.Склад = &Склад_СписаноРЭАиП ТОГДА ТоварыНаСкладахОбороты.КоличествоРасход ИНАЧЕ 0 КОНЕЦ КАК СписаноРЭАиП
...
   shuhard
 
4 - 23.10.20 - 15:08
(3) +1
или сделать склады предопределенными или классифицировать реквизитом
   arsik
 
5 - 23.10.20 - 15:08
Еще
ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОбороты.Регистратор) = ТИП(Документ.ТребованиеНакладная)

заменить на
ТоварыНаСкладахОбороты.Регистратор ССЫЛКА Документ.ТребованиеНакладная

   arsik
 
6 - 23.10.20 - 15:10
Вот это тоже не надо
НоваяСтрока.Менеджер=НоваяСтрока.Номенклатура.ОтветственныйМенеджерЗаПокупки;
НоваяСтрока.Единица=Выборка.Номенклатура.ЕдиницаХраненияОстатков;

Сразу в запросе выбирай
   NWsFF
 
7 - 23.10.20 - 15:10
Еще убрать из выборки регистратора и склад  и сгруппировать по номенклатуре
   arsik
 
8 - 23.10.20 - 15:14
И зачем выбирать обороты остаточного регистра через виртуальную таблицу? Проще прямо по движениям сделать
   Timon1405
 
9 - 23.10.20 - 15:30
(5) в SQL это абсолютно одно и то же: WHERE (Т.Recorder REFS Document123)
   Shikolosa
 
10 - 23.10.20 - 15:30
Спасибо!
   arsik
 
11 - 23.10.20 - 15:40
(9) Возможно, но не факт.
   NWsFF
 
12 - 23.10.20 - 15:41
(9) в SQL есть такой оператор REFS?
   RomanYS
 
13 - 23.10.20 - 15:52
Зачем ускорять запрос, если потом в цикле такое?

НоваяСтрока.Менеджер=НоваяСтрока.Номенклатура.ОтветственныйМенеджерЗаПокупки;
НоваяСтрока.Единица=Выборка.Номенклатура.ЕдиницаХраненияОстатков;
Если Выборка.Склад=Справочники.Склады.НайтиПоКоду("000000003")Тогда
   ILM
 
14 - 23.10.20 - 15:54
(0) Перепишите на один запрос с использованием
Используй (3), добавь внутреннее соединение со справочником номенклатура, чтобы поля: Номенклатура.ОтветственныйМенеджерЗаПокупки,Номенклатура.ВидНоменклатуры, Номенклатура.ЕдиницаХраненияОстатков брать из него. В запросе сразу формируй все поля таблицы, чтобы не лазить 10 раз к базе.
и исправь в условии запроса
"ГДЕ 
  ТоварыНаСкладахОбороты.Регистратор ССЫЛКА Документ.ТребованиеНакладная"
   arsik
 
15 - 23.10.20 - 15:57
(14)
>добавь внутреннее соединение со справочником номенклатура, чтобы поля: Номенклатура.ОтветственныйМенеджерЗаПокупки,Номенклатура.ВидНоменклатуры, Номенклатура.ЕдиницаХраненияОстатков брать из него.
Это необязательно. Если тип у поля через точку не составной то никакого профита не будет. А если не будет, то без соединения читабельность запроса лучше.
   Timon1405
 
16 - 23.10.20 - 15:59
(12) да поправка, REFS оператор 1сного SDBL'a) на sql T1._RecorderTRef
   ILM
 
17 - 23.10.20 - 16:00
(15) Памяти меньше ест на сервере. Если объем выборки большой, то в выборку попадают только нужные поля.
   Shikolosa
 
18 - 23.10.20 - 16:51
Спасибо большое!! Намного быстрее! Сделала как (14). В результате если без группировки время выполнения: 49,73 сек.
   palsergeich
 
19 - 23.10.20 - 16:58
(18) жесть.
Получи всю номенклатуру с видом = материал.
Помести во временную таблицу.
И при обращении к виртуальной (а на самом деле в ней нет смысла, ибо по позиции регистратора = к реальной) ставь отбор по номенклатуре из предыдущего пакета.
Не надо условия Вирт таблиц делать с точкой
   palsergeich
 
20 - 23.10.20 - 17:01
"Выбрать спрНоменклатура.ссылка Как номенклатура Поместить втНоменклатура Из Справочникноменклатура как спрНоменклатура где спрНоменклатура.Видноменклатуры = &материал ;
ВЫБРАТЬ
                   |    ТоварыНаСкладахОбороты.Склад,
                   |    ТоварыНаСкладахОбороты.Номенклатура,
                   |    ТоварыНаСкладахОбороты.КоличествоРасход,
                   |    ТоварыНаСкладахОбороты.Регистратор
                   |ИЗ
                   |    РегистрНакопления.ТоварыНаСкладах.Обороты(&ДатаНачала, &ДатаКонца, Запись, Номенклатура В (Выбрать втНоменклатура.номенклатура из втНоменклатура КАК втНоменклатура)) КАК ТоварыНаСкладахОбороты
                   |ГДЕ
                   |    ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОбороты.Регистратор) = ТИП(Документ.ТребованиеНакладная)";

Хотя бы так
   palsergeich
 
21 - 23.10.20 - 17:02
"Выбрать спрНоменклатура.ссылка Как номенклатура Поместить втНоменклатура Из Справочникноменклатура как спрНоменклатура где спрНоменклатура.Видноменклатуры = &материал ;
| ВЫБРАТЬ
                   |    ТоварыНаСкладахОбороты.Склад,
                   |    ТоварыНаСкладахОбороты.Номенклатура,
                   |    ТоварыНаСкладахОбороты.КоличествоРасход,
                   |    ТоварыНаСкладахОбороты.Регистратор
                   |ИЗ
                   |    РегистрНакопления.ТоварыНаСкладах.Обороты(&ДатаНачала, &ДатаКонца, Запись, Номенклатура В (Выбрать втНоменклатура.номенклатура из втНоменклатура КАК втНоменклатура)) КАК ТоварыНаСкладахОбороты
                   |ГДЕ
                   |    ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОбороты.Регистратор) = ТИП(Документ.ТребованиеНакладная)";
Поправил
   xXeNoNx
 
22 - 26.10.20 - 01:44
Обороты и регистратор? Ну очень сомнительно.
А требование-накладная делает приход по товарам на складах?
   Said_We
 
23 - 26.10.20 - 11:41
(18) Если почти минуту, то скорее всего как в (3) не сделано.
И тормозит не сам запрос, а обработка результата.
   D_E_S_131
 
24 - 26.10.20 - 14:03
(19) "Получи всю номенклатуру с видом = материал." - это не рофл сейчас был? :)
   D_E_S_131
 
25 - 26.10.20 - 14:06
+ к (22). Если нужно брать движения расход с учетом регистратора, то виртуальная таблица будет "узким местом". Поэтому либо из движений сразу выбирать данные, либо добавлять измерение в РН, характеризующее вид списания, которое потом можно будет использовать при получении оборотов.
   Shikolosa
 
26 - 26.10.20 - 15:58
Сделала как в (3) и (14) в результате за 1,5 года формирует 11 сек
   Armando
 
27 - 26.10.20 - 23:04
Использование таблицы оборотов в данном случае бессмысленно. Попробуй собрать данные из реальной таблицы. Собственно об этом уже сказали, я лишь поддержу.
И перечисли все измерения регистра в том порядке как они заданы в конфигураторе.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.