Des tables temporaires dans des procédures stockées
J'ai été de s'interroger sur les tables temporaires en sp et comment tout cela peut avoir un effet de simultanéité.
PS fait sur un MSSQL 08 server.
Si j'ai un PS où je créer une table temporaire et de le déposer à nouveau comme ceci:
BEGIN
CREATE TABLE #MyTempTable
(
someField int,
someFieldMore nvarchar(50)
)
... Use of temp table here
... And then..
DROP TABLE #MyTempTable
END
Cette SP sera appelé très très souvent, donc ma question est, il peut toujours se produire des problèmes de concurrence, ici?
Vous devez vous connecter pour publier un commentaire.
Nope. Des instances indépendantes de la table temporaire sera créé pour chaque connexion.
Peut-être.
Temporaire des tables préfixées avec un # (#exemple) sont conservés sur une base par session. Donc, si votre code appelle la procédure stockée à nouveau lorsqu'un autre appel est en cours d'exécution (par exemple threads d'arrière-plan), puis de créer la va échouer, car il est déjà là.
Si vous êtes vraiment inquiet utiliser une variable de table au lieu
Ce sera spécifique à la "instance" de l'appel de procédure stockée.
declare @temp table ...
, dois-je encore appelerdrop @temp
avant de sortir?Table variables are dropped automatically, you dont need to do it explicitly
.Pas vraiment et je parle de SQL Server. La table temporaire (avec un seul #) existe et est visible dans la portée, il est créé (champ lié). Chaque fois que vous appelez votre procédure stockée, il crée un nouveau champ d'application et, par conséquent, que la table temporaire n'existe que dans cette portée. Je crois que les tables temporaires sont également visibles pour les procédures stockées et les fonctions définies par l'utilisateur qui sont appelés à l'intérieur de ce champ d'application. Si vous utilisez le double dièse (##) puis ils deviennent mondiale au sein de votre session et donc visible à d'autres l'exécution de processus dans le cadre de la session que la table temporaire est créée et vous aurez à penser si la possibilité de temp table à accéder simultanément est souhaitable ou pas.
Pour tous ceux qui recommandent d'utiliser les variables de table, être prudent de le faire. Table de variable ne peut pas être indexé, alors qu'une table temporaire peut être. Une variable de table est meilleur lorsque l'on travaille avec de petites quantités de données, mais si vous travaillez sur de gros ensembles de données (par exemple, 50 dossiers) d'une table temporaire sera beaucoup plus rapide qu'une variable de table.
Également garder à l'esprit que vous ne pouvez pas compter sur un try/catch pour forcer un nettoyage de l'intérieur de la procédure stockée. certains types de défaillances ne peuvent pas être capturés dans un try/catch (par exemple, compiler les pannes dues à un retard de la résolution de nom) si vous voulez être vraiment sûr que vous pouvez avoir besoin de créer un wrapper procédure stockée qui peut faire un try/catch pour le travailleur de la procédure stockée et faire le nettoyage de là.
par exemple
créer proc travailleur
COMMENCER
-- faire quelque chose ici
FIN
En fonction de SQL Server 2008
Vous pouvez créer des tables temporaires locales et globales. Les tables temporaires sont visibles uniquement dans la session en cours, et les tables temporaires globales sont visibles à toutes les sessions.
'#table_temporal
'##table_global
Si une table temporaire locale est créée dans une procédure stockée ou une application qui peut être exécutée en même temps par plusieurs utilisateurs, le Moteur de Base de données doit être capable de distinguer les tableaux créés par les différents utilisateurs. Le Moteur de Base de données fait en interne ajoutant un suffixe numérique pour chaque nom de table temporaire locale.
Puis il se produit, pas de problème.
La base de données utilise le même verrou pour tous #temp tables donc, si vous utilisez beaucoup de choses, vous obtiendrez tous les problèmes de deadlock. Il est préférable d'utiliser @ table de variables pour la concurrence.
Utiliser @temp tables de chaque fois que possible, qui est, vous avez seulement besoin d'une clé primaire et que vous n'avez pas besoin d'accéder aux données à partir d'un subordonné stockées proc.
Utilisation #de tables temporaires si vous avez besoin d'accéder aux données à partir d'un subordonné stockées proc (c'est un mal, une variable globale pour le traitement des stockée chaîne d'appel) et vous n'avez pas d'autre moyen propre pour transmettre les données entre stockées procs. Aussi l'utiliser si vous avez besoin d'un index secondaire (bien que, posez-vous vraiment si c'est une table #temp si vous avez besoin de plus d'un index)
Si vous faites cela, toujours déclarer votre table #temp en haut de la fonction. SQL force une recompilation de votre procédure stockée lorsqu'il voit l'instruction create table....donc, si vous avez le n ° de la table temporaire de déclaration au moyen de la procédure stockée, vous avez stocké proc doit arrêter le traitement et de recompiler.