Имя: Пароль:
1C
 
Тормозит запрос при работе на SQL
,
0 Zixxx
 
06.11.16
11:35
Не могу разобраться в чем беда

При выполнении обычного запроса зависает 1С. Запрос выполняется к таблице регистров накопления, к которой содержится 5 тыс. записей. Если в параметр список номенклатуры передается больше 200 записей, запрос как по часам выполняется быстро 2 раза а на 3-ий раз зависает на 3,5 часа. Если передавать меньше записей по нет таких проблем, пробовал по 100 записей.

Запрос запускал через конструктор запросов в передачей аналогичных записей, все выполняется моментально. Делал тестирование и исправление базы средствами 1С, делал CHECKDB REPAIR_REBUILD, делал переиндексацию, выгружал и загружал базу, чистил кеши, пробовал на разных платформах, пробовал на разных машинах. Ситуация везде одинаковая, каждый 3-ий раз запрос зависает примерно на 3,5 часа. В файловом варианта такого не возникает.

Сам запрос
"ВЫБРАТЬ
|    ЦеныПродажные.Склад КАК Склад,
|    ЦеныПродажные.Номенклатура КАК Номенклатура,
|    ЦеныПродажные.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
|    ЦеныПродажные.Цена КАК Цена
|ИЗ
|    РегистрСведений.ЦеныАТТ.СрезПоследних(
|            &Дата,
|            Склад В (&СписокСкладов)
|                И Номенклатура В (&СписокНоменклатуры)) КАК ЦеныПродажные";

Анализ из профайлера
https://yadi.sk/i/aX7f0_Rry9ci2

По запросу из профайлера я особо ничего не понял. Вроде как куча временных таблиц, может они ка-то не чистятся. Подскажите что еще можно проверить чтобы как-то исправить ситуацию?
1 yzimin
 
06.11.16
11:54
Если конструкцию "И Номенклатура В (&СписокНоменклатуры)"
выделить в отдельный запрос и сделать соединение с РегистрСведений.ЦеныАТТ.СрезПоследних, будет результат?
2 Zixxx
 
06.11.16
11:57
В общем в запрос передается массив номенклатуры 250 записей из табличной части документа, и из этой же табличной часты выгружается колонка складов 250 записей и также передается в запрос. Но складов всего два. Т.е. для запроса есть разница койкой мы массив передадим?

Пример 1:
Склад основной
Склад розница

или Пример 2:
Склад основной
Склад основной
Склад Розница
Склад основной?
3 yzimin
 
06.11.16
12:00
(2) нет.
Попробуй отборы переделать на внутреннее соединение
4 Zixxx
 
06.11.16
12:06
(3) Ну вот в том то и разница что есть, если передаю массив с двумя складами и двумя записями то нет проблем, а вот если передаю массив с двумя складами которые повторяются и записей в массиве 250 то с третьего раза все зависает. Хотя даже не могу понять как и что от этого зависит
5 Zixxx
 
06.11.16
12:12
Если запрос сделать так то тоже все работает

"ВЫБРАТЬ
|    ЦеныПродажные.Склад КАК Склад,
|    ЦеныПродажные.Номенклатура КАК Номенклатура,
|    ЦеныПродажные.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
|    ЦеныПродажные.Цена КАК Цена
|ИЗ
|    РегистрСведений.ЦеныАТТ.СрезПоследних(&Дата, Склад В (&СписокСкладов)) КАК ЦеныПродажные
|        ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныАТТ.СрезПоследних(&Дата, Номенклатура В (&СписокНоменклатуры)) КАК ЦеныАТТСрезПоследних
|        ПО ЦеныПродажные.Склад = ЦеныАТТСрезПоследних.Склад
|            И ЦеныПродажные.Номенклатура = ЦеныАТТСрезПоследних.Номенклатура";
6 yzimin
 
06.11.16
12:20
(5)
1. Отдельная выборка к номенклатуре с отбором по &СписокНоменклатуры
2. Сделать ВНУТРЕННЕЕ СОЕДИНЕНИЕ с РегистрСведений.ЦеныАТТ.СрезПоследних(&Дата, Склад В (&СписокСкладов))
7 Zixxx
 
06.11.16
12:26
(6) Так зависает

ТекстЗапроса =
"ВЫБРАТЬ
|    ЦеныПродажные.Склад КАК Склад,
|    ЦеныПродажные.Номенклатура КАК Номенклатура,
|    ЦеныПродажные.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
|    ЦеныПродажные.Цена КАК Цена
|ИЗ
|    РегистрСведений.ЦеныАТТ.СрезПоследних(&Дата, Номенклатура В (&СписокНоменклатуры)) КАК ЦеныПродажные
|        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныАТТ.СрезПоследних(&Дата, Склад В (&СписокСкладов)) КАК ЦеныАТТСрезПоследних
|        ПО ЦеныПродажные.Склад = ЦеныАТТСрезПоследних.Склад
|            И ЦеныПродажные.Номенклатура = ЦеныАТТСрезПоследних.Номенклатура";
8 yzimin
 
