ProgrammationDéveloppeur Backend

Quelles sont les particularités des tables temporaires (Temporary Tables) en SQL, comment les utiliser correctement, et quelle est la différence avec les variables de table (Table Variables) ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

Les tables temporaires (Temporary Tables) et les variables de table (Table Variables) sont des mécanismes différents pour stocker des données intermédiaires pendant l'exécution d'une requête ou d'une procédure.

Tables temporaires (par exemple, #TempTable dans MS SQL) :

  • Stockées dans la base de données temporaire tempdb.
  • Visibles dans la session ou la connexion actuelle.
  • Permettent de créer des index, des contraintes, et peuvent faire partie de transactions.
  • Utilisées lors du traitement de grandes quantités de données et de traitements complexes.

Variables de table (par exemple, @MyTable) :

  • Ont une portée au sein d'un batch/procédure/fonction.
  • Souvent optimisées pour de petits ensembles de données.
  • Ne permettent pas la création d'index complets (sauf pour PRIMARY KEY/UNIQUE).
  • Moins susceptibles d'être bloquées et participent aux transactions différemment.

Exemple :

-- Table temporaire CREATE TABLE #Temp( Id INT, Name NVARCHAR(100) ); INSERT INTO #Temp VALUES (1, 'Test'); SELECT * FROM #Temp; -- Variable de table DECLARE @MyTable TABLE (Id INT, Name NVARCHAR(100)); INSERT INTO @MyTable VALUES (2, 'Sample'); SELECT * FROM @MyTable;

Question piège.

Quelle est la différence entre la durée de vie et la portée d'une table temporaire #TempTable et d'une table temporaire globale ##GlobalTempTable ?

Réponse correcte :

  • #TempTable est visible uniquement dans la session actuelle, détruite à la fermeture de la connexion ou par un DROP explicite.
  • ##GlobalTempTable est accessible à toutes les sessions jusqu'à la fermeture de la dernière session ayant utilisé la table, ou par un DROP explicite. Elle disparaît uniquement après la fermeture de la dernière connexion l'utilisant.
-- Table temporaire globale CREATE TABLE ##GlobalTemp (Id INT);

Exemples d'erreurs réelles en raison de méconnaissance des subtilités du sujet.


Histoire

Dans un projet de traitement de grands rapports, une variable de table a été utilisée pour le stockage temporaire de centaines de milliers de lignes. Conclusion : chute brutale des performances, car l'optimiseur a surévalué le coût des requêtes et a commencé à utiliser des plans inappropriés. Le remplacement par une table temporaire dans tempdb a entraîné un gain de temps significatif.


Histoire

Dans une procédure, nous avons oublié de supprimer explicitement la table temporaire. Lors des relances par lots dans une même session, des erreurs sont survenues : "l'objet existe déjà". Le problème a disparu après l'ajout d'un DROP TABLE avant la création.


Histoire

Nous avons utilisé une table temporaire globale pour l'interaction inter-processus des rapports. Nous n'avons pas pris en compte que l'exécution simultanée rendait le comportement imprévisible - les sessions conflictuelles ont tenté d'accéder aux mêmes données. Il a été décidé de remplacer la table globale par des tables temporaires individuelles pour chaque session.