Имя: Пароль:
1C
 
Медленный запрос виртуальной таблицы ОстаткиИОбороты
0 Tonik992
 
30.10.18
18:22
Коллеги, нужна экспертная помощь.
Получаю остатки из таблицы

ВЫБРАТЬ
  ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
  ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток
ИЗ
   РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(ДАТАВРЕМЯ(2013, 11, 1, 0, 0, 0),   ДАТАВРЕМЯ(2013, 11, 3, 23, 59, 59), ДЕНЬ, , ) КАК ТоварыНаСкладахОстаткиИОбороты

В профайлере в таком случае вижу ОГРОМНЕЙШЕЕ количество следующих записей (все они в транзакции):

RPCCompleted: exec sp_execute 2,'4013-11-03 00:00:00',0x85E1080027419A6711E19039E63E0E6C,4.000

Table Insert(OBJECT:([tempdb].[dbo].[#tt1]), SET:([tempdb].[dbo].[#tt1].[_Period] = [Expr1003],[tempdb].[dbo].[#tt1].[_Fld7737RRef] = [Expr1004],[tempdb].[dbo].[#tt1].[_Fld7741FinalBalance] = [@P3]), DEFINE:([Expr1003]=CONVERT_IMPLICIT(datetime2(0),[@P1],0), [Expr1004]=CONVERT_IMPLICIT(binary(16),[@P2],0)))

После всех подобных записей транзакция фиксируется, и в профайлере появляется "конечный" запрос формирования остатков по виртуальной таблице: данные уже берутся из той самой #tt1, что формировалась крайне долго.
Откуда такая неэффективность? Зачем 1С помещает каждую запись во временную таблицу?

Платформа 8.3.10.2580 (режим совместимости 8.3.8), mssql 12.0.5579
1 palsergeich
 
30.10.18
18:26
(0) Потому что такова физическая сущность виртуальной таблицы ОстаткиИОбороты и рекомендуется ее без нужды не использовать.
По факту Вы с начала получаете значение последнего расчитанного остатка, потом суммируются движения до даты К. Так получаются все реусрры за период
2 palsergeich
 
30.10.18
18:27
(1)  последнего расчитанного итога, ошибочка
3 palsergeich
 
30.10.18
18:32
И вообще использовать виртуальные таблицы РН, где данные будут получатся не из итогов, без отбора - не очень правильно
4 Tonik992
 
30.10.18
18:40
(1)  Однако, спасибо. Но я не думал, что при работе с этой вирт. таблицей все вот настолько плохо.

(3) Есть один неэффективный запрос. Решил разобраться и наткнулся на это. Не знал, что всё настолько грустно. При этом диск, где лежит tempdb, нагружается сильно если данных много.
5 big
 
30.10.18
19:03
(4) Уважаемый, в (3) ключевое слово "без отбора". Поставьте отборы и всё полетит ))  SQL это любит )
6 Tonik992
 
30.10.18
19:07
(5) Пользователям надо поставить отборы, например:
Склад В ИЕРАРХИИ()
Номенклатура В ИЕРАРХИИ()

И там большой перечень объектов.

В некоторых случаях еще по реквизитам! Так что полностью не соглашусь с необходимостью иметь отборы для того, чтоб летало -)
7 xXeNoNx
 
30.10.18
19:11
(5) "Поставьте отборы и всё полетит ))  SQL это любит )" отборы в вирт таблицах 1с? Хм.., а прмчем тут скуль?
Детализация "День" - со всеми вытекающими...
8 hhhh
 
30.10.18
19:17
(6) вообще-то в учете всё берется за месяц, квартал, год. Поэтому таблица остатки обороты под это и заточено, чтобы максимально быстро выдавать отчеты по месяцам. отчеты по дням при этом выполняются максимально медленно
9 xXeNoNx
 
30.10.18
19:20
(0) используйте таблицу остатков на начало и реальную таблицу
10 Cool_Profi
 
30.10.18
19:35
анафейхоа получать остатки из ОстаткиИОбороты?
11 Cyberhawk
 
30.10.18
19:39
(3) Как же получать все остатки на дату, например?
12 unregistered
 
