Локальні та глобальні тимчасові таблиці в 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
Також варто зазначити: Місцеві тимчасові таблиці видаляються, коли область, що їх створила, закрита. Отже, якщо ви створите локальну таблицю темпів усередині паростка, а потім спробуйте отримати доступ до неї поза цим паростом - вона не буде існувати.

+1 для Вілла. Я намагався використовувати локальну тимчасову таблицю в якості оптимізатора, і я намагався використовувати збережену процедуру як ініціалізатор "створити та заповнити, якщо його не існує". Як ви кажете, він не працює, якщо замість цього не використовується глобальна тимчасова таблиця.
quillbreaker

9
"видаляються, коли всі з'єднання, на які вони посилаються, закриті" - що саме означає ", на який вони посилаються"? Якщо StoredProc з одного з'єднання №1 створює ## TempTable, чи можу я побачити це з іншого з'єднання №2, скажімо, через 10 хвилин (якщо це з'єднання №2 було активним у час створення таблиці?) ВІДПОВІДЬ: Глобальні тимчасові таблиці автоматично скидаються, коли сеанс, який створив таблицю, закінчується, і всі інші завдання припинили посилання на них. (див. більше на цій сторінці в іншій відповіді)
tbone

Я намагався використовувати збережену процедуру для створення локальних тимчасових таблиць (#t), необхідних за подальшою логікою, однак виявилося, що батьківська збережена процедура повинна створити їх для того, щоб вони були доступними для дітей, що зберігали виклики процедур. Це було сумно, адже у нас є купа збережених процедур, які повинні так само налаштовувати таблиці і викликати загальні проростки. Чи працюватимуть глобальні темп-таблиці в такому випадку, коли виклики дітей мають доступ до таблиць, створених побратимами? Ми використовуємо SQL Server 2008.
Брендон

1
@Brandon Ти абсолютно прав. Цього не вистачає функціональності. Підтримка 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

Варто зазначити, що є також: глобальні тимчасові таблиці, що охоплюються базами даних (на даний момент підтримується лише база даних 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, і налаштування окремих баз даних користувача не впливає.


0

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

Бази даних -> Бази даних системи -> tempdb -> Тимчасові таблиці

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.