Чим відрізняються локальні та глобальні тимчасові таблиці в 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:
Місцеві тимчасові таблиці : якщо створити локальні тимчасові таблиці, а потім відкрити інше з'єднання та спробувати запит, ви отримаєте таку помилку.
тимчасові таблиці доступні лише в межах сесії, яка їх створила.
Глобальні тимчасові таблиці : Іноді вам може знадобитися створити тимчасову таблицю, доступну для інших з'єднань. У цьому випадку ви можете використовувати глобальні тимчасові таблиці.
Глобальні тимчасові таблиці знищуються лише тоді, коли всі сесії, що посилаються на нього, закриті.
Варто зазначити, що є також: глобальні тимчасові таблиці, що охоплюються базами даних (на даний момент підтримується лише база даних Azure SQL).
Глобальні тимчасові таблиці для SQL Server (ініційовані з іменем таблиці ##) зберігаються в tempdb та діляться між усіма сесіями користувачів у всьому екземплярі SQL Server.
Azure SQL Database підтримує глобальні тимчасові таблиці, які також зберігаються в tempdb і підходять до рівня бази даних. Це означає, що глобальні тимчасові таблиці поділяються для всіх сеансів користувачів у межах однієї бази даних Azure SQL. Сеанси користувачів з інших баз даних не можуть отримати доступ до глобальних тимчасових таблиць.
-- 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'
GLOBAL_TEMPORARY_TABLE_AUTODROP = { ON | OFF }
ЗАЯВКА ДО: База даних SQL Azure (функція знаходиться у загальнодоступному попередньому перегляді)
Дозволяє налаштувати функцію автоматичного падіння для глобальних тимчасових таблиць. За замовчуванням встановлено значення УВІМКНЕНО, що означає, що глобальні тимчасові таблиці автоматично скидаються, коли не використовується жоден сеанс. Якщо встановлено значення OFF, глобальні тимчасові таблиці повинні бути явно відмінені за допомогою оператора DROP TABLE або будуть автоматично скинуті при перезапуску сервера.
За допомогою єдиних баз даних і еластичних пулів Azure SQL Database ця опція може бути встановлена в окремих баз даних користувачів сервера баз даних SQL. У екземплярі, керованому SQL Server та Azure SQL Database, ця опція встановлюється в TempDB, і налаштування окремих баз даних користувача не впливає.
Я не бачив відповідей, які показують користувачам, де ми можемо знайти таблицю Global Temp. Ви можете переглядати локальні та глобальні таблиці темпів у тому самому місці під час навігації в межах SSMS. Скріншот нижче, взятий за цим посиланням .
Бази даних -> Бази даних системи -> tempdb -> Тимчасові таблиці