06.11.16
12:29
(7) соедини РегистрСведений.ЦеныАТТ.СрезПоследних(&Дата, Склад В (&СписокСкладов)) с запросом к номенклатуре, а не к РегистрСведений.ЦеныАТТ.СрезПоследних(&Дата, Номенклатура В (&СписокНоменклатуры))
9 FireAlex
 
06.11.16
12:29
(7) первый запрос делай к спр номенклатура
10 Zixxx
 
06.11.16
12:34
(8), (9) А для чего это нужно делать? Какой вывод хотим получить?
11 yzimin
 
06.11.16
12:39
(10) Ну раз у тебя запрос валится на отборах в виртуальной таблице, попробуй заменить на внутреннее соединение и посмотри эффект
12 vde69
 
06.11.16
12:45
выложи сюда измерения регистра в той последовательности в которой они в метаданных и укажи есть ли где галка "индексировать"
13 Zixxx
 
06.11.16
12:46
(12)
Склад (индексировать)
Номенклатура (ведущее)
ХарактеристикаНоменклатуры (не индексировать)
14 arsik
 
гуру
06.11.16
12:49
(0) Попробуй в запрос передавать не массив, а список значений.
15 vde69
 
06.11.16
12:53
обновление статистики на скуле делается?
16 roman52
 
06.11.16
12:54
если в регистре уже овердохрена записей, то от платформенного среза последних придется отказываться и писать свой...
17 vde69
 
06.11.16
12:56
и выложи план запроса который быстро проходит и план запроса который медленно....

они у тебя отличаются, скорее всего большая выборка уходит в фул скан номенклатуры по каждому элементу регистра...
18 vde69
 
06.11.16
12:57
(16) платформенный срез последних - практически идеал, лучше не напишешь....
19 vde69
 
06.11.16
12:59
я-бы советовал попробовать что-то вроде

"ВЫБРАТЬ
|    ЦеныПродажные.Склад КАК Склад,
|    ЦеныПродажные.Номенклатура КАК Номенклатура,
|    ЦеныПродажные.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
|    ЦеныПродажные.Цена КАК Цена
|ИЗ
|    РегистрСведений.ЦеныАТТ.СрезПоследних(
|            &Дата,
|            Склад В (&СписокСкладов)
|                И Номенклатура В (выбрать * из справочник.номенклатура как сн где сн ссылка в (&СписокНоменклатуры))) КАК ЦеныПродажные";

этим самым мы поломаем план оптимизатор плана запросов...
20 vde69
 
06.11.16
13:02
ну а вообще правильно будет сделать ВТ и проиндексировать ее а условие делать

в (выбрать * из вт.номенклатура как втв)

тогда гарантировано быстро будет
21 roman52
 
06.11.16
13:06
(18) платформенный же несколко раз таблицу регистров дергает
особенно если получать значения ресурсов/реквизитов
а в самописном обращение идет к ВТ, в которой только нужные записи
22 yzimin
 
06.11.16
13:09
(19) да, ладно? это ему ещё в (1) сказал
23 vde69
 
06.11.16
13:09
(21) это зависит от условия отбора, если условие правильное - то все летает
24 vde69
 
06.11.16
13:10
(22) в 1 было другое
25 yzimin
 
06.11.16
13:13
(24) да-да, не внимательный :-)

ВНУТРЕННЕЕ СОЕДИНЕНИЕ (выбрать * из справочник.номенклатура как сн где сн ссылка в (&СписокНоменклатуры))
26 roman52
 
06.11.16
13:44
(23) такое условие правильное?:
(Номенклатура, Склад) В (ВЫБРАТЬ Номенклатура, Склад ИЗ ВТ_НоменклатураСклад)
поля ВТ разумеется проиндексированы
27 Bober
 
06.11.16
13:50
(0) Какая версия 1с, какая версия СУБД, как часто выполняются рег процедуры на на СУБД, сколько записей в таблице РегистрСведений.ЦеныАТТ.

PS судя по запросу СКЛ у тебя в регистре периодичность по позиции регистратора, вот и расплачивайся за такое решение.
28 Bober
 
06.11.16
13:52
(2) по запросу СУБД видно, что сама 1с заменила параметры СписокСкладов и СписокНоменлкатуры на временные таблицы.
29 Sammo
 
07.11.16
05:57
Не помню планы запроса, но по факту натыкался на ситуацию - когда пихаешь в список, который В при некоторых количество (зависит от измерения, у меня в основном от 50) начинает тупить.
Это характерно для не первых измерений. Т.е. скорее всего план запроса получается кривой.
Причину не помню - но по факту сделал вывод - использовать  условие на список для не первых измерений можно только в том случае, когда список небольшой. Иначе только в явном виде через временную таблицу