Вход | Регистрация



Понедельничный вопрос: что можно улучшить в этом запросе

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

////////////////////////////////////////////////////////////////////////////////

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

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

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

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

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

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


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