30.10.18
19:42
(10) Присоединяюсь к вопросу.
Мало того, что остатки берутся с ОстаткиИОбороты, так еще и с периодичностью ДЕНЬ. А это означает, что даже при рассчитанных за ближайшие периоды итогах данные будут тянуться из таблиц первичных записей.
13 unregistered
 
30.10.18
19:44
(6) > Пользователям надо поставить отборы

Отлично! Пусть ставят! А где эти отборы в тексте запроса? Почему в параметрах виртуальной таблицы нет ни одного отбора?
14 Cyberhawk
 
30.10.18
19:44
(12) Агрегаты должны помочь
15 unregistered
 
30.10.18
19:47
(4) > при работе с этой вирт. таблицей все вот настолько плохо

Всё там нормально. Просто надо понимать как они работают и думать головой прежде чем писать текст запроса. Ну и не ждать чудес, если вам вдруг реально нужны и остатки, и обороты, и непременно за каждый день в выбранном периоде.
16 unregistered
 
30.10.18
19:48
(14) Как агрегаты могут помочь в регистре остатков? Или что ты подразумеваешь под агрегатами в данном контексте?
17 Провинциальный 1сник
 
30.10.18
19:56
А может ну её нафиг, виртуальную таблицу. Обороты по дням можно прекрасно сгруппировать запросом к таблице движений. МОжет и быстрее получится.
18 Cyberhawk
 
30.10.18
20:11
(16) Я думал, мы про выборку оборотов толкуем) Мозг зацепился за "ДЕНЬ" + "данные будут тянуться из таблиц первичных записей", а агрегаты в этом как раз и помогают.
Но не с регистром остатков, это да - не обратил внимания.
19 unregistered
 
30.10.18
20:17
(17) В некоторых случаях так оно и есть. Зависит от конкретной задачи. Собственно говоря 1С так и делает, когда надо получить остатки и обороты в промежутках между периодами рассчитанных итогов (на середину месяца, например) - тащит данные из первичных таблиц.
Написание запроса к первичной таблице самостоятельно уменьшает окно свободы для оптимизатора скуля, который иногда начинает строить не самые оптимальные планы запросов.
Но это уже зависит от конкретного примера и целого ряда дополнительных условий (наличия дополнительные соединений, количества данных в источниках, порядка выборки, налагаемых отборов, индексов и пр. и пр.).
В реальной жизни редко имеет смысл опускаться до таких тонкостей и проще оставить самой 1С строить текст запроса, как ей нравится.
20 Tonik992
 
30.10.18
22:41
(10) Смысл такого запроса в том, чтобы именно "по дням" получить остатки.
(8) Я бы только ЗА, чтобы ваша теория не поддавалась опровержению. Но вот есть ситуацию, когда надо брать не от 01.05 по 01.06, а от 07.05 по 07.06
(13) Ну я не стал просто скидывать всё. Если необходимо для расследования или для интереса, могу сбросить.
(14) А вот на этот счет даже и не думал, агрегаты будут работать? (18)  Все правильно думали, именно периодичность ДЕНЬ и играет в этом случае важную роль. Мне не нужны обороты, мне нужны остатки по дням. (так уж сложился исторически имеющийся запрос, поэтому настаиваю)
21 Tonik992
 
30.10.18
22:50
(15) Вот чего чего, но я таки нигде не нашел инфу о том, что записи помещаются во временную таблицу. Можете об этом что-то рассказать? Или где об этом почитать, что при использовании вирт. таблицы ОстаткиИОбороты с установленной периодичностью будет задействована временная таблица?
22 vde69
 
30.10.18
23:05
Почуствуй разницу :)

ВЫБРАТЬ
  ТоварыНаСкладахОстатки.Номенклатура,
  ТоварыНаСкладахОстатки.Остаток
ИЗ
   РегистрНакопления.ТоварыНаСкладах.Остатки(&ДАТА_1,   &ДАТА_2, ДЕНЬ, , ) КАК ТоварыНаСкладахОстатки
23 vde69
 
30.10.18
23:07
(22)+ немного соврал?

