База для оптимизации
Для тестовых данных использовалась самописная база с реальными данными большого справочника клиентов, строк – около миллиона, колонок – 26. В динамическом списке к справочнику присоединен регистр состояний клиентов (срез последних). Размер справочника такой, что не разворачивается в файловом варианте.
Для замера производительности использовался SQL Server Profiler, который показывает время выполнения запроса без дополнительных затрат на интерфейс. Конкретные цифры в статье приводить не буду, так как они индивидуальны для каждой базы.
Способы оптимизации:
- 1. Оптимизация запроса
Первым по важности для обеспечения быстродействия динамического списка является оптимизация запроса. По оптимизации запросов написано много статей, но основные принципы перечислены ниже:
- При соединении таблиц использовать индексы
- Не использовать вложенные запросы
- Избегать в запросе большого количества таблиц
- По возможности избегать условий «ИЛИ», «НЕ», «ПОДСТРОКА», «МЕСЯЦ» «ВЫБОР КОГДА» и т.д
- Стараться не использовать динамические(вычисляемые) поля
2. Флаг "Динамическое считывание данных"
В свойствах запроса динамического списка (если он «Произвольный» и установлена основная таблица) доступен флаг «Динамическое считывание данных».
Если флаг установлен, то запрос забирает из БД маленькие порции данных (на текущей версии 1С – по 45). Прокрутка списка в этом случае может подвисать.
Если флаг не установлен, то порции больше (на текущей версии 1С – по 1000). Прокрутка в этом случае комфортнее, но на выполнение запроса требуется больше времени.
Общие рекомендации по установке флага «Динамическое считывание данных»:
- Если запрос выполняется быстро, и в выборке с учетом отборов обычно большое количество строк, то флаг лучше не устанавливать
- Если запрос тяжелый, а в выборке с учетом отборов обычно записей не много или не часто используется прокрутка списка, то лучше флаг установить.
3. Группировки в динамическом списке.
Здесь все просто – использование группировок может очень значительно замедлять список. Рекомендую просто отказаться от них и не включать их в пользовательские настройки.
4. Сортировка.
От сортировки тоже бы хотелось отказаться, но это очень важная пользовательская функция. Общие рекомендации по использованию сортировки:
- Сортировать список желательно по проиндексированным реквизитам
- Не сортировать список по вычисляемым полям
5. Отборы, поиск
Общие рекомендации:
- Поля, по которым чаще всего устанавливаются отборы должны быть проиндексированы.
- Если при этом сортировка списка отключена (т.е. сортировка производится по основному представлению - код или наименование основной таблицы динамического списка), а это почти всегда, то индексировать нужно «с доп. упорядочиванием».
- Если на список накладывается несколько отборов, очень важен их порядок (на текущей версии платформы 1С). Правильный порядок отборов:
- Проиндексированные поля
- Неиндексированные поля
- Вычисляемые поля
- Нарушение порядка может значительно замедлять список.
- Контролировать порядок пользовательских отборов сложно, но можно, например, проиндексированные поля «вытащить» в отборы в конфигураторе, и они будут накладываться первыми.
- Часто используемые сложные отборы (например, по вычисляемым полям или со сложными условиями) можно устанавливать в тексте запроса и оптимизировать. Для этого, например, можно использовать несколько форм динамического списка или несколько «вариантов» на одной форме.
6. В пользовательском режиме
- Лучше убирать ненужные к отображению колонки – это позволит облегчить запрос. Прирост к производительности правда очень незначительный.
- Не использовать вывод дополнительных полей/характеристик через точку. Снижение производительности может быть очень высоким.
7. Регламентные операции на MS SQL Server:
Обновление статистик, обслуживание индексов.
8. Используйте SQL Server Profiler
Для отлавливания долгих запросов, анализа плана запроса и принятия дополнительных решений по оптимизации списка.
И в заключение хочу напомнить: динамический список это рабочая таблица, которая должна быстро обновляться. Не путайте его с отчетом и не загружайте лишними данными.
При таком подходе удалось оптимизировать динамический список тестовой базы с миллионным справочником, обновление списка с различными отборами не превышает 2-3 секунд.