Имя: Пароль:
1C
 
Есть у кого идеи по оптимизации запроса?
, ,
0 Маленький Вопросик
 
09.08.22
10:38
ВЫБРАТЬ
                            |    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
                            |    &Штрихкод КАК Штрихкод,
                            |    СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК КоличествоОстаток,
                            |    КодыТоваровSKU.SKU КАК SKU
                            |ИЗ
                            |    РегистрНакопления.ТоварыНаСкладах.Остатки(
                            |            &ТекДата,
                            |            Склад.Магазин = &Магазин
                            |                И Номенклатура В
                            |                    (ВЫБРАТЬ ПЕРВЫЕ 1
                            |                        Штрихкоды.Владелец КАК Владелец
                            |                    ИЗ
                            |                        РегистрСведений.Штрихкоды КАК Штрихкоды
                            |                    ГДЕ
                            |                        Штрихкоды.Штрихкод = &Штрихкод)) КАК ТоварыНаСкладахОстатки
                            |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КодыТоваровSKU КАК КодыТоваровSKU
                            |        ПО ТоварыНаСкладахОстатки.Номенклатура = КодыТоваровSKU.Номенклатура
                            |
                            |СГРУППИРОВАТЬ ПО
                            |    ТоварыНаСкладахОстатки.Номенклатура,
                            |    КодыТоваровSKU.SKU
1 rphosts
 
09.08.22
10:46
Не имея перед глазщами структуры сложно... ну вынеси во временную подзапрос из условия - СУБД будет чуть легче пронозировать
2 Dmitrii
 
гуру
09.08.22
10:48
(0) А зачем тут группировка, если склада в полях запроса нет?
3 Kassern
 
09.08.22
10:49
(0) Вот это перепишите И Номенклатура В
                            |                    (ВЫБРАТЬ ПЕРВЫЕ 1
                            |                        Штрихкоды.Владелец КАК Владелец
                            |                    ИЗ
                            |                        РегистрСведений.Штрихкоды КАК Штрихкоды
                            |                    ГДЕ
                            |                        Штрихкоды.Штрихкод = &Штрихкод))
4 Кир Пластелинин
 
09.08.22
10:51
а левое соединение никого не смутило?
5 ptiz
 
09.08.22
10:56
(0) А сейчас насколько медленно работает? Судя по коду, вычисление номенклатуры и массива складов можно сделать вне запроса и отдать ему готовые параметры. Если нет - хотя бы через временную таблицу.
6 eklmn
 
гуру
09.08.22
10:58
в (3) прав
7 dmt
 
09.08.22
11:01
Если действовать по шаблону, то нужно убрать вложенный запрос из параметров виртуальной таблицы, убрать соединение с виртуальной таблицей.

Но практика может показать, что разницы нет )
8 Fedor-1971
 
09.08.22
11:06
(0) Собери промежуточную ТЧ из
                            |                И Номенклатура В
                            |                    (ВЫБРАТЬ ПЕРВЫЕ 1
                            |                        Штрихкоды.Владелец КАК Владелец
                            |                    ИЗ
                            |                        РегистрСведений.Штрихкоды КАК Штрихкоды
                            |                    ГДЕ
                            |                        Штрихкоды.Штрихкод = &Штрихкод)) КАК ТоварыНаСкладахОстатки
                            |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КодыТоваровSKU КАК КодыТоваровSKU
                            |        ПО ТоварыНаСкладахОстатки.Номенклатура = КодыТоваровSKU.Номенклатура

По факту, если запрос для отчёта, то нужно смотреть на план выполнения запроса, возможно, что до какого-то объёма данных твой вариант будет оптимален
9 Маленький Вопросик
 
09.08.22
11:09
смысл - при обработки события сканера - собирает все данные по штрихкоду. смущаем подзапрос в таблице остатков... как оптимизировать. может, сделать какой-то кеш таблицы штрихкодов и их владельцев?
10 sitex
 
naïve
09.08.22
11:14
(9) НА самом деле или Штрихкод или остатки. В кучу кони - люди
11 dmt
 
09.08.22
11:15
(9) так за сколько запрос выполняется? может и смысла нет оптимизировать
12 dmt
 
09.08.22
11:16
(10) может это инвентаризация
13 sitex
 
naïve
09.08.22
11:17
(12) И чего ? Может есть смысл разбить несколько.
14 sitex
 
naïve
09.08.22
11:18
(13) +на несколько запросов*
15 dmt
 
09.08.22
11:20
(13) может и проблемы нет, аффтору просто заняться нечем
но что плохого в получении ШК и остатка одним запросом - непонятно
16 mistеr
 
09.08.22
11:24
(9) Оптимизация преждевременная или действительно медленно работает?
17 mistеr
 