(0) зачем тебе остатки по дням нужны? дай более развернутый запрос
24 Tonik992
 
30.10.18
23:17
(22) У вирт. таблицы Остатки только 2 параметра, не прокатит к сожалению.

(23) > зачем тебе остатки по дням нужны? дай более развернутый запрос
Нужно анализировать простои товарных запасов. Запрос отчета передавался из поколения в поколение и дошел до меня, поэтому пока настаиваю на использование ОстаткиИОбороты.
25 vde69
 
30.10.18
23:26
(24) >>>Нужно анализировать простои товарных запасов

ну как минимум такой анализ нужен не для всей номенклатуры а только для относительно маленького кусочка... подумай как отделить старую номенклатуру от актуальной.... кроме того как правила такой анализ делят еще глубже, например по брендам или по поставщикам....

во вторых в данном конкретном случае стоит оценить вариант запроса в цикле (по дням но по таблице остатков) , возможно это будет более хорошее решение

ну и в третьих можно перейти к 2 таблицам и строить результат джойном, думаю это будет быстрее
остатки на нач. периода
обороты по дням между нач и кон
26 palsergeich
 
30.10.18
23:50
(25)
2) По дням вряд ли будет быстрее. А вот разить номентклатуру кусками по 100-1000 и сделать это в цикле - вот это да.
3) Вариант кстати, и еще конечной остаток,, может и взлететь, но надо тестировать.
Имхо разить большой запрос на запросы в цикле - будет лидером по скорости, но это не точно.
27 palsergeich
 
30.10.18
23:57
Но надо помнить, что если будет отбор по измерению - то в таблице остатков и оборотов идет обращение к реальной таблице и рекомендую у этого измерения поставить галочку Индексировать. Ибо у реальной таблицы индекса по [ОРРХ | ОРНР1 +] Измерение + Период +.... нет. И как показала практика это существенно ускоряет работу в запросах к вирт таблице ОстаткиИОбороты с отбором
28 palsergeich
 
31.10.18
00:07
Перефразирую, выше коряво:
Но надо помнить в таблице остатков и оборотов идет обращение в том числе и к реальной таблице, и если будет отбор по измерению - и рекомендую у этого измерения поставить галочку Индексировать. Ибо у реальной таблицы индекса по [ОРРХ | ОРНР1 +] Измерение + Период +.... нет. И как показала практика это существенно ускоряет работу в запросах к вирт таблице ОстаткиИОбороты с отбором
29 Cyberhawk
 
31.10.18
08:03
(20) Не, агрегаты только для оборотных регистров можно сделать :( Хотя почему их не сделали для остаточных, чтоб они использовались при получении остатка в тех случаях, когда применяется основная таблица (чтоб применялась не основная таблица, а агрегаты по дням / неделям, например) - не ясно
30 Tonik992
 
31.10.18
10:20
(29) Пришла в голову мысль, что можно самому "воссоздать" агрегат для остаточного р/н - создать р/с по необходимым измерениям, один из которых - это период (день).

Всем спасибо.
31 Cyberhawk
 
31.10.18
10:33
(30) Проще уж тупо транслировать остаточный РН в новый "чисто оборотный" с включенными для него агрегатами, не?
32 Salimbek
 
31.10.18
10:52
(0) Я очень извиняюсь, но надеюсь, что обслуживание базы выполняется регулярно?
33 palsergeich
 
31.10.18
13:45
(31) Согласен, я так частенько делаю и это дает свои плоды
34 unregistered
 
31.10.18
14:13
(31) > транслировать остаточный РН в новый "чисто оборотный" с включенными для него агрегатами, не?

Спорный вопрос, зависящий от конкретных условий его использования и требований. Для ускорения запросов и отчетов наличие такого оборотного регистра будет полезным. Но только там, где мы руками пропишем получение оборотов из него.
А вот заполнение этого регистра поднимает вопрос производительности при записи. Если только актуальность этого регистра не требуется online и можно вынести его заполнение за рамки проведения (что-то типа отложенного заполнения).
Основная теорема систематики: Новые системы плодят новые проблемы.