Tables temporaires locales et globales dans SQL Server

156

Quelle est la différence entre les tables temporaires locales et globales dans SQL Server?

Andrew Sullivan
la source
2
Voici quelques résumés de détails à ce sujet, cliquez ici
Jayesh Sorathia
5
Soyez prudent lorsque vous utilisez des variables de table. Si vous les utilisez dans une requête, ils peuvent entraîner de graves problèmes de performances avec votre plan de requête car ils ne sont pas indexés.
En fait, les tables temporaires peuvent être indexées, si nécessaire, mais cela prend également du temps et des ressources, donc cela peut toujours entraîner des problèmes de performances ou de ressources.
Andrew Steitz

Réponses:

114

Je trouve cette explication assez claire (c'est une copie pure de Technet ):

Il existe deux types de tables temporaires: locales et globales. Les tables temporaires locales ne sont visibles que pour leurs créateurs lors de la même connexion à une instance de SQL Server que lors de la création ou du référencement des tables. Les tables temporaires locales sont supprimées une fois que l'utilisateur se déconnecte de l'instance de SQL Server. Les tables temporaires globales sont visibles pour tous les utilisateurs et toutes les connexions après leur création, et sont supprimées lorsque tous les utilisateurs référençant la table se déconnectent de l'instance de SQL Server.

Don
la source
Excellente réponse utile! Je cherchais des informations spécifiques sur si / quand les tables temporaires globales étaient automatiquement nettoyées par SQL Server.
kwill
Réponse très claire et concise. Quelqu'un peut-il penser à un bon cas d'utilisation des tables temporaires globales? Un qui illustre leur but en contraste avec le but des tables temporaires locales?
Trevor
336
  • Les variables de table ( DECLARE @t TABLE) ne sont visibles que pour la connexion qui la crée et sont supprimées à la fin du lot ou de la procédure stockée.

  • Les tables temporaires locales ( CREATE TABLE #t) ne sont visibles que par la connexion qui les crée et sont supprimées lorsque la connexion est fermée.

  • Les tables temporaires globales ( CREATE TABLE ##t) sont visibles de tous et sont supprimées lorsque toutes les connexions qui les ont référencées sont fermées.

  • Les tables permanentes Tempdb ( USE tempdb CREATE TABLE t) sont visibles de tous et sont supprimées au redémarrage du serveur.

Anthony Faull
la source
55
À noter également: les tables temporaires locales sont supprimées lorsque l'étendue qui les a créées est fermée. Donc, si vous créez une table temporaire locale à l'intérieur d'un sproc, puis essayez d'y accéder en dehors de ce sproc, elle n'existera pas.
+1 pour Will. J'essayais d'utiliser une table temporaire locale comme optimiseur et j'essayais d'utiliser une procédure stockée comme un initialiseur "créer et peupler si elle n'existe pas". Comme vous le dites, cela ne fonctionne que si vous utilisez une table temporaire globale à la place.
quillbreaker
9
"sont supprimés lorsque toutes les connexions qui les ont référencées sont fermées" - que signifie exactement "qui les ont référencées"? Si un StoredProc à partir d'une connexion n ° 1 crée un TempTable ##, puis-je le voir à partir d'une autre connexion n ° 2, disons 10 minutes plus tard (si cette connexion n ° 2 était active au moment de la création de la table?) RÉPONSE: Les tables temporaires globales sont automatiquement supprimées lorsque le session qui a créé la table se termine et toutes les autres tâches ont cessé de les référencer. (voir plus sur cette page dans une réponse différente)
tbone
J'ai essayé d'utiliser une procédure stockée pour créer des tables temporaires locales (#t) nécessaires à la logique ultérieure, mais il s'est avéré que la procédure stockée parente devait les créer pour qu'elles soient disponibles pour les appels de procédure stockée enfants. C'était une chose triste, car nous avons un tas de procédures stockées qui doivent configurer les tables de la même manière et appeler des sprocs courants. Les tables temporaires globales fonctionneront-elles dans ce cas où les appels enfants auront accès aux tables créées par un frère? Nous utilisons SQL Server 2008.
Brandon
1
@Brandon Vous avez tout à fait raison. C'est une fonctionnalité manquante. La prise en charge par TSQL de la bonne portée des données transitoires est assez sommaire. C'est comme si les concepteurs de langage voulaient que tout soit mondial. Et il n'y a presque pas de support pour les fermetures. Vous pouvez passer une variable de curseur. Mais c'est une autre boîte de vers parce que ligne par ligne angoissante n'est pas possible.
Anthony Faull
12

1.) Une table temporaire locale n'existe que pendant la durée d'une connexion ou, si elle est définie dans une instruction composée, pendant la durée de l'instruction composée.

Les tables temporaires locales sont uniquement disponibles pour la session ou la connexion SQL Server (signifie un seul utilisateur) qui a créé les tables. Ceux-ci sont automatiquement supprimés lorsque la session qui a créé les tables est fermée. Le nom de la table temporaire locale est marqué d'un signe de hachage unique ("#").

CREATE TABLE #LocalTemp
(
 UserID int,
 Name varchar(50), 
 Address varchar(150)
)
GO
insert into #LocalTemp values ( 1, 'Name','Address');
GO
Select * from #LocalTemp

La portée de la table temporaire locale existe pour la session actuelle des moyens de l'utilisateur actuel vers la fenêtre de requête actuelle. Si vous fermez la fenêtre de requête en cours ou ouvrez une nouvelle fenêtre de requête et essayez de trouver la table temporaire créée ci-dessus, cela vous donnera l'erreur.


2.) Une table temporaire globale reste en permanence dans la base de données, mais les lignes n'existent que dans une connexion donnée. Lorsque la connexion est fermée, les données de la table temporaire globale disparaissent. Cependant, la définition de la table reste avec la base de données pour l'accès lors de la prochaine ouverture de la base de données.

Les tables temporaires globales sont disponibles pour toutes les sessions ou connexions SQL Server (signifie tous les utilisateurs). Ceux-ci peuvent être créés par n'importe quel utilisateur de connexion SQL Server et ils sont automatiquement supprimés lorsque toutes les connexions SQL Server ont été fermées. Le nom de la table temporaire globale est marqué d'un double signe de hachage ("##").

CREATE TABLE ##GlobalTemp
(
 UserID int,
 Name varchar(50), 
 Address varchar(150)
)
GO
insert into ##GlobalTemp values ( 1, 'Name','Address');
GO
Select * from ##GlobalTemp

Les tables temporaires globales sont visibles pour toutes les connexions SQL Server tandis que les tables temporaires locales ne sont visibles que pour la connexion SQL Server actuelle.

Vivek S.
la source
2
Votre définition d'une table temporaire globale est la façon dont je m'attendrais à ce qu'elle se comporte (provenant d'autres bases de données), mais mes tests montrent que ce qui se passe réellement dans SQL Server est: "Les tables temporaires globales sont automatiquement supprimées lorsque la session qui a créé la table se termine et toutes les autres tâches ont cessé de les référencer "
Nickolay
11

Citant des livres en ligne:

Les tables temporaires locales ne sont visibles que dans la session en cours; les tables temporaires globales sont visibles par toutes les sessions.

Les tables temporaires sont automatiquement supprimées lorsqu'elles sont hors de portée, sauf si elles sont explicitement supprimées à l'aide de DROP TABLE:

  • Une table temporaire locale créée dans une procédure stockée est supprimée automatiquement une fois la procédure stockée terminée. La table peut être référencée par toutes les procédures stockées imbriquées exécutées par la procédure stockée qui a créé la table. La table ne peut pas être référencée par le processus qui a appelé la procédure stockée qui a créé la table.
  • Toutes les autres tables temporaires locales sont supprimées automatiquement à la fin de la session en cours.
  • Les tables temporaires globales sont automatiquement supprimées lorsque la session qui a créé la table se termine et que toutes les autres tâches ont cessé de les référencer. L'association entre une tâche et une table n'est conservée que pour la durée de vie d'une seule instruction Transact-SQL. Cela signifie qu'une table temporaire globale est supprimée à la fin de la dernière instruction Transact-SQL qui référençait activement la table à la fin de la session de création.
Christian Hayter
la source
0

Tables temporaires locales : si vous créez des tables temporaires locales, puis ouvrez une autre connexion et essayez la requête, vous obtiendrez l'erreur suivante.

les tables temporaires ne sont accessibles que dans la session qui les a créées.

Tables temporaires globales : Parfois, vous souhaiterez peut-être créer une table temporaire accessible à d'autres connexions. Dans ce cas, vous pouvez utiliser des tables temporaires globales.

Les tables temporaires globales ne sont détruites que lorsque toutes les sessions qui y font référence sont fermées.

Reza Jenabi
la source
0

Il convient de mentionner qu'il existe également: des tables temporaires globales à portée de base de données (actuellement prises en charge uniquement par Azure SQL Database).

Les tables temporaires globales pour SQL Server (initiées avec le nom de table ##) sont stockées dans tempdb et partagées entre les sessions de tous les utilisateurs sur l'ensemble de l'instance SQL Server.

Azure SQL Database prend en charge les tables temporaires globales qui sont également stockées dans tempdb et étendues au niveau de la base de données. Cela signifie que les tables temporaires globales sont partagées pour toutes les sessions des utilisateurs au sein de la même Azure SQL Database. Les sessions utilisateur d'autres bases de données ne peuvent pas accéder aux tables temporaires globales.

-- Session A creates a global temp table ##test in Azure SQL Database testdb1
-- and adds 1 row
CREATE TABLE ##test ( a int, b int);
INSERT INTO ##test values (1,1);

-- Session B connects to Azure SQL Database testdb1 
-- and can access table ##test created by session A
SELECT * FROM ##test
---Results
1,1

-- Session C connects to another database in Azure SQL Database testdb2 
-- and wants to access ##test created in testdb1.
-- This select fails due to the database scope for the global temp tables 
SELECT * FROM ##test
---Results
Msg 208, Level 16, State 0, Line 1
Invalid object name '##test'

ALTER DATABASE SCOPED CONFIGURATION

GLOBAL_TEMPORARY_TABLE_AUTODROP = { ON | OFF }

S'APPLIQUE À: Azure SQL Database (la fonctionnalité est en préversion publique)

Permet de définir la fonctionnalité de suppression automatique pour les tables temporaires globales. La valeur par défaut est ON, ce qui signifie que les tables temporaires globales sont automatiquement supprimées lorsqu'elles ne sont utilisées par aucune session. Lorsqu'elle est définie sur OFF, les tables temporaires globales doivent être explicitement supprimées à l'aide d'une instruction DROP TABLE ou seront automatiquement supprimées au redémarrage du serveur.

Avec les bases de données uniques et les pools élastiques Azure SQL Database, cette option peut être définie dans les bases de données utilisateur individuelles du serveur SQL Database. Dans l'instance gérée SQL Server et Azure SQL Database, cette option est définie dans TempDB et le paramètre des bases de données utilisateur individuelles n'a aucun effet.

Lukasz Szozda
la source
0

Je n'ai vu aucune réponse montrer aux utilisateurs où nous pouvons trouver une table de température globale. Vous pouvez afficher les tables temporaires locales et globales au même emplacement lors de la navigation dans SSMS. Capture d'écran ci-dessous tirée de ce lien .

Bases de données -> Bases de données système -> tempdb -> Tables temporaires

entrez la description de l'image ici

Code Novice
la source