programowanieBackend developer

Jakie są cechy tabel tymczasowych (Temporary Tables) w SQL, jak je poprawnie używać i jaka jest różnica między zmiennymi tabelowymi (Table Variables)?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

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):

  • Są przechowywane w tymczasowej bazie danych tempdb.
  • Są widoczne w bieżącej sesji lub połączeniu.
  • Pozwalają na tworzenie indeksów, ograniczeń, mogą być częścią transakcji.
  • Stosowane przy pracy z dużymi zbiorami danych i skomplikowanymi przetwarzaniami.

Zmienne tabelowe (na przykład @MyTable):

  • Mają zasięg widoczności wewnątrz batch/procedury/funkcji.
  • Częściej są optymalizowane dla małych zbiorów danych.
  • Nie można na nich tworzyć pełnowartościowych indeksów (oprócz PRIMARY KEY/UNIQUE).
  • Z mniejszym prawdopodobieństwem są blokowane i biorą udział w transakcjach w inny sposób.

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;

Pytanie z podstępem.

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);

Przykłady rzeczywistych błędów z powodu braku znajomości szczegółów tematu.


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.