База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как оптимизировать SQL-запрос динамического списка в 1С? › Ответ в теме: Как оптимизировать SQL-запрос динамического списка в 1С?
Разбор и рекомендации по оптимизации вашего запроса динамического списка:
1. **Объем выбираемых данных**
В запросе выбирается очень много полей (около 30), включая большие текстовые поля с использованием ВЫРАЗИТЬ(… КАК СТРОКА(500)) и ВЫРАЗИТЬ(… КАК СТРОКА(1000)). Это сильно увеличивает объем передаваемых данных и нагрузку на сеть и клиент.
**Рекомендация:**
— Уберите из выборки поля, которые не нужны для отображения в списке или для отбора.
— Если поле «Содержание» или «Контрагенты» не нужны в списке, не выбирайте их.
— Используйте механизм «Изменить форму» для отключения ненужных колонок, но помните, что платформа может все равно загружать данные (см. пункт 2).
— Если поле нужно только для детального просмотра, загружайте его по требованию (например, при открытии карточки).
2. **Использование ВЫРАЗИТЬ для больших строк**
ВЫРАЗИТЬ с большими размерами строк (500, 1000) может сильно замедлять запрос, особенно если данные большие.
**Рекомендация:**
— Сократите размер строк, если возможно.
— Рассмотрите возможность загрузки этих полей отдельно, а не в основном запросе динамического списка.
3. **Использование конструкции ВЫБОР**
В запросе много вложенных ВЫБОРОВ для вычисления полей «Задачи», «СтатусПроверкиЭП», «СостояниеКонтроля».
**Рекомендация:**
— Если возможно, вынесите эти вычисления в отдельные регистры или предрассчитанные поля, чтобы не вычислять их на лету.
— Если вычисления нужны, убедитесь, что они не используют сложные вложенные условия, которые могут тормозить выполнение.
— Проверьте, что перечисления индексированы и используются корректно.
4. **Отсутствие условий отбора в запросе**
В представленном фрагменте нет условий WHERE, кроме параметра &ТекущаяДата в последнем ВЫБОРе.
**Рекомендация:**
— Добавьте максимально возможные отборы по индексированным полям, чтобы уменьшить объем выборки.
— Используйте индексы по полям, которые чаще всего используются в отборе (например, ДатаРегистрации, ВидДокумента, Подразделение и т.п.).
— Если в динамическом списке есть пользовательские отборы, убедитесь, что они накладываются в правильном порядке: сначала по индексированным полям, потом по вычисляемым.
5. **Индексация и структура таблицы**
— Проверьте, что таблица «ДокументыПредприятия» имеет индексы по ключевым полям, используемым в отборе и сортировке (например, по ДатеРегистрации, РегистрационномуНомеру, ВидуДокумента).
— Если есть сортировка по ДатеСортировки, убедитесь, что индекс покрывает это поле.
6. **Динамическое считывание данных**
— В свойствах динамического списка проверьте флаг «Динамическое считывание данных».
— Если запрос тяжелый и выборка большая, лучше включить динамическое считывание (меньшие порции по 45 строк), чтобы не тормозить интерфейс.
— Если выборка небольшая и запрос быстрый, лучше отключить, чтобы получить данные за один заход.
7. **Оптимизация по соединениям и подзапросам**
— В вашем запросе нет явных соединений, но если в полном запросе есть присоединения, избегайте вложенных подзапросов без условий отбора.
— Используйте псевдонимы таблиц и полей для улучшения читаемости и контроля.
— Если есть присоединения к регистрам или справочникам, убедитесь, что они индексированы и отборы по ним оптимальны.
8. **Использование псевдонимов и сокращений**
— В запросе много длинных имен, что не критично, но для удобства и читаемости можно использовать псевдонимы таблиц (например, ДокументыПредприятия КАК Док).
— Это не ускорит запрос, но облегчит поддержку.
9. **Проверка плана запроса и профилирование**
— Используйте SQL Server Profiler или технологический журнал 1С для анализа плана выполнения запроса.
— Определите узкие места: полные сканирования таблиц, большие вложенные циклы, отсутствие использования индексов.
— На основе анализа плана принимайте решения по добавлению индексов или изменению структуры запроса.
10. **Обработка перечислений**
— В запросе много сравнений с перечислениями через ЗНАЧЕНИЕ(…).
— Убедитесь, что перечисления не приводят к избыточным вычислениям.
— Если возможно, замените на числовые константы для ускорения.
11. **Обработка дат**
— В условии с ДАТАВРЕМЯ(1,1,1) используется проверка на минимальную дату.
— Убедитесь, что такие проверки не мешают использованию индексов.
12. **Общие рекомендации**
— Минимизируйте количество выбираемых полей.
— Избегайте вычисляемых полей в выборке, если они не индексированы.
— Используйте отборы по индексированным полям.
— Не используйте в запросе сложные конструкции с ИЛИ, НЕ, ПОДСТРОКА без необходимости.
— При необходимости разбивайте запрос на несколько вариантов динамического списка с разными наборами полей и условий.
—
**Итог:**
Ваш запрос содержит много полей и вычисляемых выражений, что может замедлять динамический список. Для ускорения работы: сократите количество выбираемых полей, особенно больших текстовых; добавьте отборы по индексированным полям; проверьте индексацию таблицы; оптимизируйте вычисления через ВЫБОР, возможно, вынеся их в регистры или отдельные поля; используйте динамическое считывание данных при больших объемах; анализируйте план запроса через профилировщик.
Рекомендации по оптимизации динамических списков и запросов можно найти здесь:
https://infostart.ru/1c/articles/445857/
https://infostart.ru/1c/articles/169685/
https://infostart.ru/1c/articles/382500/
https://infostart.ru/1c/articles/548778/