Имя: Пароль:
1C
 
Понедельничный вопрос: что можно улучшить в этом запросе
0 Fragster
 
гуру
12.09.16
11:39
Регистр накопления ОстаткиТовара содержит два измерения: Склад и Номенклатура, а также ресурс Количество. Необходимо запросом получить список всей номенклатуры, с указанием количества товаров на конкретном складе.

ВЫБРАТЬ
СпрНоменклатура.Ссылка КАК Товар,
ЕСТЬNULL(ОстаткиТоваров.Остаток, 0 ) КАК Остаток
ИЗ
Справочник.Номенклатура КАК СпрНоменклатура
ЛЕВОЕ СОЕДИНИЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(, Склад = &Склад) КАК ОстаткиТоваров
ПО ОстаткиТоваров.Номенклатура = СпрНоменклатура.Ссылка
1 Волшебник
 
модератор
12.09.16
11:42
Можно добавить условие, что товар вообще поступал хоть раз на склад, чтобы было поменьше мусора.

Или хотя бы отфильтровать услуги.
2 Fragster
 
гуру
12.09.16
11:45
(1) вообще речь не про улучшение "для пользователя", а для "технической" эффективности запроса, так что эти замечания не актуальны
3 Метранпаж
 
12.09.16
11:47
а платформа 8.2 или 8.3 ?
4 Волшебник
 
модератор
12.09.16
11:48
(2) В некоторых базах спр. Номенклатура содержит миллионы позиций. Так что фильтр поможет ускорить запрос.
5 Fragster
 
гуру
12.09.16
11:49
(3) вообще правильный ответ даже на 8.0 правильный, но если у тебя есть замечания в разрезе платформ - это замечательно, пиши
6 H A D G E H O G s
 
12.09.16
11:49
Фильтр по складу вынести в условия связи.


ПО ОстаткиТоваров.Номенклатура = СпрНоменклатура.Ссылка и ОстаткиТоваров.Склад=&Склад
7 Fragster
 
гуру
12.09.16
11:50
(4) допустим у нас только товары, пусть и миллионы. как условие "что товар хотя бы раз поступал на склад" технически ускорит выполнение
8 Fragster
 
гуру
12.09.16
11:50
(6) напиши полный текст
9 Метранпаж
 
12.09.16
11:54
(5) вроде в 8.3 изменилась структура индекса. В 8.2 и меньше было период, поля. в 8.3  - поля, период.

Так что если у тебя 8.2, то ты можешь не попасть в индекс.
10 H A D G E H O G s
 
12.09.16
11:55
ВЫБРАТЬ
    спрНоменклатура.Ссылка,
    ЕСТЬNULL(ОстаткиТоваровОстатки.КоличествоОстаток, 0) КАК Количество
ИЗ
    Справочник.Номенклатура КАК спрНоменклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
        ПО спрНоменклатура.Ссылка = ОстаткиТоваровОстатки.Номенклатура
            И (ОстаткиТоваровОстатки.Склад = &Склад)
11 H A D G E H O G s
 
12.09.16
11:57
(9) Ты прям как про малиновый звон. Все слышали и не слышали.

Период передвинули у РС.
12 Fragster
 
гуру
12.09.16
11:57
(10) хм... надо проверить
13 KODin1C
 
12.09.16
12:05
(0) Условие НЕ ЭтоГруппа
14 mistеr
 
12.09.16
12:05
(6) По-моему, станет только хуже. Уыеличится количество записей при соединении.
15 Feanor
 
12.09.16
12:10
(10) из параметров ВТ склад специально убрал?
16 H A D G E H O G s
 
12.09.16
12:25
(15) да
17 Feanor
 
12.09.16
12:27
(16) а в чем от этого будет бонус?
18 Мимохожий Однако
 
12.09.16
12:32
(0)возьми несколько вариантов запроса и прогони в отладчике через замер производительности. Оставь наиболее быстрый.
19 dmpl
 
12.09.16
12:34
(18) Не поможет. Кеширование все испортит.
20 hhhh
 
12.09.16
12:42
(17) если регистр не индексируется по Склад, то бонус будет
21 ovrfox
 
12.09.16
12:42
(0) еще никто не написал - в регистре "остаткитоваров" перенести Склад на первое место или указать еще и органиазцию
22 ovrfox
 
12.09.16
12:45
(21) Извините, забыл, что измерение организация отсутсвует в регистре.
Еще можно проверить время выполнения запроса
ВЫБРАТЬ
СпрНоменклатура.Ссылка КАК Товар,
0  КАК Остаток
ИЗ
Справочник.Номенклатура КАК СпрНоменклатура
И сравнить с исходным. Убедиться что проблема в к-ве записей в справочнике номенклатура и перестать оптимизировать запрос
23 Feanor
 
