Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 11952|Відповідь: 0

[Джерело] Детальне пояснення тимчасових таблиць у базах даних SQL Server

[Копіювати посилання]
Опубліковано 28.05.2020 10:52:28 | | | |
Тимчасові таблиці дуже важливі в базі даних 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不会被释放掉.




Попередній:Accessor властивості TypeScript (set,get)
Наступний:SQL Server робить запити до попередніх днів поточного системного часу
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com