1. Общие табличные выражения (CTE) —
ВЫРАЗИТЬ … КАК …
Что это? Это не объект, а "запрос внутри запроса", который определяется один раз и может быть использован в основном запросе.Плюсы:
-
Удобство и читаемость: Позволяют структурировать код, избавляясь от вложенных подзапросов.
-
Рекурсия: Уникальная возможность CTE для работы с иерархиями (например, вывод дерева групп номенклатуры).
Минусы:
-
Нет материализации (часто): СУБД может "развернуть" CTE обратно в подзапрос. План выполнения запроса с CTE может не отличаться от плана с тем же подзапросом. CTE != оптимизация.
-
Многократное использование: Если вы ссылаетесь на CTE более одного раза в основном запросе, его тело может выполняться столько же раз. Это может быть неэффективно.
2. Временные таблицы
-
Что это? Физическая таблица, создаваемая в временной БД (
tempdb). Существует в рамках сеанса или транзакции. -
Как использовать в 1С:
bsl
// Создание и заполнение Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ... ПОМЕСТИТЬ ВТ_Данные ..."; Запрос.Выполнить(); // Использование Запрос.Текст = " ВЫБРАТЬ ИЗ ВТ_Данные ... ";
Плюсы:
-
Материализация: Данные физически записываются в
tempdb. Это может сильно ускорить сложные запросы, так как промежуточный результат вычисляется один раз. -
Контроль: Вы можете создать индексы по временной таблице для ускорения последующих выборок из нее.
-
Многократное использование: Идеально, когда один и тот же набор данных нужно использовать в нескольких разных запросах.
Минусы:
-
Overhead (дополнительные затраты): Процесс создания таблицы, записи в нее данных и чтения — не бесплатный. Для простых задач это может быть избыточно.
-
Читаемость: Код становится более громоздким.
3. Сравнительная таблица: когда что использовать?
| Критерий | CTE | Временная Таблица |
|---|---|---|
| Сложность данных | Простые и средние наборы | Большие и сложные наборы |
| Многократное использование | Плохой выбор | Идеальный выбор |
| Читаемость кода | Отличная | Средняя |
| Производительность | Как у подзапроса (часто) | Выше (за счет материализации) |
| Уникальные фичи | Рекурсия | Возможность создания индексов |
4. Практические рекомендации
-
Начинайте с CTE, если нужно улучшить читаемость и данные не слишком велики.
-
Переходите на ВТ, если:
-
Один и тот же набор используется много раз.
-
Запрос с CTE выполняется медленно, и в плане видно многократное выполнение одного и того же подзапроса.
-
Вам нужно создать индекс для ускорения дальнейшей обработки.
-
-
Рекурсия — царство CTE. Для деревьев и иерархий альтернатив почти нет.
Заключение:
-
CTE — это в первую очередь про удобство кода.
-
Временные таблицы — это про производительность и контроль на сложных операциях.
-
Правильный выбор зависит от конкретной задачи и объема данных.