12.09.16
12:46
(20) как отсутствие индекса по складу поможет ускорить запрос в данном случае?
24 ovrfox
 
12.09.16
12:53
(23) Регистр накопления не бывает без индекса
25 Feanor
 
12.09.16
16:53
(24) Очень ценное замечание, спасибо!
26 aleks_default
 
12.09.16
17:28
Что тут оптимизировать, кроме постановки задачи?
27 aleks_default
 
12.09.16
17:29
блин, гребанные запятые, лезут под пальцы:)
28 xafavute
 
12.09.16
17:35
поставить первым измерением номенклатуру
29 H A D G E H O G s
 
12.09.16
17:38
(28) не надо так делать.
30 xafavute
 
12.09.16
17:39
(29) почему?
31 H A D G E H O G s
 
12.09.16
17:41
(30) Зачем?
32 xafavute
 
12.09.16
17:46
(31) Измерение номенклатура более селективное, поэтому индекс будет работать лучше
33 H A D G E H O G s
 
12.09.16
17:51
(32) Скорее всего, Анатолий, ты хотел сказать
"поэтому индекс будет срабатывать чаще".

Как часто вы получаете остатки конкретных номенклатур без указания склада? Я вот с таким почти и не встречался.
34 xafavute
 
12.09.16
17:54
(33) не чаще, а быстрее
35 RomanYS
 
12.09.16
17:55
(12) очень ждем результатов
36 xafavute
 
12.09.16
17:55
Я про поиск Склад+Номенклатура по индексу 2х полей склад и номенклатура
37 xafavute
 
12.09.16
17:55
И индекс Склад+Номенклатура отличается от индекса Номенклатура+Склад
38 xafavute
 
12.09.16
17:57
(35) Остатки на текущую дату - это плоская таблица, поэтому условия в ней не нужны
39 H A D G E H O G s
 
12.09.16
17:58
(36) (37) Ну ты загнул. Нашел, где производительность выжимать. В индекс еще попасть надо.
40 xafavute
 
12.09.16
17:59
Тут в индекс всяко попадаем
41 xafavute
 
12.09.16
17:59
А если склад всего 1-2, то индекс по складу вообще не нужен
42 zak555
 
12.09.16
18:04
может сначала в ВТ остатки по складу
а потом склеить со справочником ?
43 H A D G E H O G s
 
12.09.16
18:05
Да, ты прав.
Никогда не задумывался, что поиск по индексу без остаточных предикатов тоже может быть разным.
44 Мыш
 
12.09.16
18:16
(42) И не забыть проиндексировать. )
Вот тока утром книжку про "это" читал )
45 DTX 4th
 
12.09.16
18:25
(32) Не понял. Где номенклатуру надо на первое место поставить?
46 zak555
 
12.09.16
18:32
(44) и номенклатуру отобрать в вт без групп и услуг
а уж потом склеивать
47 Мыш
 
12.09.16
18:35
(45) Не совсем так.
Почти цитата: "Подходящим является индекс, содержащий все поля из условия, эти поля в самом начале индекса, эти поля идут подряд (между ними нет полей не участвующих в условии)"
48 Мимохожий Однако
 
12.09.16
18:40
(19) Кэш тоже можно учесть
49 dmpl
 
12.09.16
20:20
(33) Чаще, чем выборка всей номенклатуры по складу, которая на этот склад и не приходовалась никогда... кому интересно искать 2-3 строчки остатков среди миллиона? В реальной жизни достаточно выбрать остатки из регистра и вообще с справочником не соединять.

P.S. Прихожу я в магазин - на витрине ценник есть, товара нет. На складе магазина тоже нет. Я спрашиваю у продавца, а где у них есть? Продавец должен мне сказать - т.е. посмотреть конкретную позицию номенклатуры по всем складам.

(37) В случае 1С оптимизатор сам сделает как надо, если не мешать. Помощь ему требуется только в особо сложных случаях и с 3-4-уровневым разыменовыванием.

(48) Один фиг тестировать на боевом сервере, т.к. надо же еще и нагрузку от параллельно работающих пользователей учесть. Тут проще просто собирать статистику времени исполнения запроса у реальных пользователей в реальной рабочей базе.
50 Azxcvbn
 
13.09.16
07:58
(0) Зачем брать записи всего справочника, если правильней просто взять записи с регистра накопления?
Чего нет - того нет
51 ViSo76
 
13.09.16
08:49
(49) 1С оптимизатор сам сделает как надо...
Это что за чудо юдо рыба кит?

