ПрограммированиеBackend разработчик

Какие особенности есть у временных таблиц (Temporary Tables) в SQL, как их правильно использовать, и в чем отличие от таблиц-переменных (Table Variables)?

Проходите собеседования с ИИ помощником Hintsage

Ответ.

Временные таблицы (Temporary Tables) и таблицы-переменные (Table Variables) — это разные механизмы для хранения промежуточных данных на время выполнения запроса или процедуры.

Временные таблицы (например, #TempTable в MS SQL):

  • Хранятся во временной базе данных tempdb.
  • Видны в текущей сессии или соединении.
  • Позволяют создавать индексы, ограничения, могут быть частью транзакций.
  • Используются при работе с большими объемами данных и сложными обработками.

Таблицы-переменные (например, @MyTable):

  • Имеют область видимости внутри batch/procedure/функции.
  • Чаще оптимизируются для небольших наборов данных.
  • На них нельзя создавать полноценные индексы (кроме PRIMARY KEY/UNIQUE).
  • С меньшей вероятностью блокируются и участвуют в транзакциях иначе.

Пример:

-- Временная таблица CREATE TABLE #Temp( Id INT, Name NVARCHAR(100) ); INSERT INTO #Temp VALUES (1, 'Test'); SELECT * FROM #Temp; -- Таблица-переменная DECLARE @MyTable TABLE (Id INT, Name NVARCHAR(100)); INSERT INTO @MyTable VALUES (2, 'Sample'); SELECT * FROM @MyTable;

Вопрос с подвохом.

Чем отличается время жизни и область видимости временной таблицы #TempTable и глобальной временной таблицы ##GlobalTempTable?

Правильный ответ:

  • #TempTable видна только в текущей сессии, уничтожается при закрытии соединения или explicit DROP.
  • ##GlobalTempTable доступна всем сессиям до закрытия последней сессии, использовавшей таблицу, либо explicit DROP. Она исчезает только после закрытия последнего соединения, использующего её.
-- Глобальная временная таблица CREATE TABLE ##GlobalTemp (Id INT);

Примеры реальных ошибок из-за незнания тонкостей темы.


История

В проекте по обработке больших отчетов использовали таблицу-переменную для временного хранения сотен тысяч строк. Итог: резкое падение производительности, т.к. оптимизатор переоценил стоимость запросов и начал использовать плохо подходящие планы. Замена на временную таблицу в tempdb получила значительный прирост по времени.


История

В одной процедуре забыли явно удалить временную таблицу. При повторных пакетных запусках в одной сессии возникали ошибки: "объект уже существует". Проблема исчезла после добавления DROP TABLE перед созданием.


История

Использовали глобальную временную таблицу для межпроцессного взаимодействия отчётов. Не учли, что одновременное выполнение делало поведение непредсказуемым — сессии конфликтовали за одни и те же данные. Было принято решение заменить глобальную таблицу на индивидуальные временные для каждой сессии.