Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Нужен совет-помощь в оптимизации запроса

Нужен совет-помощь в оптимизации запроса
Я
   doctorzlo
 
13.08.21 - 08:09
Проблема с производительностью при выполнении запроса, ниже часть запроса где проблема - при относительно большом количестве записей в регистре СоответствиеНоменклатурыВЕТИС (десятки тысяч) и количестве элементов ТабличнаяЧасть.Номенклатура 30-50 штук, запрос выполняется долго 5-10 минут, что можно сделать именно с запросом для "ускорения" ?
Это часть запроса из общего модуля ИнтеграцияВЕТИСБП процедуры ЗаполнитьТоварыВЕТИС типовой БП3, сократить кол-во записей в СоответствиеНоменклатурыВЕТИС как бы не вариант.

|////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    МАКСИМУМ(ЕСТЬNULL(СоответствиеНоменклатурыВЕТИС.Продукция, СоответствиеНоменклатурыВЕТИС2.Продукция)) КАК Продукция,
    |    МАКСИМУМ(ЕСТЬNULL(СоответствиеНоменклатурыВЕТИС.ЗаписьСкладскогоЖурнала, СоответствиеНоменклатурыВЕТИС2.ЗаписьСкладскогоЖурнала)) КАК ЗаписьСкладскогоЖурнала,
    |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ЕСТЬNULL(СоответствиеНоменклатурыВЕТИС.Продукция, СоответствиеНоменклатурыВЕТИС2.Продукция)) КАК ПродукцияКоличествоРазличные,
    |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ЕСТЬNULL(СоответствиеНоменклатурыВЕТИС.ЗаписьСкладскогоЖурнала, СоответствиеНоменклатурыВЕТИС2.ЗаписьСкладскогоЖурнала)) КАК ЗаписьСкладскогоЖурналаКоличествоРазличные,
    |    ТабличнаяЧасть.Номенклатура КАК Номенклатура,
    |    ТабличнаяЧасть.Характеристика КАК Характеристика,
    |    ТабличнаяЧасть.Серия КАК Серия
    |ПОМЕСТИТЬ СопоставленыеПозиции
    |ИЗ
    |    ТоварыКОформлению КАК ТабличнаяЧасть
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоответствиеНоменклатурыВЕТИС КАК СоответствиеНоменклатурыВЕТИС
    |        ПО (СоответствиеНоменклатурыВЕТИС.Номенклатура = ТабличнаяЧасть.Номенклатура)
    |            И (СоответствиеНоменклатурыВЕТИС.Характеристика = ТабличнаяЧасть.Характеристика)
    |            И (СоответствиеНоменклатурыВЕТИС.Серия = ТабличнаяЧасть.Серия)
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоответствиеНоменклатурыВЕТИС КАК СоответствиеНоменклатурыВЕТИС2
    |        ПО (СоответствиеНоменклатурыВЕТИС2.Номенклатура = ТабличнаяЧасть.Номенклатура)
    |            И (СоответствиеНоменклатурыВЕТИС2.Характеристика = ТабличнаяЧасть.Характеристика)
    |            И (СоответствиеНоменклатурыВЕТИС2.Серия = &ПустаяСерия)
    |
    |СГРУППИРОВАТЬ ПО
    |    ТабличнаяЧасть.Номенклатура,
    |    ТабличнаяЧасть.Характеристика,
    |    ТабличнаяЧасть.Серия
    |;
    |
   ДенисЧ
 
1 - 13.08.21 - 08:17
Иднексы в регистре по наиболее разным полям поставить - не предлагать?
А как полковая артиллерия - ловишь план запроса и смотришь в него
   Beduin
 
2 - 13.08.21 - 08:23
|ВЫБРАТЬ
    |    МАКСИМУМ(СоответствиеНоменклатурыВЕТИС.Продукция) КАК Продукция,
    |    МАКСИМУМ(СоответствиеНоменклатурыВЕТИС.ЗаписьСкладскогоЖурнала) КАК ЗаписьСкладскогоЖурнала,
    |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СоответствиеНоменклатурыВЕТИС.Продукция) КАК ПродукцияКоличествоРазличные,
    |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СоответствиеНоменклатурыВЕТИС.ЗаписьСкладскогоЖурнала) КАК ЗаписьСкладскогоЖурналаКоличествоРазличные,
    |    ТабличнаяЧасть.Номенклатура КАК Номенклатура,
    |    ТабличнаяЧасть.Характеристика КАК Характеристика,
    |    ТабличнаяЧасть.Серия КАК Серия
    |ПОМЕСТИТЬ СопоставленыеПозиции
    |ИЗ
    |    ТоварыКОформлению КАК ТабличнаяЧасть
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоответствиеНоменклатурыВЕТИС КАК СоответствиеНоменклатурыВЕТИС
    |        ПО (СоответствиеНоменклатурыВЕТИС.Номенклатура = ТабличнаяЧасть.Номенклатура)
    |            И (СоответствиеНоменклатурыВЕТИС.Характеристика = ТабличнаяЧасть.Характеристика)
    |            И (СоответствиеНоменклатурыВЕТИС.Серия = ТабличнаяЧасть.Серия ИЛИ СоответствиеНоменклатурыВЕТИС.Серия = &ПустаяСерия)
    |
    |СГРУППИРОВАТЬ ПО
    |    ТабличнаяЧасть.Номенклатура,
    |    ТабличнаяЧасть.Характеристика,
    |    ТабличнаяЧасть.Серия
   2S
 