PS: Некоторые думают что под капотом РСУБД есть искусственный интеллект - оптимизатор, и он перестраивает за них все кривые запросы.
52 Мыш
 
13.09.16
08:58
(49) Смотрим профайлер, ищем следы оптимизатора )
53 ViSo76
 
13.09.16
09:16
(52) Типа комментария - здесь был оптимизатор.
54 Мыш
 
13.09.16
09:22
(53) Ага. Посмотрел на весь бардак, плюнул и молча ушел )))
55 ViSo76
 
13.09.16
09:27
Возможно вместо соединения быстрее будет группировка, но не уверен, нужно проверять...

ВЫБРАТЬ
    Товар,
    СУММА( Остаток ) КАК Остаток
ИЗ
    ( ВЫБРАТЬ
         Ссылка КАК Товар,
         0 КАК Остаток
    ИЗ
        Справочник.Номенклатура

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
         Номенклатура,
         Остаток
    ИЗ
        РегистрНакопления.ОстаткиТоваров.Остатки( , Склад = &Склад )

    ) КАК тзОстаток

СГРУППИРОВАТЬ ПО
    тзОстаток.Товар
56 ТупойИЖадный
 
13.09.16
09:28
1. В условии виртуальной таблицы отбор по складу оставь.
2. Результат запроса к виртуальной таблице выгрузи во временную таблицу.
3. Сделай выборку по справочнику "Номенлатура" (возможно, без групп) и вяжи ее левым соединением с временной таблицей из п.2.
57 1dvd
 
13.09.16
09:37
(56) +1

Вообще не понял. Кому могло в голову только придти, чтобы убрать склад из параметров ВТ?
58 ptiz
 
13.09.16
10:03
(57) Это следующий уровень понимания, не для всех доступный.
59 ViSo76
 
13.09.16
10:17
Я думаю что убирать склад из ВТ очень спорный момент, я считаю что в большинстве случаев фильтр по складу в ВТ нужен, кроме случая когда всегда будет использоваться один склад
60 xafavute
 
13.09.16
10:19
хотя я тут вычитал, что в любом случае вт разворачивается в подхапрос с группировками, даже если на текущую дату
61 ViSo76
 
13.09.16
10:29
(60) ВТ Остатки это "системная" таблица остатков на начало периода + движения от этой таблицы до даты указанной в первом параметре, естественно будет группировка в запросе. Фильтр по складу, даже если будет full scan уменьшит объём группировки и объём занимаемой памяти в случае активных движений на других складах.
62 ТупойИЖадный
 
13.09.16
11:38
(61) Осмелюсь поумничать.
Фраза "ВТ Остатки это "системная" таблица остатков на начало периода + движения от этой таблицы до даты указанной в первом параметре" не совсем верна.
В 1С это "ВТ Остатки это "системная" таблица остатков на КОНЕЦ периода - движения от этой таблицы до даты указанной в первом параметре"
63 Timon1405
 
13.09.16
11:52
а итоги замеров будут озвучены?
64 Fragster
 
гуру
13.09.16
11:54
(63) http://its.1c.ru/db/v8std/content/2149184382/hdoc , но вопрос в том, почему у меня не получилось сделать без группировки вложенного запроса (смотрю профайлером) разные варианты
65 H A D G E H O G s
 
13.09.16
11:56
(64) Чтобы свернуть разделитель итогов.
66 Fragster
 
гуру
13.09.16
12:02
(65) это я понял. вопрос не "зачем", а "почему у меня группировка из вложенного не уходит"?
67 H A D G E H O G s
 
13.09.16
12:03
(66) Не понял твоего вопроса вот сейчас
68 Fragster
 
гуру
13.09.16
12:05
(67) во всех вариантах, которые я пробовал - вложенный запрос все равно с group. из ИТС я понял, что при таком изменении текста group пропадет. уже и разделение итогов выключил, и сами итоги пересчитывал, а оно все равно не уходит.
69 H A D G E H O G s
 
13.09.16
12:06
(68) У меня нет доступа к ИТС.
70 Fragster
 
гуру
13.09.16
12:07
(69) смешно
71 H A D G E H O G s
 
13.09.16
12:08
(70) В смысле смешно?
72 ptiz
 
13.09.16
12:11
(68) А какая платформа? Может, поменяли поведение?
73 xXeNoNx
 
13.09.16
12:12
Предлагаю получить остатки сначала, затем при объединении со справочником исключать ту номенклатуру(Выборка из справочника), которая была в остатках.
ну и исключить группы, услуги и помеченные на удаление(как вариант)
75 Fragster
 
гуру
13.09.16
12:13
(69)
76 H A D G E H O G s
 