09.08.22
11:25
(3) +1

И Склад.Магазин = &Магазин заменить на Склад В &Склады
18 Маленький Вопросик
 
09.08.22
11:32
(17) ну это я в курсе
19 СеменовСемен
 
09.08.22
11:32
а что в &ТекДата. Может таки нужно текущие остатки?
20 СеменовСемен
 
09.08.22
11:33
ну и сгруппировать тут лишнее
21 Kassern
 
09.08.22
11:53
(9) получите данные по номенклатуре по шк из регистра, поместите во временную таблицу, далее уже к ней цепляйте остальные таблицы.
" при обработки события сканера " - так там вроде уже номенклатура передается параметром, если найдена
22 Маленький Вопросик
 
09.08.22
15:49
(21) в типовом бпо передается ид девайса и сам штрихкод
23 Dmitry1c
 
09.08.22
16:27
(0) из тестового задания на собесе? :)
24 Simod
 
09.08.22
17:35
(0) Вирт.таблица РегистрНакопления.ТоварыНаСкладах.Остатки возвращает результат сгруппированный по выбираемым полям. У тебя это Номенклатура. Поэтому в случае нескольких SKU будут записи с одинаковым количеством. Результат запроса может быть верным только если SKU один и группировка ничего не сворачивает. Если это так, то сама группировка не нужна.
25 Simod
 
09.08.22
17:42
(0) Также, "ВЫБРАТЬ ПЕРВЫЕ 1" может в разное время возвращать разный результат.
Из оптимизации тут только установка &ТекДата = Неопределено в случае когда расчет на текущее время.
Также, можно Склад.Магазин = &Магазин сделать по аналогии с Номенклатура В (...).
26 Маленький Вопросик
 
09.08.22
19:30
сам спросил - сам отвечу.

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

ВЫБРАТЬ ПЕРВЫЕ 1
                            |    Штрихкоды.Владелец КАК Номенклатура,
                            |    &Штрихкод КАК Штрихкод,
                            |    КодыТоваровSKU.SKU КАК SKU
                            |ПОМЕСТИТЬ ВТ_ШтрихКодВладелец
                            |ИЗ
                            |    РегистрСведений.Штрихкоды КАК Штрихкоды
                            |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КодыТоваровSKU КАК КодыТоваровSKU
                            |        ПО Штрихкоды.Владелец = КодыТоваровSKU.Номенклатура
                            |ГДЕ
                            |    Штрихкоды.Штрихкод = &Штрихкод
                            |
                            |ИНДЕКСИРОВАТЬ ПО
                            |    Штрихкоды.Владелец
                            |;
                            |
                            |////////////////////////////////////////////////////////////////////////////////
                            |ВЫБРАТЬ
                            |    ВТ_ШтрихКодВладелец.Номенклатура КАК Номенклатура,
                            |    ВТ_ШтрихКодВладелец.Штрихкод КАК Штрихкод,
                            |    ВТ_ШтрихКодВладелец.SKU КАК SKU,
                            |    ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток
                            |ИЗ
                            |    ВТ_ШтрихКодВладелец КАК ВТ_ШтрихКодВладелец
                            |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&ТекДата, Склад = &Склад) КАК ТоварыНаСкладахОстатки
                            |        ПО ВТ_ШтрихКодВладелец.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
27 RomanYS
 
09.08.22
19:44
(26) и добавление условия на номенклатуру в параметры ВТ не дает ускорения?
28 Маленький Вопросик
 
09.08.22
19:47
(27) особых условий нет - хватаем первую номенклатуру по шк
29 RomanYS
 
09.08.22
19:50
(28) я про это и говорю. Это условие в параметрах не дает ускорения?
30 Маленький Вопросик
 
09.08.22
19:56
никакие дополнительные условия не дадут ускорения здесь. у меня и тут только одно условие - это входящий шк

если я буду искать по остаткам через штрих код - я могу вообще ничего не найти - попросту не будет остатков, поэтому - привяжу остатки в конце

единственное, что можно доделать в запросе - это взять SKU через максимум. но у меня в базе не более 1 SKU по товару
31 Timon1405
 
09.08.22
20:10
так и не ответили зачем нужна именно &ТекДата, если без указания даты будет быстрее
32 Ёпрст
 
09.08.22
20:56
(27) ускорение даст, но ТС не понимает, о чем ты его спрашиваешь, ему нужно кодом показывать
33 Fynjy
 
09.08.22
21:52
(32) не даст - оптимизатор запроса сам соберет верно.
34 Fynjy
 
09.08.22
21:54
(26) убери ВТ оно тут не нужно сделай второе левое - еще быстрее будет.
35 RomanYS
 
09.08.22
22:02
(32) оно у него в (0) было, только без ВТ, вряд ли он не понимает