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