|
Понедельничный вопрос: что можно улучшить в этом запросе | ☑ | ||
---|---|---|---|---|
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)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |