163 votes

Tables temporaires locales et globales dans SQL Server

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

2 votes

Voici quelques résumés détaillés sur ce sujet, Cliquez ici

5 votes

Soyez prudent lorsque vous utilisez des variables de tableau. Si vous les utilisez dans une requête, elles peuvent entraîner de sérieux problèmes de performance dans votre plan de requête, car elles ne sont pas indexées.

0 votes

En fait, les tables temporaires peuvent être indexées, si nécessaire, mais cela prend du temps et des ressources, aussi, et cela peut toujours causer des problèmes de performance ou de ressources.

354voto

Anthony Faull Points 6490
  • Variables du tableau ( DECLARE @t TABLE ) ne sont visibles que pour la connexion qui les crée, et sont supprimés lorsque le lot ou la procédure stockée se termine.

  • Tables temporaires locales ( CREATE TABLE #t ) ne sont visibles que pour le qui le crée, et sont supprimés lorsque la connexion est fermée.

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

  • Tables permanentes Tempdb ( USE tempdb CREATE TABLE t ) sont visibles pour tout le monde, et sont supprimés lorsque le serveur est redémarré.

59 votes

A signaler également : Les tables temporaires locales sont supprimées lorsque la portée qui les a créées est fermée. Ainsi, si vous créez une table temporaire locale à l'intérieur d'un sproc, et que vous essayez ensuite d'y accéder en dehors de ce sproc, elle n'existera pas.

0 votes

+1 pour Will. J'essayais d'utiliser une table temporaire locale comme optimiseur et j'essayais d'utiliser une procédure stockée comme initialisateur "créer et remplir s'il n'existe pas". Comme vous le dites, cela ne fonctionne pas à moins d'utiliser une table temporaire globale à la place.

9 votes

"sont supprimées 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 d'une connexion#1 crée une ##TempTable, puis-je la voir à partir d'une autre connexion#2, disons 10 minutes plus tard (si cette connexion#2 était active au moment de la création de la table) ? RÉPONSE : Les tables temporaires globales sont automatiquement abandonné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. (voir plus sur cette page dans une autre réponse)

118voto

Don Points 3351

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

Il existe deux types de tables temporaires : locales et globales. Les tables temporaires locales ne sont visibles que par leurs créateurs pendant la même connexion à une instance de SQL Server que lorsque les tables ont été créées ou référencées pour la première fois. Les tables temporaires locales sont supprimées après que l'utilisateur se déconnecte de l'instance de SQL Server. Les tables temporaires globales sont visibles par tous les utilisateurs et toutes les connexions après leur création, et sont supprimées lorsque tous les utilisateurs qui font référence à la table se déconnectent de l'instance de SQL Server.

0 votes

Excellente réponse, très utile ! Je cherchais des informations spécifiques pour savoir si/quand les tables temporaires globales étaient automatiquement nettoyées par SQL Server.

0 votes

Réponse très claire et concise. Quelqu'un peut-il penser à un bon cas d'utilisation des tables temporaires globales ? Un cas qui illustre leur utilité par rapport à l'utilité des tables temporaires locales ?

13voto

Vivek S. Points 10835

1.) Un local temporaire n'existe que pour la durée d'une connexion ou, si elle est définie à l'intérieur d'une instruction composée, pour la durée de l'instruction composée.

Les tables temporelles locales ne sont accessibles qu'à la session SQL Server ou à l'utilisateur. connexion SQL Server (c'est-à-dire un seul utilisateur) qui a créé les tables. Elles sont automatiquement supprimées lorsque la session qui a créé les tables a été été fermée. Le nom de la table temporaire locale est précédé d'un seul signe dièse ("#").

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 Local temp existe pour la session actuelle de l'utilisateur actuel. l'utilisateur actuel signifie à la fenêtre de requête actuelle. Si vous fermez la fenêtre de actuelle ou ouvrez une nouvelle fenêtre de requête et essayez de trouver la table temporaire créé ci-dessus, vous obtiendrez une erreur.


2.) Un temporaire global reste dans la base de données de façon permanente, mais les rangées 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 dans la base de données pour être accessible lors de la prochaine ouverture de la base de données.

Les tables temporelles globales sont disponibles pour toutes les sessions ou connexions connexions (c'est-à-dire tous les utilisateurs). Elles peuvent être créées par n'importe quel utilisateur de connexion SQL SQL Server et elles sont automatiquement supprimées lorsque toutes les connexions les connexions au serveur SQL ont été fermées. Table temporaire globale Le nom de la table temporaire globale est précédé du double signe dièse ("##").

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 par toutes les connexions SQL Server tandis que les tables temporaires locales ne sont visibles que par la connexion SQL Server actuelle.

3 votes

Votre définition d'une table temporaire globale est la manière dont je m'attendrais à ce qu'elle se comporte (venant d'autres bases de données), mais mes tests montrent que ce qui se passe réellement dans SQL Server : "Les tables temporaires globales sont automatiquement abandonné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".

12voto

Christian Hayter Points 17999

Citation de 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 abandonnées lorsqu'elles sont hors de portée, à moins qu'elles ne soient explicitement abandonnées à l'aide de DROP TABLE :

  • Une table temporaire locale créée dans une procédure stockée est abandonnée automatiquement lorsque la procédure stockée se termine. 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 abandonnées automatiquement à la fin de la session en cours.
  • Les tables temporaires globales sont automatiquement abandonné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 maintenue que pendant la durée de vie d'une seule instruction Transact-SQL. Cela signifie qu'une table temporaire globale est abandonnée à la fin de la dernière instruction Transact-SQL qui faisait activement référence à la table lorsque la session de création s'est terminée.

3voto

Code Novice Points 397

Je n'ai pas vu de réponses qui montrent aux utilisateurs où l'on peut trouver un tableau Global Temp. Vous pouvez voir les tables temporaires locales et globales au même endroit lorsque vous naviguez dans SSMS. La capture d'écran ci-dessous provient de ce lien .

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

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X