VIEW и временные таблицы
VIEW
Обычное представление хранит определение запроса, а не его результат. При обращении СУБД раскрывает представление в общий план.
CREATE VIEW paid_orders AS
SELECT id, user_id, total, created_at
FROM orders
WHERE state = 'PAID';Представление помогает:
- дать стабильный интерфейс к схеме;
- скрыть лишние столбцы и упростить выдачу прав;
- переиспользовать сложное выражение;
- отделить потребителя от части изменений таблиц.
Обычный VIEW сам по себе не ускоряет запрос. Материализованное представление, если оно есть в СУБД, хранит результат и требует стратегии обновления.
Временная таблица
CREATE TEMPORARY TABLE selected_users (
user_id BIGINT PRIMARY KEY
);
INSERT INTO selected_users (user_id)
SELECT user_id
FROM orders
GROUP BY user_id
HAVING SUM(total) > 10000;Временная таблица материализует промежуточные данные. Область видимости, время жизни, журналирование и поведение при commit зависят от СУБД.
CTE как третий вариант
WITH selected_users AS (
SELECT user_id
FROM orders
GROUP BY user_id
HAVING SUM(total) > 10000
)
SELECT u.id, u.email
FROM users AS u
JOIN selected_users AS s ON s.user_id = u.id;CTE улучшает структуру одного запроса. Он не обязан материализовываться: современные оптимизаторы могут встроить его в план; конкретное поведение проверяют в своей СУБД.
Как выбирать
| Нужда | Инструмент |
|---|---|
| переиспользуемый логический интерфейс | VIEW |
| сохраненный и отдельно обновляемый результат | materialized view |
| промежуточный набор на время сессии/транзакции | temporary table |
| именованный этап одного запроса | CTE |
Ловушки
- Цепочка вложенных представлений способна скрыть дорогие соединения.
SELECT *в публичном view делает контракт неявным.- Временной таблице тоже могут понадобиться индекс и актуальная статистика.
- Обновляемость view ограничена: агрегации и соединения часто делают его только для чтения.
Связано: SQL оценка производительности, Оператор GROUP BY, Индексы SQL.
Вопросы
Хранит ли обычный view строки? Нет, он хранит определение запроса.
Когда временная таблица полезнее CTE? Когда промежуточный набор используется несколько раз, индексируется или должен жить дольше одного оператора.
Ускоряет ли view запрос автоматически? Нет; ускорение возможно у материализованного представления или благодаря другой структуре плана.