|
Тормозит запрос при работе на 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) начинает тупить.
Это характерно для не первых измерений. Т.е. скорее всего план запроса получается кривой. Причину не помню - но по факту сделал вывод - использовать условие на список для не первых измерений можно только в том случае, когда список небольшой. Иначе только в явном виде через временную таблицу |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |