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

«Что такое временная таблица в SQL и для чего она используется?» — вопрос из категории Базы данных и SQL, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

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

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

Синтаксис и примеры (на основе 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)
    );

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

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