|
|
| ||
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 | |||
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 | |||
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 | |||
Мыш 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 | |||
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 | |||
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 | |||
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) |
|
Список тем форума
|