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) :
Variables de table (par exemple, @MyTable) :
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;
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);
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.