Tabele tymczasowe (Temporary Tables) i zmienne tabelowe (Table Variables) to różne mechanizmy przechowywania danych pośrednich podczas wykonywania zapytania lub procedury.
Tabele tymczasowe (na przykład #TempTable w MS SQL):
Zmienne tabelowe (na przykład @MyTable):
Przykład:
-- Tabela tymczasowa CREATE TABLE #Temp( Id INT, Name NVARCHAR(100) ); INSERT INTO #Temp VALUES (1, 'Test'); SELECT * FROM #Temp; -- Zmienna tabelowa DECLARE @MyTable TABLE (Id INT, Name NVARCHAR(100)); INSERT INTO @MyTable VALUES (2, 'Sample'); SELECT * FROM @MyTable;
Jak różni się czas życia i zasięg widoczności tabeli tymczasowej #TempTable i globalnej tabeli tymczasowej ##GlobalTempTable?
Poprawna odpowiedź:
#TempTable jest widoczna tylko w bieżącej sesji, jest usuwana po zamknięciu połączenia lub explicit DROP.##GlobalTempTable jest dostępna dla wszystkich sesji do zamknięcia ostatniej sesji, która używała tabeli, albo explicit DROP. Znika dopiero po zamknięciu ostatniego połączenia, które jej używa.-- Globalna tabela tymczasowa CREATE TABLE ##GlobalTemp (Id INT);
Historia
W projekcie do przetwarzania dużych raportów używano zmiennej tabelowej do tymczasowego przechowywania setek tysięcy wierszy. Efekt: nagły spadek wydajności, ponieważ optymalizator przecenił koszty zapytań i zaczął używać złych planów. Zmiana na tabelę tymczasową w tempdb przyniosła znaczący wzrost wydajności.
Historia
W jednej procedurze zapomniano jawnie usunąć tabelę tymczasową. Przy powtarzających się uruchomieniach paczek w jednej sesji pojawiały się błędy: "obiekt już istnieje". Problem zniknął po dodaniu DROP TABLE przed utworzeniem.
Historia
Używano globalnej tabeli tymczasowej do międzyprocesowej interakcji raportów. Nie uwzględniono, że jednoczesne wykonywanie powodowało nieprzewidywalne zachowanie — sesje konkurowały o te same dane. Podjęto decyzję o zastąpieniu tabeli globalnej indywidualnymi tabelami tymczasowymi dla każdej sesji.