|
Как ускорить выполнение запроса | ☑ | ||
---|---|---|---|---|
0
Shikolosa
23.10.20
✎
14:52
|
Здравствуйте, подскажите пожалуйста, как можно ускорить выполнение запроса: Необходимо выбрать списание материалов за определённый период, в разрезе складов.
"ВЫБРАТЬ | ТоварыНаСкладахОбороты.Склад, | ТоварыНаСкладахОбороты.Номенклатура, | ТоварыНаСкладахОбороты.КоличествоРасход, | ТоварыНаСкладахОбороты.Регистратор |ИЗ | РегистрНакопления.ТоварыНаСкладах.Обороты(&ДатаНачала, &ДатаКонца, Запись, Номенклатура.ВидНоменклатуры = &Материал) КАК ТоварыНаСкладахОбороты |ГДЕ | ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОбороты.Регистратор) = ТИП(Документ.ТребованиеНакладная)"; Запрос.УстановитьПараметр("ДатаНачала", ЭтотОбъект.ДатаНачала); Запрос.УстановитьПараметр("ДатаКонца", ЭтотОбъект.ДатаКонец); Результат= Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл НоваяСтрока= ЭтотОбъект.Точка.Добавить(); НоваяСтрока.Номенклатура=Выборка.Номенклатура; НоваяСтрока.Менеджер=НоваяСтрока.Номенклатура.ОтветственныйМенеджерЗаПокупки; НоваяСтрока.Единица=Выборка.Номенклатура.ЕдиницаХраненияОстатков; Если Выборка.Склад=Справочники.Склады.НайтиПоКоду("000000003")Тогда НоваяСтрока.СписаноМех=Выборка.КоличествоРасход; ИначеЕсли Выборка.Склад=Справочники.Склады.НайтиПоКоду("000000004")Тогда НоваяСтрока.СписаноРЭАиП=Выборка.КоличествоРасход; ИначеЕсли Выборка.Склад=Справочники.Склады.НайтиПоКоду("000000005")Тогда НоваяСтрока.СписаноТиТ=Выборка.КоличествоРасход; ИначеЕсли Выборка.Склад=Справочники.Склады.НайтиПоКоду("000000001")Тогда НоваяСтрока.СписаноОсновной=Выборка.КоличествоРасход; ИначеЕсли Выборка.Склад=Справочники.Склады.НайтиПоКоду("000000002")Тогда НоваяСтрока.СписаноМеханика=Выборка.КоличествоРасход; КонецЕсли; |
|||
1
shuhard
23.10.20
✎
14:56
|
(0)[Справочники.Склады.НайтиПоКоду("000000003")] - в цикле зачем ? сравни в запросе со значением
|
|||
2
Shikolosa
23.10.20
✎
15:02
|
(1) Не совсем понимаю как. Движения нужны в разрезе 5 складов.
|
|||
3
Said_We
23.10.20
✎
15:06
|
ВЫБРАТЬ
ТоварыНаСкладахОбороты.Склад, ТоварыНаСкладахОбороты.Номенклатура, ТоварыНаСкладахОбороты.КоличествоРасход, ТоварыНаСкладахОбороты.Регистратор ,ВЫБОР КОГДА ТоварыНаСкладахОбороты.Склад = &Склад_СписаноМех ТОГДА ТоварыНаСкладахОбороты.КоличествоРасход ИНАЧЕ 0 КОНЕЦ КАК СписаноМех ,ВЫБОР КОГДА ТоварыНаСкладахОбороты.Склад = &Склад_СписаноРЭАиП ТОГДА ТоварыНаСкладахОбороты.КоличествоРасход ИНАЧЕ 0 КОНЕЦ КАК СписаноРЭАиП ... |
|||
4
shuhard
23.10.20
✎
15:08
|
(3) +1
или сделать склады предопределенными или классифицировать реквизитом |
|||
5
arsik
гуру
23.10.20
✎
15:08
|
Еще
ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОбороты.Регистратор) = ТИП(Документ.ТребованиеНакладная)
заменить на ТоварыНаСкладахОбороты.Регистратор ССЫЛКА Документ.ТребованиеНакладная |
|||
6
arsik
гуру
23.10.20
✎
15:10
|
Вот это тоже не надо
НоваяСтрока.Менеджер=НоваяСтрока.Номенклатура.ОтветственныйМенеджерЗаПокупки;
Сразу в запросе выбирай |
|||
7
NWsFF
23.10.20
✎
15:10
|
Еще убрать из выборки регистратора и склад и сгруппировать по номенклатуре
|
|||
8
arsik
гуру
23.10.20
✎
15:14
|
И зачем выбирать обороты остаточного регистра через виртуальную таблицу? Проще прямо по движениям сделать
|
|||
9
Timon1405
23.10.20
✎
15:30
|
(5) в SQL это абсолютно одно и то же: WHERE (Т.Recorder REFS Document123)
|
|||
10
Shikolosa
23.10.20
✎
15:30
|
Спасибо!
|
|||
11
arsik
гуру
23.10.20
✎
15:40
|
(9) Возможно, но не факт.
|
|||
12
NWsFF
23.10.20
✎
15:41
|
(9) в SQL есть такой оператор REFS?
|
|||
13
RomanYS
23.10.20
✎
15:52
|
Зачем ускорять запрос, если потом в цикле такое?
НоваяСтрока.Менеджер=НоваяСтрока.Номенклатура.ОтветственныйМенеджерЗаПокупки; НоваяСтрока.Единица=Выборка.Номенклатура.ЕдиницаХраненияОстатков; Если Выборка.Склад=Справочники.Склады.НайтиПоКоду("000000003")Тогда |
|||
14
ILM
гуру
23.10.20
✎
15:54
|
(0) Перепишите на один запрос с использованием
Используй (3), добавь внутреннее соединение со справочником номенклатура, чтобы поля: Номенклатура.ОтветственныйМенеджерЗаПокупки,Номенклатура.ВидНоменклатуры, Номенклатура.ЕдиницаХраненияОстатков брать из него. В запросе сразу формируй все поля таблицы, чтобы не лазить 10 раз к базе. и исправь в условии запроса "ГДЕ ТоварыНаСкладахОбороты.Регистратор ССЫЛКА Документ.ТребованиеНакладная" |
|||
15
arsik
гуру
23.10.20
✎
15:57
|
(14)
>добавь внутреннее соединение со справочником номенклатура, чтобы поля: Номенклатура.ОтветственныйМенеджерЗаПокупки,Номенклатура.ВидНоменклатуры, Номенклатура.ЕдиницаХраненияОстатков брать из него. Это необязательно. Если тип у поля через точку не составной то никакого профита не будет. А если не будет, то без соединения читабельность запроса лучше. |
|||
16
Timon1405
23.10.20
✎
15:59
|
(12) да поправка, REFS оператор 1сного SDBL'a) на sql T1._RecorderTRef
|
|||
17
ILM
гуру
23.10.20
✎
16:00
|
(15) Памяти меньше ест на сервере. Если объем выборки большой, то в выборку попадают только нужные поля.
|
|||
18
Shikolosa
23.10.20
✎
16:51
|
Спасибо большое!! Намного быстрее! Сделала как (14). В результате если без группировки время выполнения: 49,73 сек.
|
|||
19
palsergeich
23.10.20
✎
16:58
|
(18) жесть.
Получи всю номенклатуру с видом = материал. Помести во временную таблицу. И при обращении к виртуальной (а на самом деле в ней нет смысла, ибо по позиции регистратора = к реальной) ставь отбор по номенклатуре из предыдущего пакета. Не надо условия Вирт таблиц делать с точкой |
|||
20
palsergeich
23.10.20
✎
17:01
|
"Выбрать спрНоменклатура.ссылка Как номенклатура Поместить втНоменклатура Из Справочникноменклатура как спрНоменклатура где спрНоменклатура.Видноменклатуры = &материал ;
ВЫБРАТЬ | ТоварыНаСкладахОбороты.Склад, | ТоварыНаСкладахОбороты.Номенклатура, | ТоварыНаСкладахОбороты.КоличествоРасход, | ТоварыНаСкладахОбороты.Регистратор |ИЗ | РегистрНакопления.ТоварыНаСкладах.Обороты(&ДатаНачала, &ДатаКонца, Запись, Номенклатура В (Выбрать втНоменклатура.номенклатура из втНоменклатура КАК втНоменклатура)) КАК ТоварыНаСкладахОбороты |ГДЕ | ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОбороты.Регистратор) = ТИП(Документ.ТребованиеНакладная)"; Хотя бы так |
|||
21
palsergeich
23.10.20
✎
17:02
|
"Выбрать спрНоменклатура.ссылка Как номенклатура Поместить втНоменклатура Из Справочникноменклатура как спрНоменклатура где спрНоменклатура.Видноменклатуры = &материал ;
| ВЫБРАТЬ | ТоварыНаСкладахОбороты.Склад, | ТоварыНаСкладахОбороты.Номенклатура, | ТоварыНаСкладахОбороты.КоличествоРасход, | ТоварыНаСкладахОбороты.Регистратор |ИЗ | РегистрНакопления.ТоварыНаСкладах.Обороты(&ДатаНачала, &ДатаКонца, Запись, Номенклатура В (Выбрать втНоменклатура.номенклатура из втНоменклатура КАК втНоменклатура)) КАК ТоварыНаСкладахОбороты |ГДЕ | ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОбороты.Регистратор) = ТИП(Документ.ТребованиеНакладная)"; Поправил |
|||
22
xXeNoNx
26.10.20
✎
01:44
|
Обороты и регистратор? Ну очень сомнительно.
А требование-накладная делает приход по товарам на складах? |
|||
23
Said_We
26.10.20
✎
11:41
|
(18) Если почти минуту, то скорее всего как в (3) не сделано.
И тормозит не сам запрос, а обработка результата. |
|||
24
D_E_S_131
26.10.20
✎
14:03
|
(19) "Получи всю номенклатуру с видом = материал." - это не рофл сейчас был? :)
|
|||
25
D_E_S_131
26.10.20
✎
14:06
|
+ к (22). Если нужно брать движения расход с учетом регистратора, то виртуальная таблица будет "узким местом". Поэтому либо из движений сразу выбирать данные, либо добавлять измерение в РН, характеризующее вид списания, которое потом можно будет использовать при получении оборотов.
|
|||
26
Shikolosa
26.10.20
✎
15:58
|
Сделала как в (3) и (14) в результате за 1,5 года формирует 11 сек
|
|||
27
Armando
26.10.20
✎
23:04
|
Использование таблицы оборотов в данном случае бессмысленно. Попробуй собрать данные из реальной таблицы. Собственно об этом уже сказали, я лишь поддержу.
И перечисли все измерения регистра в том порядке как они заданы в конфигураторе. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |