Что такое временная таблица в SQL и для чего она используется?

Ответ

Временная таблица — это таблица, которая существует только в течение определенного времени (сеанса соединения или транзакции) и автоматически удаляется. Она предназначена для временного хранения промежуточных результатов сложных запросов, данных для обработки в пакетах или изоляции сеансов.

Ключевые особенности:

  • Время жизни: Удаляется автоматически при закрытии соединения с БД (сеанса) или, в некоторых СУБД, в конце транзакции.
  • Область видимости: Может быть локальной (видна только в текущем соединении) или глобальной (видна всем соединениям).
  • Производительность: Как правило, операции с временными таблицами логируются минимально или не логируются вообще, что делает их быстрее обычных таблиц для промежуточных вычислений.
  • Изоляция: Данные в локальной временной таблице изолированы для каждого пользовательского сеанса, даже если таблицы имеют одинаковые имена.

Синтаксис и примеры (на основе SQL Server / T-SQL):

  1. Локальная временная таблица: Начинается с одного символа #. Видна только в рамках текущего соединения.

    -- Создание локальной временной таблицы
    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 автоматически удалится
  2. Глобальная временная таблица: Начинается с двух символов ##. Видна всем соединениям с сервером. Удаляется, когда все соединения, ссылающиеся на нее, закроются.

    CREATE TABLE ##GlobalConfig (
        SettingKey VARCHAR(50),
        SettingValue VARCHAR(100)
    );

Типичные сценарии использования:

  • Разбиение сложного многошагового запроса на простые этапы.
  • Хранение результатов вызова хранимой процедуры для дальнейшей обработки.
  • Замена курсоров в циклической обработке строк.
  • Тестирование и отладка запросов без создания постоянных объектов в БД.

Ответ 18+ 🔞

А, временные таблицы! Ну это ж классика, блядь, как эти ваши Герасимы с Муму. Представь себе — есть у тебя в базе такой вот работяга-чувак, который появляется, делает своё дело и нахуй исчезает, не оставляя даже мокрого места. Вообще красота, ёпта!

Вот смотри, сука, в чём прикол: это табличка, которая живёт ровно до тех пор, пока ты с базой разговариваешь. Закрыл окошко запроса — и всё, пиздец, таблицы как не бывало. Автоматически, блядь! Ни тебе ручного DROP'а, ни мусора после себя. Чистая магия, ядрёна вошь!

И главные фишки, бля:

  • Живёт недолго: Как мотылёк, сука. Кончилась сессия или транзакция — и привет, в рот меня чих-пых, таблички нет.
  • Кто видит: Может быть скромнягой-одиночкой (только для тебя) или шлюхой публичной (для всех, кто на сервер зашёл).
  • Скорость: А вот это, блядь, самое сокровенное! С ними обычно не заморачиваются с полным логом операций, поэтому они овердохуища быстрые для всяких промежуточных вычислений. Не в пример этим неповоротливым постоянным таблицам.
  • Изоляция: Если таблица твоя личная, то даже если другой такой же мудак в параллельном окне создаст таблицу с таким же именем — это будут две разные таблицы, они друг друга не увидят. Каждый сидит в своей песочнице, блядь.

Как это выглядит в деле (возьмём SQL Server для примера):

  1. Табличка-невидимка (только для тебя). Начинается с одной решётки #. Сделал дело — гуляй смело, она сама сдохнет.

    -- Рождаем на свет локальную временную таблицу
    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 нет, волнение ебать! Удалилась сама.
  2. Табличка-шлюха (для всех). Начинается с двух решёток ##. Видят все подключившиеся. Исчезнет только тогда, когда последний любопытный глаз от неё отведёт.

    CREATE TABLE ##GlobalConfig (
        SettingKey VARCHAR(50),
        SettingValue VARCHAR(100)
    );

И где это, блядь, пригождается в жизни?

  • Когда запрос такой сложный, что хуй разберёшь. Разбиваешь его на куски, как дурак умный, и каждый кусок складируешь во временную таблицу.
  • Нужно сохранить результат вызова хранимой процедуры, чтобы потом ещё разок его по полочкам разложить.
  • Чтобы не ебаться с курсорами, которые все ненавидят. Лучше засунуть данные во временную таблицу и по ним циклом пройтись.
  • Для тестов, чтоб не засирать продакшен своими экспериментальными поделками. Создал, потестил — и ни хуя после тебя не осталось, чистота!