3 - 13.08.21 - 08:31
можно еще РегистрСведений.СоответствиеНоменклатурыВЕТИС собрать предварительно в ВТ с отбором
   doctorzlo
 
4 - 13.08.21 - 08:34
Понятно, спасибо, сейчас оттестирую...
   Мультук
 
5 - 13.08.21 - 08:37
(0)

50 строк в одной таблице и 100к в другой таблице, даже без индексов не повод молотить 5-7 мин

P.S.
1) База SQL ? (MS-SQL или Postgres) или вообще файловая ?
2) Если SQL, то регламенты с индексами в базе проводятся ? Или х.з. оно само ?
   Dmitry1c
 
6 - 13.08.21 - 08:43
|            И (СоответствиеНоменклатурыВЕТИС.Серия = ТабличнаяЧасть.Серия ИЛИ СоответствиеНоменклатурыВЕТИС.Серия = &ПустаяСерия)

вот это вместо "ИЛИ" сделать ОБЪЕДИНИТЬ ВСЕ и должен быть прирост
   doctorzlo
 
7 - 13.08.21 - 09:28
(5)
0. однако так есть
1. MSSQL 2012, пользователей в серднем 35-45
2. Выполняются периодически, есть планы обслуживания, в целом производительность нормальная, проблем нет.
В копии БД файловой(один пользователь) то же самое выполняется на 25% быстрее.

Если в регистре оставить пару тысяч записей то время выполнения сокращается более чем на порядок.
   Галахад
 
8 - 13.08.21 - 09:33
(6) Т.е. вернуть (0)? :)
   Dmitrii
 
9 - 13.08.21 - 10:18
(3) >> РегистрСведений.СоответствиеНоменклатурыВЕТИС собрать предварительно в ВТ с отбором

+1. ИМХО, с точки зрения производительности это будет самое быстрое решение. А Главное гарантированно работающее вне зависимости от дальнейшего роста регистра и количества строк в ТЧ документа.
Если эта ВТ будет получаться слишком большой, можно дополнительно проиндексировать её и ВТ ТоварыКОформлению по ключевым полям.
   timurhv
 
10 - 13.08.21 - 10:30
(7) У вас точно типовая БП по структуре и порядку измерений у регистра сведений?
Сколько всего записей в регистре сведений без отбора? Десятки тысяч - как понимаю, это с учетом отбора по данным ТЧ.
   doctorzlo
 
11 - 13.08.21 - 10:53
(7)
- точно в этом месте всё типовое и регистр и запрос
- с 2017 года "накопилось" 85000 записей всего, одно из измерений регистра ЗаписьСкладскогоЖурнала тип спрвочник.ЗаписиСкладскогоЖурналаВЕТИС у которого есть реквизит Идентификатор это GUID партии.

Вроде как запрос по каждому элементу ТЧ отбирает все записи в регистре, отсюда и проблема.

Зачем так разработчики реализовали - ?
   doctorzlo
 
12 - 13.08.21 - 10:54
упс (7) -> (10)
   ДенисЧ
 
13 - 13.08.21 - 10:56
(11) "Зачем так разработчики реализовали" ХХП и нестандартное расположение места произрастания рук
   timurhv
 
14 - 13.08.21 - 12:41
(11) у вас соединение по номенклатуре и характеристике, должен срабатывать индекс. Для SQL это пустяковый объем данных для выборки.
   doctorzlo
 
15 - 13.08.21 - 14:04
Да, забыл - (2) Просто отлично работет - я должник. В тесте запрос выполняется 0,0588сек вместо 146,4сек с оригинальным текстом запроса, результат едентичен.
   2S
 
16 - 13.08.21 - 14:06
"едентичен" о_О
   doctorzlo
 
17 - 13.08.21 - 14:17
Именно так, по другому не выразить.
   rozer76
 
18 - 13.08.21 - 14:43
(6) + 1, странно почему по ИЛИ прирост. Статистику обнови на скуле - план может и поменяться.
   НЕА123
 
19 - 13.08.21 - 16:53
(0)
может в условии поменять местами. номенклатуру вниз.

ПО
(СоответствиеНоменклатурыВЕТИС.Серия = ТабличнаяЧасть.Серия) И
                 (СоответствиеНоменклатурыВЕТИС.Характеристика = ТабличнаяЧасть.Характеристика) И
 (СоответствиеНоменклатурыВЕТИС.Номенклатура = ТабличнаяЧасть.Номенклатура)

(18)
вероятно, оптимизатор

Список тем форума
 
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Фредерик Брукс-младший
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.