Имя: Пароль:
1C
 
оптимизация отбора динамического списка
,
0 Александр056
 
01.08.17
15:53
Всем дорого времени суток. Форма списка, на ней заявки - динамический список, примерно 1 500 000 документов. Запрос в динамическом списке произвольный с рядом временных таблиц и соединений - не спрашивайте как так, долгая история со странными требованиями заказчика и почему решили делать именно так неизвестно. По факту сейчас код установления отбора выполняется примерно 40! секунд
Код:
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТипЗаявки.Родитель");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = ПредопределенноеЗначение("Справочник.ТипыЗаявок.СервисныеЗаявки");
ЭлементОтбора.Использование = Истина;

так же пробовал через процедуру:
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(Список,"ТипЗаявки.Родитель",ПредопределенноеЗначение("Справочник.ТипыЗаявок.СервисныеЗаявки"),ВидСравненияКомпоновкиДанных.Равно,,Истина,РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный,);

время выполнения не отличается, разница только в том что через общий модуль, в меню настройка списка на вкладке "Основные" появляется этот отбор и его можно включать отключать галкой.

Смотрел замером производительности, ничего там столь длительного не нашел, затрудняюсь куда копать? дабы ускорить время выполнения отбора.
1 Fedor-1971
 
01.08.17
16:00
(0) Вариант1: наложи условия на выборку (в запросе ДС) всё то же самое, только в Где запроса. Относительный минус, пользователь не сможет снять этот отбор (или придётся предусмотреть программную возможность его снимать - динамически изменять текст запроса).

Вариант2: ограничь стандартный период (не тащи сразу 100500 документов, а отбери, например, за квартал их там явно меньше)
2 Александр056
 
01.08.17
16:02
(1) спасибо но за период не устраивает заказчика
ГДЕ, т.е. программно менять текст запроса? у меня фильтров по кнопке несколько, т.е. каждый раз искатьэту область где и то удалять ее, то правильно заполнять?
3 Cyberhawk
 
01.08.17
16:02
"Смотрел замером производительности" // Так он время выполнения запросов не показывает. Профайлер СУБД смотри
4 Александр056
 
01.08.17
16:04
(3) думал найду что-то в коде, что как подводный камень сильно тормозит.
5 Fedor-1971
 
01.08.17
16:07
(2) Да, но можно и проще
Запомнить исходный текст запроса (т.е. в нём нет ГДЕ)
Создать строку для условий
Список.ТекстЗапроса=ОригинальныйЗапрос+" ГДЕ "+ СтрокаУсловий

Всяко проще чем что-то искать и учитывать разные комбинации
6 apokrit
 
01.08.17
16:13
(1), (5) Вариант1 - это + / - бессмысленно.
Отборы компоновки (списка) обычно и добавляются в ГДЕ.
Могут еще в параметры виртуальных таблиц добавиться (а вот руками их туда уже совсем неудобно пихать будет).
7 Fedor-1971
 
01.08.17
16:23
(6) Ну запрос нам не показали, может там есть простор для оптимизации.
Если хотим ускорить выбор данных, накладывать условия на выборку лучше не доверять автоматике (программеру проще - это да, но можно получить совсем неочевидную засаду в виде неоптимальности)
8 lodger
 
01.08.17
16:27
подитог: надо оптимизировать запрос в дин.списке.
отборы пихать в него же.
9 ildary
 
01.08.17
16:36
(4) в дин. списке случайно сортировка не особая? Если да, то это добавляет тормозов. Если убрать сортировку и документы пойдут в порядке дат, то работа Д.С. должна ускориться.
10 Александр056
 
01.08.17
16:46
попробовал программно засунуть в текст запроса условие, получилось, отработало, долго... суть не поменялась, не замерял время, но по ощущениям результата нет.
11 apokrit
 
01.08.17
16:54
(10) В общем-то единственный надежный подход предлагается в (3)
Т.е. смотреть план выполнения запроса (ов) и уже исходя из этого решать как улучшать ситуацию.
12 Александр056
 
01.08.17
17:08
(11) чем сейчас и занялся
Независимо от того, куда вы едете — это в гору и против ветра!