Ответ
Временная таблица — это таблица, которая существует только в течение определенного времени (сеанса соединения или транзакции) и автоматически удаляется. Она предназначена для временного хранения промежуточных результатов сложных запросов, данных для обработки в пакетах или изоляции сеансов.
Ключевые особенности:
- Время жизни: Удаляется автоматически при закрытии соединения с БД (сеанса) или, в некоторых СУБД, в конце транзакции.
- Область видимости: Может быть локальной (видна только в текущем соединении) или глобальной (видна всем соединениям).
- Производительность: Как правило, операции с временными таблицами логируются минимально или не логируются вообще, что делает их быстрее обычных таблиц для промежуточных вычислений.
- Изоляция: Данные в локальной временной таблице изолированы для каждого пользовательского сеанса, даже если таблицы имеют одинаковые имена.
Синтаксис и примеры (на основе SQL Server / T-SQL):
-
Локальная временная таблица: Начинается с одного символа
#. Видна только в рамках текущего соединения.-- Создание локальной временной таблицы CREATE TABLE #TempSales ( ProductID INT, TotalAmount DECIMAL(10,2) ); -- Вставка промежуточных данных агрегации INSERT INTO #TempSales SELECT ProductID, SUM(Amount) FROM Sales GROUP BY ProductID; -- Использование в последующих запросах этого же соединения SELECT p.Name, ts.TotalAmount FROM Products p JOIN #TempSales ts ON p.ID = ts.ProductID WHERE ts.TotalAmount > 1000; -- При закрытии соединения таблица #TempSales автоматически удалится -
Глобальная временная таблица: Начинается с двух символов
##. Видна всем соединениям с сервером. Удаляется, когда все соединения, ссылающиеся на нее, закроются.CREATE TABLE ##GlobalConfig ( SettingKey VARCHAR(50), SettingValue VARCHAR(100) );
Типичные сценарии использования:
- Разбиение сложного многошагового запроса на простые этапы.
- Хранение результатов вызова хранимой процедуры для дальнейшей обработки.
- Замена курсоров в циклической обработке строк.
- Тестирование и отладка запросов без создания постоянных объектов в БД.
Ответ 18+ 🔞
А, временные таблицы! Ну это ж классика, блядь, как эти ваши Герасимы с Муму. Представь себе — есть у тебя в базе такой вот работяга-чувак, который появляется, делает своё дело и нахуй исчезает, не оставляя даже мокрого места. Вообще красота, ёпта!
Вот смотри, сука, в чём прикол: это табличка, которая живёт ровно до тех пор, пока ты с базой разговариваешь. Закрыл окошко запроса — и всё, пиздец, таблицы как не бывало. Автоматически, блядь! Ни тебе ручного DROP'а, ни мусора после себя. Чистая магия, ядрёна вошь!
И главные фишки, бля:
- Живёт недолго: Как мотылёк, сука. Кончилась сессия или транзакция — и привет, в рот меня чих-пых, таблички нет.
- Кто видит: Может быть скромнягой-одиночкой (только для тебя) или шлюхой публичной (для всех, кто на сервер зашёл).
- Скорость: А вот это, блядь, самое сокровенное! С ними обычно не заморачиваются с полным логом операций, поэтому они овердохуища быстрые для всяких промежуточных вычислений. Не в пример этим неповоротливым постоянным таблицам.
- Изоляция: Если таблица твоя личная, то даже если другой такой же мудак в параллельном окне создаст таблицу с таким же именем — это будут две разные таблицы, они друг друга не увидят. Каждый сидит в своей песочнице, блядь.
Как это выглядит в деле (возьмём SQL Server для примера):
-
Табличка-невидимка (только для тебя). Начинается с одной решётки
#. Сделал дело — гуляй смело, она сама сдохнет.-- Рождаем на свет локальную временную таблицу CREATE TABLE #TempSales ( ProductID INT, TotalAmount DECIMAL(10,2) ); -- Напихиваем в неё какие-нибудь промежуточные суммированные данные INSERT INTO #TempSales SELECT ProductID, SUM(Amount) FROM Sales GROUP BY ProductID; -- А теперь используем эту красоту в других запросах, как родную SELECT p.Name, ts.TotalAmount FROM Products p JOIN #TempSales ts ON p.ID = ts.ProductID WHERE ts.TotalAmount > 1000; -- Закрыл студию (сессию) — и #TempSales нет, волнение ебать! Удалилась сама. -
Табличка-шлюха (для всех). Начинается с двух решёток
##. Видят все подключившиеся. Исчезнет только тогда, когда последний любопытный глаз от неё отведёт.CREATE TABLE ##GlobalConfig ( SettingKey VARCHAR(50), SettingValue VARCHAR(100) );
И где это, блядь, пригождается в жизни?
- Когда запрос такой сложный, что хуй разберёшь. Разбиваешь его на куски, как дурак умный, и каждый кусок складируешь во временную таблицу.
- Нужно сохранить результат вызова хранимой процедуры, чтобы потом ещё разок его по полочкам разложить.
- Чтобы не ебаться с курсорами, которые все ненавидят. Лучше засунуть данные во временную таблицу и по ним циклом пройтись.
- Для тестов, чтоб не засирать продакшен своими экспериментальными поделками. Создал, потестил — и ни хуя после тебя не осталось, чистота!