Ответ
Временная таблица — это таблица в базе данных, которая существует только в рамках текущей сессии или транзакции и автоматически удаляется при их завершении. Она видна только тому пользователю, который её создал.
Ключевые особенности:
- Изоляция: Данные во временной таблице изолированы и не видны другим сессиям.
- Автоматическая очистка: Не нужно беспокоиться об удалении таблицы, СУБД сделает это сама.
- Производительность: Операции с временными таблицами могут быть быстрее, так как для них генерируется меньше логов (redo/undo) по сравнению с обычными таблицами.
Основные сценарии использования:
- Хранение промежуточных результатов: Когда нужно выполнить сложный многоэтапный запрос, результаты одного этапа можно сохранить во временную таблицу и использовать в следующих.
- Декомпозиция сложных
JOIN
: Вместо одного огромного и медленногоJOIN
можно выбрать данные из каждой таблицы в отдельные временные таблицы, а затем соединить их. - Агрегация данных для отчетов: Собрать и обработать данные для сложного отчета, не затрагивая и не блокируя основные таблицы надолго.
Пример в PostgreSQL:
Временная таблица создается с помощью CREATE TEMPORARY TABLE
или CREATE TEMP TABLE
.
-- Начало транзакции
BEGIN;
-- Создаем временную таблицу, которая будет удалена после коммита
CREATE TEMPORARY TABLE temp_active_users (
user_id INT PRIMARY KEY,
last_login_date DATE
) ON COMMIT DROP; -- ON COMMIT DROP удаляет таблицу в конце транзакции
-- ON COMMIT PRESERVE ROWS (по умолчанию) сохраняет до конца сессии
-- Наполняем ее данными
INSERT INTO temp_active_users (user_id, last_login_date)
SELECT id, last_login FROM users WHERE status = 'active';
-- Используем временную таблицу для сложного запроса
SELECT u.name, t.last_login_date
FROM users u
JOIN temp_active_users t ON u.id = t.user_id
WHERE t.last_login_date > '2023-01-01';
-- Завершение транзакции, таблица temp_active_users будет автоматически удалена
COMMIT;
В Go-приложении эти SQL-команды выполняются последовательно внутри одной транзакции с помощью объекта sql.Tx
.