Локальные и глобальные временные таблицы в SQL Server

156

В чем разница между локальными и глобальными временными таблицами в SQL Server?

Эндрю Салливан
источник
2
Вот некоторые подробности об этом, нажмите здесь
Jayesh Sorathia
5
Будьте осторожны при использовании табличных переменных. Если вы используете их в запросе, они могут привести к серьезным проблемам с производительностью вашего плана запросов, поскольку они не проиндексированы.
На самом деле временные таблицы могут быть проиндексированы, если это необходимо, но это также требует времени и ресурсов, так что это может вызвать проблемы с производительностью или ресурсами.
Эндрю Стейц

Ответы:

114

Я нахожу это объяснение довольно ясным (это чистая копия из Technet ):

Существует два типа временных таблиц: локальные и глобальные. Локальные временные таблицы видны только их создателям при том же соединении с экземпляром SQL Server, что и при первом создании или обращении к таблицам. Локальные временные таблицы удаляются после того, как пользователь отключается от экземпляра SQL Server. Глобальные временные таблицы видны любому пользователю и любому соединению после их создания и удаляются, когда все пользователи, ссылающиеся на таблицу, отключаются от экземпляра SQL Server.

Дон
источник
Отличный, полезный ответ! Я искал конкретную информацию о том, если / когда глобальные временные таблицы были автоматически очищены SQL Server.
Kwill
Очень четкий и краткий ответ. Кто-нибудь может придумать хороший вариант использования глобальных временных таблиц? Тот, который иллюстрирует их назначение в отличие от назначения локальных временных таблиц?
Тревор
336
  • Табличные переменные ( DECLARE @t TABLE) видны только соединению, которое их создает, и удаляются по окончании пакета или хранимой процедуры.

  • Локальные временные таблицы ( CREATE TABLE #t) видны только соединению, которое их создает, и удаляются при закрытии соединения.

  • Глобальные временные таблицы ( CREATE TABLE ##t) видны всем и удаляются, когда закрываются все соединения, на которые они ссылаются.

  • Постоянные таблицы Tempdb ( USE tempdb CREATE TABLE t) видны всем и удаляются при перезапуске сервера.

Энтони Фаулл
источник
55
Также стоит отметить: локальные временные таблицы удаляются, когда область их создания закрыта. Итак, если вы создадите локальную временную таблицу внутри sproc, а затем попытаетесь получить к ней доступ вне этого sproc - она ​​не будет существовать.
+1 за волю. Я пытался использовать локальную временную таблицу в качестве оптимизатора, и я пытался использовать хранимую процедуру как инициализатор «создать и заполнить, если она не существует». Как вы говорите, это не будет работать, если вы не используете вместо этого глобальную временную таблицу.
Quillbreaker
9
«удаляются, когда все соединения, на которые они ссылались, закрылись» - что означает «что на них ссылаются» точно? Если StoredProc из одного соединения # 1 создает ## TempTable, могу ли я увидеть его из другого соединения # 2, скажем, через 10 минут (если это соединение № 2 было активным во время создания таблицы?) ОТВЕТ: Глобальные временные таблицы автоматически удаляются, когда сеанс, который создал таблицу, заканчивается, и все другие задачи перестали ссылаться на них. (см. больше на этой странице в другом ответе)
tbone
Я попытался использовать хранимую процедуру для создания локальных временных таблиц (#t), необходимых для последующей логики, однако оказалось, что родительская хранимая процедура должна была создавать их, чтобы они были доступны для вызовов дочерних хранимых процедур. Это было грустно, потому что у нас есть куча хранимых процедур, которые должны настраивать таблицы одинаково и вызывать общие sprocs. Будут ли работать глобальные временные таблицы в этом случае, когда дочерние вызовы имеют доступ к таблицам, созданным одним из братьев? Мы используем SQL Server 2008.
Брэндон
1
@ Брэндон Вы совершенно правы. Это не хватает функциональности. Поддержка TSQL правильного определения объема временных данных довольно поверхностна. Как будто дизайнеры языка хотели, чтобы все было глобальным. И почти нет поддержки замыканий. Вы можете передать курсорную переменную. Но это еще одна банка червей, потому что ряд за агонизирующей строкой некуда идти.
Энтони Фаулл
12

1.) Локальная временная таблица существует только на время соединения или, если она определена внутри составного оператора, на время составного оператора.

Локальные временные таблицы доступны только для сеанса или соединения SQL Server (имеется в виду один пользователь), который создал таблицы. Они автоматически удаляются, когда сеанс, создавший таблицы, был закрыт. Имя локальной временной таблицы помечается одним хешем ("#").

CREATE TABLE #LocalTemp
(
 UserID int,
 Name varchar(50), 
 Address varchar(150)
)
GO
insert into #LocalTemp values ( 1, 'Name','Address');
GO
Select * from #LocalTemp

Область действия локальной временной таблицы существует для текущего сеанса текущего пользовательского средства для текущего окна запроса. Если вы закроете текущее окно запроса или откроете новое окно запроса и попытаетесь найти созданную выше временную таблицу, это выдаст вам ошибку.


2.) Глобальная временная таблица остается в базе данных постоянно, но строки существуют только в пределах данного соединения. Когда соединение закрыто, данные в глобальной временной таблице исчезают. Однако определение таблицы остается в базе данных для доступа при следующем открытии базы данных.

Глобальные временные таблицы доступны для всех сеансов или соединений SQL Server (означает всех пользователей). Они могут быть созданы любым пользователем подключения к SQL Server, и они автоматически удаляются, когда все подключения к SQL Server были закрыты. Имя глобальной временной таблицы помечается знаком двойного хеша ("##").

CREATE TABLE ##GlobalTemp
(
 UserID int,
 Name varchar(50), 
 Address varchar(150)
)
GO
insert into ##GlobalTemp values ( 1, 'Name','Address');
GO
Select * from ##GlobalTemp

Глобальные временные таблицы видны всем соединениям SQL Server, а локальные временные таблицы видны только текущему соединению SQL Server.

Вивек С.
источник
2
Вы определяете глобальную временную таблицу так, как я ожидаю, что она будет вести себя (исходя из других БД), но мое тестирование показывает, что на самом деле происходит в SQL Server: «Глобальные временные таблицы автоматически удаляются, когда сеанс, который создал таблицу заканчивается, и все другие задачи перестали ссылаться на них "
Николай
11

Цитирование из Книги Онлайн:

Локальные временные таблицы видны только в текущем сеансе; глобальные временные таблицы видны всем сеансам.

Временные таблицы автоматически удаляются, когда они выходят из области видимости, если только они явно не удалены с помощью DROP TABLE:

  • Локальная временная таблица, созданная в хранимой процедуре, автоматически удаляется после ее завершения. На таблицу могут ссылаться любые вложенные хранимые процедуры, выполняемые хранимой процедурой, создавшей таблицу. На таблицу нельзя ссылаться процессом, который вызвал хранимую процедуру, которая создала таблицу.
  • Все остальные локальные временные таблицы автоматически удаляются в конце текущего сеанса.
  • Глобальные временные таблицы автоматически удаляются, когда завершается сеанс, создавший таблицу, и все другие задачи перестают ссылаться на них. Связь между задачей и таблицей поддерживается только на время существования одного оператора Transact-SQL. Это означает, что глобальная временная таблица удаляется при завершении последнего оператора Transact-SQL, который активно ссылался на таблицу, когда завершался сеанс создания.
Кристиан Хейтер
источник
0

Локальные временные таблицы : если вы создадите локальные временные таблицы, а затем откроете другое соединение и попробуете запрос, вы получите следующую ошибку.

временные таблицы доступны только в сеансе, который их создал.

Глобальные временные таблицы : иногда вам может потребоваться создать временную таблицу, доступную другим соединениям. В этом случае вы можете использовать глобальные временные таблицы.

Глобальные временные таблицы уничтожаются только тогда, когда все сеансы, ссылающиеся на них, закрыты.

Реза Дженаби
источник
0

Стоит отметить, что есть также: глобальные временные таблицы в области базы данных (в настоящее время поддерживается только базой данных SQL Azure).

Глобальные временные таблицы для SQL Server (инициируемые с помощью имени таблицы ##) хранятся в базе данных tempdb и используются всеми сеансами пользователей во всем экземпляре SQL Server.

База данных Azure SQL поддерживает глобальные временные таблицы, которые также хранятся в базе данных tempdb и ограничиваются уровнем базы данных. Это означает, что глобальные временные таблицы являются общими для всех сеансов пользователей в одной базе данных SQL Azure. Сеансы пользователей из других баз данных не могут получить доступ к глобальным временным таблицам.

-- Session A creates a global temp table ##test in Azure SQL Database testdb1
-- and adds 1 row
CREATE TABLE ##test ( a int, b int);
INSERT INTO ##test values (1,1);

-- Session B connects to Azure SQL Database testdb1 
-- and can access table ##test created by session A
SELECT * FROM ##test
---Results
1,1

-- Session C connects to another database in Azure SQL Database testdb2 
-- and wants to access ##test created in testdb1.
-- This select fails due to the database scope for the global temp tables 
SELECT * FROM ##test
---Results
Msg 208, Level 16, State 0, Line 1
Invalid object name '##test'

Конфигурация с измененной базой данных ALTER

GLOBAL_TEMPORARY_TABLE_AUTODROP = { ON | OFF }

ПРИМЕНИМО к: База данных SQL Azure (функция доступна для общего просмотра)

Позволяет установить функцию автоматического удаления для глобальных временных таблиц. По умолчанию установлено значение ON, что означает, что глобальные временные таблицы автоматически удаляются, когда они не используются ни в одном сеансе. Если установлено значение OFF, глобальные временные таблицы должны быть явно удалены с помощью оператора DROP TABLE или будут автоматически удалены при перезапуске сервера.

Для отдельных баз данных Azure SQL и эластичных пулов этот параметр можно установить в отдельных пользовательских базах данных сервера баз данных SQL. В управляемом экземпляре SQL Server и базе данных SQL Azure этот параметр устанавливается в TempDB, и настройка отдельных пользовательских баз данных не оказывает влияния.

Лукаш Шозда
источник
0

Я не видел ни одного ответа, чтобы показать пользователям, где мы можем найти таблицу Global Temp. При навигации по SSMS вы можете просматривать локальные и глобальные временные таблицы в одном месте. Скриншот ниже взят по этой ссылке .

Базы данных -> Системные базы данных -> tempdb -> Временные таблицы

введите описание изображения здесь

Код начинающего
источник