Когда и зачем использовать глобальную временную таблицу поверх локальной временной таблицы в SQL Server - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть локальная временная таблица, подобная этой:

create table #tbl
(
    employeeId int,
    employeeName nvarchar(50)
)

insert into #tbl
values (1, 'a'), (2, 'b'),
       (3, 'c'), (4, 'd')

select * from #tbl

Теперь я могу получить доступ к локальной временной таблице в этом конкретном пользовательском сеансе и в этом конкретном окне запроса по сравнению с глобальной временной таблицей, в которой я могу получить доступ к глобальной временной таблице в любом окне запроса, пока созданное окно запроса не закроется. пока все хорошо.

Теперь я не могу понять причину, почему требуется глобальная временная таблица.

Мои вопросы:

  1. Является ли конкретный экземпляр глобальной временной таблицы конкретным? Если да, то как другой пользователь может завладеть вновь созданной глобальной временной таблицей

  2. По какой причине SQL Server разработал глобальную временную таблицу поверх локальной временной таблицы?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Основная проблема с глобальными временными таблицами заключается в том, что имена должны быть уникальными во всех сеансах, для локальных временных таблиц - только в пределах сеанса. В результате на практике локальные временные таблицы обычно более практичны. Локальные временные таблицы также более безопасны, если они содержат данные, которые должны видеть не все пользователи сервера.

Иногда я нахожу глобальные временные таблицы полезными при создании их в динамическом SQL и желании их выживания, когда динамический SQL перестает быть доступным во внешней области.

Это только то, что я использую, однако, при специальных запросах. В рабочем коде это было бы довольно вонючим по нескольким причинам.

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

0 голосов
/ 11 ноября 2018

Лично я не вижу необходимости в глобальных временных таблицах. Я склонен хранить такие данные в таблицах вместе с другими таблицами. Но, очевидно, они удовлетворяют потребность.

Ответ на ваш первый вопрос заключается в том, что глобальные временные таблицы зависят от конкретного экземпляра - если под экземпляром вы подразумеваете экземпляр SQL Server. Они доступны всем пользователям и всем соединениям на сервере. Глобальные временные таблицы начинаются с префикса ##. Все ссылки на такую ​​таблицу, скажем, ##table, относятся к одной и той же таблице (в экземпляре сервера).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...