13.09.16
12:13
(75) Понял. Чуть позже проверю
77 bolobol
 
13.09.16
12:23
Никак не понял, зачем ещё "И ОстаткиТоваров = &Склад", если условие по складу виртуальной таблицы уже отсекло все склады, кроме одного?
78 Fragster
 
гуру
13.09.16
12:26
(77) между запросами написано
79 bolobol
 
13.09.16
12:28
(78) Напоминает "между ног... что-то там" )) Что именно написано такого, что отвечает на моё непонимание написанного?
80 Timon1405
 
13.09.16
12:28
-СОЕДИНИЕНИЕ! соединИение, Карл
-расслабься, это ИТС
81 bolobol
 
13.09.16
12:30
(78) Ой, "между *строк написано..." ))
82 ptiz
 
13.09.16
12:32
В 8.2 - работает как написано на ИТС.
А в 8.3 - вылезла группировка :)
83 Fragster
 
гуру
13.09.16
12:34
(82) вот негодяи
84 zak555
 
13.09.16
12:38
так быстрее не будет ?


ВЫБРАТЬ
    ОстаткиТоваровОстатки.Номенклатура КАК Номенклатура,
    ОстаткиТоваровОстатки.ОстатокОстаток КАК Остаток
ПОМЕСТИТЬ Остатки
ИЗ
    РегистрНакопления.ОстаткиТоваров.Остатки(, Склад = &Склад) КАК ОстаткиТоваровОстатки

ИНДЕКСИРОВАТЬ ПО
    Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка
ПОМЕСТИТЬ Товары
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    НЕ Номенклатура.ЭтоГруппа
    И НЕ Номенклатура.Услуга

ИНДЕКСИРОВАТЬ ПО
    Ссылка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Товары.Ссылка,
    ЕСТЬNULL(Остатки.Остаток, 0) КАК Остаток
ИЗ
    Товары КАК Товары
        ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Остатки
        ПО Товары.Ссылка = Остатки.Номенклатура
85 aleks_default
 
13.09.16
12:43
(84) У справочника итак индекс по ссылке есть, какой смысл его еще раз целиком индексировать?
86 ViSo76
 
13.09.16
12:45
(62) Да вы правы, спасибо за уточнение, правда бывает исключение в виде:

Таблица итогов регистра накопления остатков хранит текущие итоги на момент времени последнего движения (актуальные итоги). Дополнительно к этому могут храниться промежуточные итоги, если установлен период рассчитанных итогов.
Период рассчитанных итогов влияет только на производительность при получении итогов на некоторую промежуточную дату; если он установлен, итоги будут получены быстрее.

Профессиональная разработка в системе «1С:Предприятие 8» издание 2, стр. 548

(75) Если не указывать остатки на дату, то выбираются текущие ( готовые ) остатки, свёрнутые по измерениям с просуммированными ресурсами.
87 jsmith
 
13.09.16
12:47
Оптимизация это развлечения для перцев с 64 Кб ОЗУ :)
88 ptiz
 
13.09.16
12:49
(83) Как-то странно. На одной базе 8.2 - получилось, на другой - нет. Пытаюсь найти разницу.
89 Fragster
 
гуру
13.09.16
12:52
(88) попробуй поиграть с разделением итогов
90 aleks_default
 
13.09.16
12:54
(89)А можно озвучить выигрыш в производительности?
91 zak555
 
13.09.16
12:56
(85) погорячился
92 H A D G E H O G s
 
13.09.16
12:58
(90) Там лишний подзапрос с группировкой не будет сгенерин, что, кстати, не критично и sql нормально его оптимизирует в большинстве случаев.
93 H A D G E H O G s
 
13.09.16
12:59
(92) Но в большинстве своем это бессмысленно, так как остаточные регистры используют разделение итогов в большинстве своем и это влечет за собой вложенный запрос.
94 ptiz
 
13.09.16
12:59
(89) Да, без разделения итогов работает.
95 H A D G E H O G s
 
13.09.16
13:01
(84) Ты пытаешься ткнуть чем-то в что-то.
96 Fragster
 
гуру
13.09.16
13:12
(92) ну, там порой непонятная магия творится
(93) поплакал об этом на партнерском
97 H A D G E H O G s
 
13.09.16
13:25
(96) "поплакал об этом на партнерском"
А смысл?
Как бы ты свернул разделение итогов?
98 H A D G E H O G s
 
13.09.16
13:25
Только вложенный запрос или ВТ.
99 Fragster
 
гуру
13.09.16
13:26
(97) поплакал о том, что такие статьи есть, а не о том, как работает платформа
100 vicof
 
13.09.16
13:26
(100)