Тимчасові таблиці дуже важливі в базі даних Sqlserver, і нижче наведено детальне введення у характеристики та використання тимчасових таблиць у SQL базі даних, лише для довідки.
Тимчасові таблиці схожі на постійні, але тимчасові таблиці зберігаються в tempdb і автоматично видаляються, коли вони більше не використовуються. Існує два типи тимчасових таблиць: локальні та глобальні. Їх вирізняють за назвою, видимістю та доступністю.
Тимчасова таблиця має такі характеристики:
- Локальні тимчасові таблиці — це таблиці, до яких користувачі додають префікс «#» при створенні таблиць, і які є незалежними залежно від підключень до бази даних. Доступ до таблиці має лише з'єднання з базою даних, яке створило локальну тимчасову таблицю, а інші з'єднання не можуть отримати доступ до таблиці.
- У різних зв'язках з базами даних, хоча створені локальні тимчасові таблиці мають однакове «ім'я», ці таблиці не мають жодного зв'язку між собою. У SQLSERVER спеціальний механізм іменування забезпечує незалежність локальних тимчасових таблиць у з'єднаннях до бази даних.
- Справжні тимчасові таблиці використовують тимчасовий простір таблиць бази даних, який автоматично підтримується системою баз даних, таким чином економячи простір у таблиці. І оскільки тимчасовий простір таблиць зазвичай використовує віртуальну пам'ять, кількість I/O на жорсткому диску значно зменшується, тому ефективність системи також підвищується.
- Тимчасова таблиця автоматично спорожнюється після завершення транзакції або сесії, тож вам не потрібно пам'ятати видалити дані після їх вичерпання.
Місцеві тимчасові таблиці
Назва локальної тимчасової таблиці має один числовий символ (#); Вони видимі лише для поточного користувацького з'єднання (тобто з'єднання, яке створює локальну тимчасову таблицю); Він видаляється, коли користувач відключається від екземпляра 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不会被释放掉. |