Временные таблицы очень важны в базе данных Sqlserver, и ниже приведено подробное введение в характеристики и использование временных таблиц в SQL базе данных только для справки.
Временные таблицы похожи на постоянные, но временные таблицы хранятся в tempdb и автоматически удаляются, когда они больше не используются. Существует два типа временных столов: локальные и глобальные. Они отличаются по названию, видимости и доступности.
Временная таблица обладает следующими характеристиками:
- Локальные временные таблицы — это таблицы, к которым пользователи добавляют префикс «#» при создании таблиц, и которые независимы в зависимости от соединений с базой данных. Доступ к таблице имеет доступ только соединение с базой данных, создавшее локальную временную таблицу, а другие соединения не могут получить доступ к таблице.
- В разных соединениях с базами данных, хотя созданные локальные временные таблицы имеют одно и то же «название», они не связаны друг с другом. В SQLSERVER специальный механизм именования гарантирует независимость локальных временных таблиц в соединениях с базой данных.
- Истинные временные таблицы используют временное пространство таблиц базы данных, которое автоматически поддерживается системой базы данных, тем самым экономя место в таблице. Поскольку временное табличное пространство обычно использует виртуальную память, количество ввода-выводов на жёстком диске значительно уменьшается, что повышает эффективность системы.
- Временная таблица автоматически опустошается после окончания транзакции или сессии, так что вам не нужно забывать удалять данные после их окончания.
Местные временные столы
Название локальной временной таблицы предварительно имеет один числовой символ (#); Они видны только для текущего пользовательского соединения (то есть соединения, создающего локальную временную таблицу); Он удаляется, когда пользователь отключается от экземпляра SQL Server.
Например, мы создаём локальную временную таблицу в соединении с базой данных следующим оператором: #Temp
Подключение к базе данных 1:
Затем одновременно запускайте подключение к базе данных 2, чтобы выполнить запрос #temp
Подключение к базе данных 2:
Давайте посмотрим, каков результат подключения к базе данных 2?
Подключение к базе данных 2:
Результаты показывают, что соединение базы данных 2 не может найти таблицу #Temp. Это означает, что временная таблица #Temp видна только соединению базы данных 1, которое её создало, но не соединению с базой данных 2.
Глобальная временная таблица
Название глобальной временной таблицы имеет префикс с двумя числовыми символами (##) и видно для любых соединений с базой данных при создании, а также удаляется, когда все соединения с базой данных, ссылающиеся на таблицу, отключаются от SQL Server.
Например, мы создаём глобальную временную таблицу ##Temp в соединении с базой данных со следующим оператором, а затем вставляем три строки данных
Подключение к базе данных 1:
Затем мы делаем запрос ##Temp的数据 в соединении базы данных 2
Подключение к базе данных 2:
Результат соединения с базой данных 2 выглядит следующим образом
Подключение к базе данных 2:
Как видите, соединение базы данных 2 успешно может получить доступ к глобальной временной таблице ##Temp, созданной соединением базы данных 1, но если мы закроем соединение 1 сейчас и затем выполним ##Temp查询语句会发生什么呢 соединения базы данных 2? Результаты следующие:
Закройте соединение базы данных 1, и затем соединение базы данных 2 выполняется снова:
Мы обнаружили, что после закрытия соединения базы данных 1 соединение базы данных 2 не может найти глобальную временную таблицу ##Temp了. Это связано с тем, что после закрытия соединения базы данных 1 в соединении базы данных 2, использующего временную таблицу ##Temp, нет оператора, поэтому SQL Server считает, что в данный момент нет соединения с базой данных, ссылающегося на глобальную временную таблицу ##Temp了, поэтому он будет ##Temp释放掉了.
Далее пытаемся закрыть глобальную таблицу времени ##Temp持有事务中的排他锁 (X-lock) в соединении базы данных 2, а затем закрыть соединение базы данных 1.
Подключение к базе данных 1:
Подключение к базе данных 2:
Закройте соединение базы данных 1, и затем выполняется соединение базы данных 2:
Результат показывает, что хотя мы закрываем соединение базы данных 1, поскольку соединение базы данных 2 хранило глобальную временную таблицу ##Temp的排他锁 (блокировку X) в транзакции, временная таблица # #Temp并没有随着数据库连接1的关闭而被释放掉, пока транзакция, начатая в соединении базы данных 2, не откатывается и не фиксируется, то соединение базы данных 2 всегда будет хранить временную таблицу ##Temp的排他锁. На данный момент Sqlserver будет думать, что всё ещё существует соединение с базой данных, ссылающееся на глобальную временную таблицу ##Temp, то есть ##Temp不会被释放掉. |