Имя: Пароль:
1C
1С v8
УТ 11 Медленная работа одного запроса
0 eugenyfs
 
09.02.16
14:00
В УТ11 есть такая штука "Распоряжения на оформление".
Там находится список который формируется одним запросом и этот запрос стал выполняться очень медленно. А поскольку при проведении документа есть оповещение обновить этот список, то проведение документа замедлилось донельзя и пришлось из оповещения обновление списка распоряжений убрать.

Вот часть запроса (все лишнее я убрал).

ВЫБРАТЬ РАЗРЕШЕННЫЕ
ЗаказыКлиентов.ЗаказКлиента КАК ЗаказКлиента
ИЗ
РегистрНакопления.ЗаказыКлиентов.Остатки(,
ЗаказКлиента В (
ВЫБРАТЬ             
ЗаказыКлиентов.ЗаказКлиента КАК ЗаказКлиента
ИЗ
РегистрНакопления.ЗаказыКлиентов.Остатки(&ДатаОтгрузки, (Склад = &Склад)) КАК ЗаказыКлиентов
)) КАК ЗаказыКлиентов

Медлительность заключается в групповом операторе вхождения "В" в параметрах регистра накопления.

Если просто выполнить вложенный запрос

ВЫБРАТЬ             
ЗаказыКлиентов.ЗаказКлиента КАК ЗаказКлиента
ИЗ
РегистрНакопления.ЗаказыКлиентов.Остатки(&ДатаОтгрузки, (Склад = &Склад)) КАК ЗаказыКлиентов

Он выполняется мгновенно.

В чем может быть причина медленной работы группового оператора. Ведь раньше такого вроде бы не было. И это связано только с регистром накопления. Я заменял вложенный запрос на:

ВЫБРАТЬ
ЗаказыКлиентов.Ссылка КАК ЗаказКлиента
ИЗ
Документ.ЗаказКлиента КАК ЗаказыКлиентов

Все работает быстро.

При чем все заказы я удалил. Добавил всего один заказ.
В регистре одна единственная запись.

Спасибо.
1 Волшебная клизма
 
09.02.16
14:03
А нафига вообще Таблицу Заказы Клентов ограничивать выборкой из этого же регистра???
2 Волшебная клизма
 
09.02.16
14:05
Смысла такого запроса я вообще е вижу, ну на крайняк я бы предложил хотя бы по разному таблицы обозвать
3 Dmitrii
 
гуру
09.02.16
14:06
(1) (2) Оперативные остатки по регистру ограничивают остатками на &ДатаОтгрузки.
4 vde69
 
09.02.16
14:08
у тебя вложенный запрос не проиндексирован и количество выборки не дает оптимизатору его преобразовать к простому условию

вынеси во временную индексируемую таблицу ВЫБРАТЬ              
ЗаказыКлиентов.ЗаказКлиента КАК ЗаказКлиента
ИЗ
РегистрНакопления.ЗаказыКлиентов.Остатки(&ДатаОтгрузки, (Склад = &Склад)) КАК ЗаказыКлиентов


и второе, в этом подзапросе заказ клиента наверняка имеет составной тип, а это жесткий удар... тут можно использовать "выразить"
5 Dmitrii
 
гуру
09.02.16
14:08
(3) Хотя не совсем понятно зачем именно таким образом это делать. Ну да я торговлю со времён ТиСа не видал. Фиг знает в чём там собака порылась.
6 Волшебная клизма
 
09.02.16
14:09
Попробуй временую таблицу лучше создать, а уже новый пакет запроса ограничивай выборкой этой таблицы
7 Fragster
 
гуру
09.02.16
14:10
(4) Запрос из динамического списка
8 Fragster
 
гуру
09.02.16
14:10
а рлс включен?
9 vde69
 
09.02.16
14:14
(7) тогда все сложнее...

думаю имеет смысл использовать явное приведение типа заказа через "выразить",

а вообще план запроса надо глянуть, но что-то мне подсказывает, что там будет много маленьких запросов "TOP 1" и проблема именно в этом
10 Lex1C
 
09.02.16
14:24
(0)Согласен с (9). Посмотри через профайлер, в какой SQL запрос транслируется твой исходный 1Свский. Будешь очень удивлен, какая там будет громоздкая конструкция.
11 НЕА123
 
09.02.16
14:42
(0)
может через ВНУТРЕННЕЕ СОЕДИНЕНИЕ?
12 eugenyfs
 
09.02.16
15:15
В общем приведение типа заказа в подзапросе через "ВЫРАЗИТЬ" решило проблему. Запрос летает.
Как написал vde69 это жесткий удар! Буду знать.
Всем огромное спасибо.

Хотя конфигурация типовая. Но есть моменты ))
13 vde69
 
09.02.16
20:17
неопределенный тип очень часто превращается в джойн с различными таблицами метаданных конфигурации, при этом поиск по индексу не возможен в принципе, в результате у тебя выходит фул скан на всю таблицу, то есть условие "ГДЕ" наложенное на физическую таблицу будет куда мягче обработано
14 eugenyfs
 
10.02.16
09:29
Да теперь понятно почему были тормоза. Просто запрос выглядит просто и понятно. И я особо не вдумывался, что в нем может быть не так. Действительно следует смотреть во, что он транслируется потом. Или просто знать, что так делать нельзя!

Удивляет то, что это типовая конфигурация и она у миллиона пользователей. И что у всех такие тормоза на проведении документа.

Еще раз спасибо за помощь.
15 Ma3eIIa
 
10.02.16
09:33
(14) еще можешь так попробовать

ВЫБРАТЬ
    ЗаказыКлиентов.ЗаказКлиента КАК ЗаказКлиента
ПОМЕСТИТЬ ВТЗаказы
ИЗ
    РегистрНакопления.ЗаказыКлиентов.Остатки(&ДатаОтгрузки, Склад = &Склад) КАК ЗаказыКлиентов

ИНДЕКСИРОВАТЬ ПО
    ЗаказКлиента
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ЗаказыКлиентов.ЗаказКлиента КАК ЗаказКлиента
ИЗ
    РегистрНакопления.ЗаказыКлиентов.Остатки(
            ,
            ЗаказКлиента В
                (ВЫБРАТЬ
                    ВТ.ЗаказКлиента
                ИЗ
                    ВТЗаказы КАК ВТ)) КАК ЗаказыКлиентов
16 vde69
 
10.02.16
10:39
(15) временные таблицы нельзя использовать в динамических списках
17 Ma3eIIa
 
10.02.16
10:49
(16) вечно забываю. об этом костыле :)
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.