Вход | Регистрация



Тормозит запрос при работе на SQL

Тормозит запрос при работе на SQL
Я
   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

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

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

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

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

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

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

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

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

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует