Имя: Пароль:
1C
1С v8
Стал тормозить запрос
,
0 ber
 
01.12.16
17:42
Простой запрос беру 2 Регистра накопления остатки на складах и резервы.

К Остатки соединяю с резервами левым соединением по номенклатуре.

Запрос работал года 2 время выполнения около 1 с.
Сейчас стал выполняться 40 минут, куда копать?

Битых ссылок нет, делал реиндексацию средствами sql.
1 Волшебник
 
модератор
01.12.16
17:42
Главное, никому не показывай запрос. Держись до последнего!
3 ber
 
01.12.16
17:45
Запрос совсем простой

ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Номенклатура,
    ТоварыНаСкладахОстатки.КоличествоОстаток,
    РезервыОстатки.КоличествоОстаток КАК КоличествоОстаток1
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПАУЭР_Резервы.Остатки КАК РезервыОстатки
        ПО ТоварыНаСкладахОстатки.Номенклатура = РезервыОстатки.Номенклатура
4 Вафель
 
01.12.16
17:46
статистика, реиндекс
5 timurhv
 
01.12.16
17:47
(3) Стали составными реквизиты?
6 Волшебник
 
модератор
01.12.16
17:47
жесть какая. Там же декартово произведение, ~10 тыс на ~10 тыс, т.е. 100 млн строк...
7 ber
 
01.12.16
17:48
(5) нет номенклатура не составной
8 H A D G E H O G s
 
01.12.16
17:50
Статистика, реиндекс. С запросом все нормально
9 Cool_Profi
 
01.12.16
17:50
(6) Почему?
ПО ТоварыНаСкладахОстатки.Номенклатура = РезервыОстатки.Номенклатура
10 timurhv
 
01.12.16
17:52
(3) Разбей запрос по замерам, сперва остатки по РН.ТоварыНаСкладах, потом по РН.ПАУЭР_Резервы
11 Вафель
 
01.12.16
17:54
покажи план запроса
12 ber
 
01.12.16
17:57
(10)
Отдельно если выполняю все ок. меньше секунды.
Сейчас пробую ре индекс средствами 1с на копии, отпишусь о результатах
13 h-sp
 
01.12.16
17:59
(12) индекс есть по номенклатуре?
14 H A D G E H O G s
 
01.12.16
18:00
(13) Скорее всего - нет и не нужен.
15 H A D G E H O G s
 
01.12.16
18:01
(13) Или измерение - первое и индекс есть полюбому, но он - не поможет.
16 h-sp
 
01.12.16
18:02
(14) тогда действительно

ПО ТоварыНаСкладахОстатки.Номенклатура = РезервыОстатки.Номенклатура

сравнение должно идти 10 тыс раз по каждой номенклатуре?
17 H A D G E H O G s
 
01.12.16
18:02
(15) вернее, поможет частично, позволяя не выполнять сортировку при mergejoin
18 Fragster
 
гуру
01.12.16
18:02
он скукоживает по измерениям, т.е. по факту в (3) - соединение двух подзапросов
19 Fragster
 
гуру
01.12.16
18:03
а по факту проще всего заменить это на объединение с небольшим отбором и группировкой
20 Мимохожий Однако
 
01.12.16
18:04
Попробуй выгрузить остатки во временную таблицу, а при отборе резервов установить условие отбора по номенклатуре из временной таблицы и уже  эту таблицу соединить в резервами
21 H A D G E H O G s
 
01.12.16
18:05
(18) Все время забываю про разделение итогов.
22 Fragster
 
гуру
01.12.16
18:06
(21) в данной ситуации он скукожит и без разделения итогов. Ну разве что если в регистре одно измерение, но я что-то в этом сильно сомневаюсь.
23 mehfk
 
01.12.16
18:08
(0) Характеристики номенклатуры используются? И что там со складами?
24 mehfk
 
01.12.16
18:08
и сколько строк в результате запроса?
25 H A D G E H O G s
 
01.12.16
18:21
(22) Да, точно.

Построил запрос.
если номенклатура - не первая (нет индекса):

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

если номенклатура - первая (есть индекс):

по каждой таблице сначало индексный отбор по дате, потом идет группировка через аггрегацию (хз как это физически делает sql), получается несколько сотен строк (ну у меня) свернутой номенклатуры и потом через mergejoin соединение.

монопенисуально, есть ли индекс по номенклатуре.
26 H A D G E H O G s
 
01.12.16
18:24
Ну и индексировать Номенклатуру смысла нет - план запроса остается как в (25), первый вариант, очевидно же.
27 Fragster
 
гуру
01.12.16
18:28
(25) ну, у автора, вероятно, что-то произошло и стал использоваться nested loops. можно упростить задачу оптимизатору, например через (19) или две временные таблицы
28 H A D G E H O G s
 
01.12.16
18:28
(27) Или посмотреть план.
29 Fragster
 
гуру
01.12.16
18:29
(28) посмотри в зеркало, потом на автора, потом снова в зеркало...
30 H A D G E H O G s
 
01.12.16
18:29
(27) тут 2 варианта - либо max_dop<>1 либо мертвая статистика.
31 mehfk
 
01.12.16
18:33
(23) - не актуально, тупанул.
32 H A D G E H O G s
 
01.12.16
18:36
(27) Там запрос то... Я пока не встречал случаев, когда бы слажал вложенный запрос в свертке остатков.
33 H A D G E H O G s
 
01.12.16
18:37
Интересно, когда 1С прикрутит вот это:

http://sqlcom.ru/optimization_query/in-memory-tables-simple/
34 ber
 
01.12.16
22:33
Добавил индекс к номенклатуре в РН резервов.
Запрос заработал.

Думаю это не лекарство а sql перестроил индексы целиком по этому регистру.

Так же жду результатов Пересчета индексов целиком на копии базы. Позже отпишусь о результатах.
35 ber
 
01.12.16
22:45
(34) >Добавил индекс к номенклатуре в РН резервов.
Не то написал не к номенклатуре а к измерению "Склад".

в запросе его не использую, сделал это для эксперимента.
36 Лефмихалыч
 
01.12.16
22:52
(3) он и должен тормозить. Раньше не тормозил потому. что данных не было
37 ber
 
02.12.16
11:40
(36) иногда лучше промолчать...
38 Мимохожий Однако
 
02.12.16
11:42
(37) Зря ты это.
(36)+1
39 mehfk
 
02.12.16
11:50
Почему зря?
Закон Брукера: Даже маленькая практика стоит большой теории.