Midlertidige tabeller er meget vigtige i Sqlserver-databasen, og følgende er en detaljeret introduktion til karakteristika og brug af midlertidige tabeller i SQL-databaser, kun til reference.
Midlertidige tabeller ligner persistente tabeller, men midlertidige tabeller gemmes i tempdb og slettes automatisk, når de ikke længere er i brug. Der findes to typer midlertidige tabeller: lokale og globale. De kendes ved navn, synlighed og tilgængelighed.
Den midlertidige tabel har følgende karakteristika:
- Lokale midlertidige tabeller er tabeller, som brugerne tilføjer "#"-præfikset ved oprettelse af tabeller, og som er uafhængige i forhold til databaseforbindelser. Kun databaseforbindelsen, der oprettede den lokale midlertidige tabel, har adgang til tabellen, og andre forbindelser kan ikke få adgang til tabellen.
- I forskellige databaseforbindelser, selvom de lokale midlertidige tabeller har samme "navn", har disse tabeller ingen relation til hinanden. I SQLSERVER sikrer en særlig navngivningsmekanisme uafhængigheden af lokale midlertidige tabeller i databaseforbindelser.
- Ægte midlertidige tabeller udnytter databasens midlertidige tabelplads, som automatisk vedligeholdes af databasesystemet, og dermed sparer tabelplads. Og fordi det midlertidige tabelområde generelt bruger virtuel hukommelse, reduceres antallet af I/O'er på harddisken betydeligt, så systemets effektivitet forbedres også.
- Den midlertidige tabel tømmes automatisk, når transaktionen eller sessionen er afsluttet, så du behøver ikke huske at slette dataene, når den er løbet tør.
Lokale midlertidige tabeller
Navnet på den lokale midlertidige tabel er præfikseret med et enkelt numerisk symbol (#); De er kun synlige for den nuværende brugerforbindelse (dvs. forbindelsen, der opretter den lokale midlertidige tabel); Den slettes, når en bruger afbryder forbindelsen fra en SQL Server-instans.
For eksempel opretter vi en lokal midlertidig tabel i en databaseforbindelse med følgende sætning: #Temp
Databaseforbindelse 1:
Start derefter databaseforbindelse 2 samtidig for at udføre forespørgslen #temp
Databaseforbindelse 2:
Lad os se, hvad resultatet er af databaseforbindelse 2?
Databaseforbindelse 2:
Resultaterne viser, at databaseforbindelse 2 ikke kan finde tabel #Temp. Det betyder, at den midlertidige tabel #Temp kun er synlig for databaseforbindelse 1, der oprettede den, men ikke for databaseforbindelse 2.
Global midlertidig tabel
Navnet på en global midlertidig tabel er foranstillet med to numeriske symboler (##) og er synligt for alle databaseforbindelser, når det oprettes, og fjernes, når alle databaseforbindelser, der refererer til tabellen, afbrydes fra SQL Server.
For eksempel opretter vi en global midlertidig tabel ##Temp i en databaseforbindelse med følgende sætning, og indsætter derefter tre rækker data
Databaseforbindelse 1:
Derefter forespørger vi ##Temp的数据 i databaseforbindelse 2
Databaseforbindelse 2:
Resultatet for databaseforbindelse 2 er som følger
Databaseforbindelse 2:
Som du kan se, kan databaseforbindelse 2 med succes få adgang til den globale midlertidige tabel #Temp#, som er oprettet af databaseforbindelse 1, men hvis vi lukker dataforbindelse 1 nu og så udfører ##Temp查询语句会发生什么呢 for databaseforbindelse 2? Resultaterne er som følger:
Luk databaseforbindelse 1, og derefter kører databaseforbindelse 2 igen:
Vi fandt, at efter at have lukket databaseforbindelse 1, kan databaseforbindelse 2 ikke finde den globale midlertidige tabel ##Temp了. Dette skyldes, at efter databaseforbindelse 1 er lukket, er der ingen sætning i databaseforbindelse 2, der bruger den midlertidige tabel ##Temp, så sqlserveren tror, at der ikke er nogen databaseforbindelse, der refererer til den globale midlertidige tabel ##Temp了 på nuværende tidspunkt, så den vil ##Temp释放掉了.
Dernæst forsøger vi at lukke den globale temptabel ##Temp持有事务中的排他锁 (X-lock) i databaseforbindelse 2 og derefter lukke databaseforbindelse 1.
Databaseforbindelse 1:
Databaseforbindelse 2:
Luk databaseforbindelse 1, og derefter udføres databaseforbindelse 2:
Resultatet viser, at selvom vi lukker databaseforbindelse 1, fordi databaseforbindelse 2 har holdt den globale midlertidige tabel ##Temp的排他锁 (X-lås) i transaktionen, vil den midlertidige tabel # #Temp并没有随着数据库连接1的关闭而被释放掉, så længe transaktionen startet i databaseforbindelse 2 ikke rulles tilbage eller committes, så vil databaseforbindelse 2 altid indeholde den midlertidige tabel ##Temp的排他锁. På nuværende tidspunkt vil Sqlserver tro, at der stadig er en databaseforbindelse, der refererer til den globale temp-tabel ##Temp, altså ##Temp不会被释放掉. |