В чем разница между локальными и глобальными временными таблицами в SQL Server?
В чем разница между локальными и глобальными временными таблицами в SQL Server?
Ответы:
Я нахожу это объяснение довольно ясным (это чистая копия из Technet ):
Существует два типа временных таблиц: локальные и глобальные. Локальные временные таблицы видны только их создателям при том же соединении с экземпляром SQL Server, что и при первом создании или обращении к таблицам. Локальные временные таблицы удаляются после того, как пользователь отключается от экземпляра SQL Server. Глобальные временные таблицы видны любому пользователю и любому соединению после их создания и удаляются, когда все пользователи, ссылающиеся на таблицу, отключаются от экземпляра SQL Server.
Табличные переменные ( DECLARE @t TABLE
) видны только соединению, которое их создает, и удаляются по окончании пакета или хранимой процедуры.
Локальные временные таблицы ( CREATE TABLE #t
) видны только соединению, которое их создает, и удаляются при закрытии соединения.
Глобальные временные таблицы ( CREATE TABLE ##t
) видны всем и удаляются, когда закрываются все соединения, на которые они ссылаются.
Постоянные таблицы Tempdb ( USE tempdb CREATE TABLE t
) видны всем и удаляются при перезапуске сервера.
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.
Цитирование из Книги Онлайн:
Локальные временные таблицы видны только в текущем сеансе; глобальные временные таблицы видны всем сеансам.
Временные таблицы автоматически удаляются, когда они выходят из области видимости, если только они явно не удалены с помощью DROP TABLE:
Локальные временные таблицы : если вы создадите локальные временные таблицы, а затем откроете другое соединение и попробуете запрос, вы получите следующую ошибку.
временные таблицы доступны только в сеансе, который их создал.
Глобальные временные таблицы : иногда вам может потребоваться создать временную таблицу, доступную другим соединениям. В этом случае вы можете использовать глобальные временные таблицы.
Глобальные временные таблицы уничтожаются только тогда, когда все сеансы, ссылающиеся на них, закрыты.
Стоит отметить, что есть также: глобальные временные таблицы в области базы данных (в настоящее время поддерживается только базой данных 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, и настройка отдельных пользовательских баз данных не оказывает влияния.
Я не видел ни одного ответа, чтобы показать пользователям, где мы можем найти таблицу Global Temp. При навигации по SSMS вы можете просматривать локальные и глобальные временные таблицы в одном месте. Скриншот ниже взят по этой ссылке .
Базы данных -> Системные базы данных -> tempdb -> Временные таблицы