Временные таблицы (Temporary Tables) и таблицы-переменные (Table Variables) — это разные механизмы для хранения промежуточных данных на время выполнения запроса или процедуры.
Временные таблицы (например, #TempTable в MS SQL):
Таблицы-переменные (например, @MyTable):
Пример:
-- Временная таблица 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 перед созданием.
История
Использовали глобальную временную таблицу для межпроцессного взаимодействия отчётов. Не учли, что одновременное выполнение делало поведение непредсказуемым — сессии конфликтовали за одни и те же данные. Было принято решение заменить глобальную таблицу на индивидуальные временные для каждой сессии.