sql >> Database teknologi >  >> RDS >> Sqlserver

Hvad er forskellen mellem en midlertidig tabel og tabelvariabel i SQL Server?

Der er nogle få forskelle mellem midlertidige tabeller (#tmp) og tabelvariabler (@tmp), selvom brugen af ​​tempdb ikke er en af ​​dem, som beskrevet i MSDN-linket nedenfor.

Som en tommelfingerregel bør du bruge tabelvariabler til små til mellemstore mængder data og simple brugsscenarier. (Dette er en alt for bred retningslinje med selvfølgelig masser af undtagelser - se nedenfor og følgende artikler.)

Nogle punkter at overveje, når du vælger mellem dem:

  • Midlertidige tabeller er rigtige tabeller, så du kan gøre ting som OPRET INDEKSER osv. Hvis du har store mængder data, som det vil være hurtigere at få adgang til via indeks, er midlertidige tabeller en god mulighed.

  • Tabelvariabler kan have indekser ved at bruge PRIMARY KEY eller UNIQUE begrænsninger. (Hvis du ønsker et ikke-unikt indeks, skal du blot inkludere den primære nøglekolonne som den sidste kolonne i den unikke begrænsning. Hvis du ikke har en unik kolonne, kan du bruge en identitetskolonne.) SQL 2014 har også ikke-unikke indekser .

  • Tabelvariabler deltager ikke i transaktioner og SELECT s er implicit med NOLOCK . Transaktionsadfærden kan være meget nyttig, hvis du for eksempel ønsker at RULLE TILBAGE midtvejs i en procedure, vil tabelvariabler, der er udfyldt under den pågældende transaktion, stadig blive udfyldt!

  • Temp-tabeller kan resultere i, at lagrede procedurer bliver kompileret igen, måske ofte. Tabelvariabler vil ikke.

  • Du kan oprette en midlertidig tabel ved hjælp af SELECT INTO, som kan være hurtigere at skrive (god til ad hoc-forespørgsler) og kan tillade dig at håndtere skiftende datatyper over tid, da du ikke behøver at definere din midlertidige tabelstruktur på forhånd.

  • Du kan sende tabelvariabler tilbage fra funktioner, hvilket gør dig i stand til at indkapsle og genbruge logik meget nemmere (f.eks. lave en funktion til at opdele en streng i en tabel med værdier på en eller anden vilkårlig afgrænser).

  • Brug af tabelvariabler i brugerdefinerede funktioner gør det muligt for disse funktioner at blive brugt mere bredt (se CREATE FUNCTION-dokumentationen for detaljer). Hvis du skriver en funktion, bør du bruge tabelvariable over midlertidige tabeller, medmindre der er et tvingende behov for andet.

  • Både tabelvariabler og temp-tabeller er gemt i tempdb. Men tabelvariabler (siden 2005) er standard til sorteringen af ​​den aktuelle database versus midlertidige tabeller, som tager standardsorteringen af ​​tempdb (ref). Det betyder, at du skal være opmærksom på problemer med sortering, hvis du bruger midlertidige tabeller, og din db-sortering er anderledes end tempdb's, hvilket giver problemer, hvis du vil sammenligne data i midlertidige tabellen med data i din database.

  • Globale Temp-tabeller (##tmp) er en anden type midlertidige tabel, der er tilgængelig for alle sessioner og brugere.

Lidt yderligere læsning:

  • Martin Smiths gode svar på dba.stackexchange.com

  • MSDN FAQ om forskellen mellem de to:https://support.microsoft.com/en-gb/kb/305977

  • MDSN blogartikel:https://docs.microsoft.com/archive/blogs/sqlserverstorageengine/tempdb-table-variable-vs-local-temporary-table

  • Artikel:https://searchsqlserver.techtarget.com/tip/Temporary-tables-in-SQL-Server-vs-table-variables

  • Uventet adfærd og præstationsimplikationer af temp-tabeller og temp-variabler:Paul White på SQLblog.com



  1. Opdater med parameter ved hjælp af rumpersistent bibliotek

  2. SQL Right Join

  3. Er det muligt at sende tabelnavn som en parameter i Oracle?

  4. Match en sætning, der ender på et præfiks, med fuldtekstsøgning