|
|
Publicerad på 2020-05-28 10:52:28
|
|
|
|

Tillfälliga tabeller är mycket viktiga i SQL-databasen, och följande är en detaljerad introduktion till egenskaperna och användningen av temporära tabeller i SQL-databasen, endast som referens.
Tillfälliga tabeller liknar persistenta tabeller, men temporära tabeller lagras i tempdb och raderas automatiskt när de inte längre används. Det finns två typer av temporära tabeller: lokala och globala. De skiljs åt genom namn, synlighet och tillgänglighet.
Den tillfälliga tabellen har följande egenskaper:
- Lokala temporära tabeller är tabeller som användare lägger till prefixet "#" när de skapar tabeller, vilka är oberoende beroende på databasanslutningar. Endast databasanslutningen som skapade den lokala tillfälliga tabellen har tillgång till tabellen, och andra anslutningar kan inte komma åt tabellen.
- I olika databasanslutningar, även om de lokala tillfälliga tabellerna som skapas har samma "namn", har dessa tabeller ingen relation till varandra. I SQLSERVER säkerställer en speciell namngivningsmekanism oberoendeenheten hos lokala temporära tabeller i databasanslutningar.
- Verkliga temporära tabeller utnyttjar databasens temporära tabellutrymme, som automatiskt underhålls av databassystemet, vilket sparar tabellutrymme. Och eftersom det tillfälliga tabellutrymmet generellt använder virtuellt minne minskar antalet I/O:er på hårddisken kraftigt, vilket också förbättrar systemets effektivitet.
- Den tillfälliga tabellen töms automatiskt efter att transaktionen eller sessionen är över, så du behöver inte komma ihåg att radera data när den är slut.
Lokala tillfälliga tabeller
Namnet på den lokala temporära tabellen prefixeras med en enda numerisk symbol (#); De är endast synliga för den aktuella användaranslutningen (dvs. anslutningen som skapar den lokala tillfälliga tabellen); Den raderas när en användare kopplar bort från en SQL Server-instans.
Till exempel skapar vi en lokal temporär tabell i en databasanslutning med följande sats: #Temp
Databasanslutning 1:
Starta sedan databasanslutning 2 samtidigt för att utföra frågeställningen #temp
Databasanslutning 2:
Låt oss se vad resultatet är av databasanslutning 2?
Databasanslutning 2:
Resultaten visar att databasanslutning 2 inte kan hitta tabell #Temp. Detta innebär att den temporära tabellen #Temp endast är synlig för databasanslutning 1 som skapade den, men inte för databasanslutning 2.
Global tillfällig tabell
Namnet på en global temporär tabell föregås av två numeriska symboler (##) och är synligt för alla databasanslutningar när de skapas, och tas bort när alla databasanslutningar som refererar till tabellen kopplas bort från SQL Server.
Till exempel skapar vi en global tillfällig tabell ##Temp i en databasanslutning med följande sats, och lägger sedan in tre datarader
Databasanslutning 1:
Sedan frågar vi ##Temp的数据 i databasanslutning 2
Databasanslutning 2:
Resultatet för databasanslutning 2 är som följer
Databasanslutning 2:
Som du kan se kan databasanslutning 2 framgångsrikt komma åt den globala temporära tabellen ##Temp skapad av databasanslutning 1, men om vi stänger dataanslutning 1 nu och sedan kör ##Temp查询语句会发生什么呢 av databasanslutning 2? Resultaten är följande:
Stäng databasanslutning 1, och sedan utförs databasanslutning 2 igen:
Vi fann att efter att ha stängt databasanslutning 1 kan databasanslutning 2 inte hitta den globala temporära tabellen ##Temp了. Detta beror på att efter att databasanslutning 1 stängts finns det inget uttalande i databasanslutning 2 som använder den temporära tabellen ##Temp, så sqlservern tror att det inte finns någon databasanslutning som refererar till den globala temporära tabellen ##Temp了 just nu, så den kommer att ##Temp释放掉了.
Därefter försöker vi stänga den globala temptabellen ##Temp持有事务中的排他锁 (X-lock) i databasanslutning 2 och sedan stänga databasanslutning 1.
Databasanslutning 1:
Databasanslutning 2:
Stäng databasanslutning 1, och sedan körs databasanslutning 2:
Resultatet visar att även om vi stänger databasanslutning 1, eftersom databasanslutning 2 har hållit den globala temporära tabellen ##Temp的排他锁 (X-låset) i transaktionen, så kommer den temporära tabellen # #Temp并没有随着数据库连接1的关闭而被释放掉, så länge transaktionen som startades i databasanslutning 2 inte rullas tillbaka eller committas, så kommer databasanslutning 2 alltid att innehålla den tillfälliga tabellen ##Temp的排他锁. Vid denna tidpunkt tror Sqlserver att det fortfarande finns en databasanslutning som refererar till den globala temptabell ##Temp, alltså ##Temp不会被释放掉. |
Föregående:TypeScript-egenskapsaccessor (set,get)Nästa:SQL Server-frågor de föregående dagarna av nuvarande systemtid
|