Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jaka jest różnica między tabelą tymczasową a zmienną tabeli w programie SQL Server?

Istnieje kilka różnic między tabelami tymczasowymi (#tmp) a zmiennymi tabel (@tmp), chociaż korzystanie z tempdb nie jest jedną z nich, jak opisano w linku MSDN poniżej.

Z reguły w przypadku małych i średnich ilości danych oraz prostych scenariuszy użycia należy używać zmiennych tabeli. (Jest to zbyt ogólna wytyczna z oczywiście wieloma wyjątkami - patrz poniżej i kolejne artykuły).

Kilka punktów do rozważenia przy wyborze między nimi:

  • Tabele tymczasowe są prawdziwymi tabelami, więc możesz robić takie rzeczy, jak TWORZENIE INDEKSÓW itp. Jeśli masz duże ilości danych, do których dostęp za pomocą indeksu będzie szybszy, dobrym rozwiązaniem są tabele tymczasowe.

  • Zmienne tabel mogą mieć indeksy przy użyciu ograniczeń PRIMARY KEY lub UNIQUE. (Jeśli chcesz, aby indeks nieunikatowy, po prostu uwzględnij kolumnę klucza podstawowego jako ostatnią kolumnę w ograniczeniu przez unikalność. Jeśli nie masz kolumny unikatowej, możesz użyć kolumny tożsamości.) SQL 2014 ma również indeksy nieunikalne .

  • Zmienne tabeli nie biorą udziału w transakcjach i SELECT s są niejawnie z NOLOCK . Zachowanie transakcji może być bardzo pomocne, na przykład, jeśli chcesz WYCOFAĆ w połowie procedury, zmienne tabeli wypełnione podczas tej transakcji będą nadal wypełnione!

  • Tabele tymczasowe mogą powodować ponowną kompilację procedur przechowywanych, być może często. Zmienne tabeli nie będą.

  • Możesz utworzyć tabelę tymczasową za pomocą SELECT INTO, która może być szybsza do napisania (dobre do zapytań ad-hoc) i może pozwolić ci radzić sobie ze zmieniającymi się typami danych w czasie, ponieważ nie musisz z góry definiować struktury tabeli tymczasowej.

  • Możesz przekazać zmienne tabeli z powrotem z funkcji, co znacznie ułatwia hermetyzację i ponowne użycie logiki (np. utworzenie funkcji, która podzieli ciąg na tabelę wartości według jakiegoś arbitralnego ogranicznika).

  • Korzystanie ze zmiennych tabelowych w funkcjach zdefiniowanych przez użytkownika umożliwia szersze wykorzystanie tych funkcji (szczegóły można znaleźć w dokumentacji CREATE FUNCTION). Jeśli piszesz funkcję, powinieneś używać zmiennych tabeli zamiast tabel tymczasowych, chyba że istnieje nieodparta potrzeba inaczej.

  • Zarówno zmienne tabel, jak i tabele tymczasowe są przechowywane w tempdb. Jednak zmienne tabel (od 2005 r.) domyślnie stosują sortowanie bieżącej bazy danych w porównaniu z tabelami tymczasowymi, które przyjmują domyślne sortowanie tempdb (ref). Oznacza to, że powinieneś być świadomy problemów z porównywaniem, jeśli używasz tabel tymczasowych, a porównywanie bazy danych różni się od tempdb, co powoduje problemy, jeśli chcesz porównać dane w tabeli tymczasowej z danymi w bazie danych.

  • Globalne tabele temp (##tmp) to inny typ tabeli temp, dostępnej dla wszystkich sesji i użytkowników.

Trochę dalszej lektury:

  • Świetna odpowiedź Martina Smitha na dba.stackexchange.com

  • MSDN FAQ na temat różnic między nimi:https://support.microsoft.com/en-gb/kb/305977

  • Artykuł na blogu MDSN:https://docs.microsoft.com/archive/blogs/sqlserverstorageengine/tempdb-table-variable-vs-local-temporary-table

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

  • Nieoczekiwane zachowania i wpływ na wydajność tabel tymczasowych i zmiennych tymczasowych:Paul White na SQLblog.com



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server Management Studio (SSMS)

  2. SQL Server 2005 Jak stworzyć unikalne ograniczenie?

  3. Usunąć pojedynczy rekord z Entity Framework?

  4. Czy jest jakaś różnica między IS NULL a =NULL?

  5. Jak przedefiniować kolumny zwracane przez procedurę składowaną w SQL Server