Имя: Пароль:
1C
1С v8
Нужен совет-помощь в оптимизации запроса
0 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
Иднексы в регистре по наиболее разным полям поставить - не предлагать?
А как полковая артиллерия - ловишь план запроса и смотришь в него
2 Beduin
 
13.08.21
08:23
|ВЫБРАТЬ
    |    МАКСИМУМ(СоответствиеНоменклатурыВЕТИС.Продукция) КАК Продукция,
    |    МАКСИМУМ(СоответствиеНоменклатурыВЕТИС.ЗаписьСкладскогоЖурнала) КАК ЗаписьСкладскогоЖурнала,
    |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СоответствиеНоменклатурыВЕТИС.Продукция) КАК ПродукцияКоличествоРазличные,
    |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СоответствиеНоменклатурыВЕТИС.ЗаписьСкладскогоЖурнала) КАК ЗаписьСкладскогоЖурналаКоличествоРазличные,
    |    ТабличнаяЧасть.Номенклатура КАК Номенклатура,
    |    ТабличнаяЧасть.Характеристика КАК Характеристика,
    |    ТабличнаяЧасть.Серия КАК Серия
    |ПОМЕСТИТЬ СопоставленыеПозиции
    |ИЗ
    |    ТоварыКОформлению КАК ТабличнаяЧасть
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоответствиеНоменклатурыВЕТИС КАК СоответствиеНоменклатурыВЕТИС
    |        ПО (СоответствиеНоменклатурыВЕТИС.Номенклатура = ТабличнаяЧасть.Номенклатура)
    |            И (СоответствиеНоменклатурыВЕТИС.Характеристика = ТабличнаяЧасть.Характеристика)
    |            И (СоответствиеНоменклатурыВЕТИС.Серия = ТабличнаяЧасть.Серия ИЛИ СоответствиеНоменклатурыВЕТИС.Серия = &ПустаяСерия)
    |
    |СГРУППИРОВАТЬ ПО
    |    ТабличнаяЧасть.Номенклатура,
    |    ТабличнаяЧасть.Характеристика,
    |    ТабличнаяЧасть.Серия
3 2S
 
13.08.21
08:31
можно еще РегистрСведений.СоответствиеНоменклатурыВЕТИС собрать предварительно в ВТ с отбором
4 doctorzlo
 
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, то регламенты с индексами в базе проводятся ? Или х.з. оно само ?
6 Dmitry1c
 
13.08.21
08:43
|            И (СоответствиеНоменклатурыВЕТИС.Серия = ТабличнаяЧасть.Серия ИЛИ СоответствиеНоменклатурыВЕТИС.Серия = &ПустаяСерия)

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

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

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

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

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

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

(18)
вероятно, оптимизатор
Ошибка? Это не ошибка, это системная функция.