Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/09/2008, 15h04   #1
Membre régulier
 
Avatar de stephane.julien
 
Inscription : septembre 2007
Messages : 339
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : septembre 2007
Messages : 339
Points : 92
Points : 92
Par défaut SP - tables temporaires - accès concurrents

Bonjour,

J'ai une procédure stockée à laquelle je passe un VARCHAR(MAX) contenant une liste d'Id séparés par des virgules. Pour les traiter, je créé une table temporaire au sein de ma SP qui contient une seule colonne. Je remplis ensuite ma table en parcourant mon VARCHAR(MAX). Je peux ensuite aisément utiliser ma table temporaire avec des INNER JOIN.

Cette méthode fonctionne bien, seulement je me pose la question de son comportement si il y a des accès concurrents à ma procédure stockée. Est-ce que la table temporaire d'une SP sera visible depuis une autre SP?

Merci d'avance de vos réponses !
stephane.julien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2008, 15h09   #2
Expert Confirmé
 
Avatar de rudib
 
Inscription : mai 2006
Messages : 2 236
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2006
Messages : 2 236
Points : 2 983
Points : 2 983
Envoyer un message via ICQ à rudib Envoyer un message via MSN à rudib
Bonjour,

non, si elle est préfixée par un simple #, elle est locale à la session.
__________________
Rudi Bruchez
Consultant indépendant
modélisation, administration, optimisation, formation,
solutions MS SQL Server et informatique libre.
MCDBA, MCITP, MCT, SCJP2 - http://www.babaluga.com/
Articles et tutoriels : http://rudi.developpez.com/
LIVRE : Optimiser SQL Server
rudib est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2008, 15h12   #3
Membre régulier
 
Avatar de stephane.julien
 
Inscription : septembre 2007
Messages : 339
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : septembre 2007
Messages : 339
Points : 92
Points : 92
Parfait merci ! Je préfixait effectivement le nom de ma table avec # mais sans en savoir l'effet. Je pensais que c'était une simple question de convention syntaxique.

Merci bcp !
stephane.julien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2008, 18h59   #4
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 697
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 697
Points : 8 819
Points : 8 819
Bonsoir,

Les # tables vous demanderont de la ressource sur TempDB, ce qui n'est jamais très bon : en effet ces tables sont stockées dans TempDB.
Pourquoi ne pas utiliser une expression de table commune pour découper votre chaîne et faire votre jointure dans la même commande ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
DECLARE @str VARCHAR(64)
SET @str = 'toto,titi,tutu,tata,gringo,elsuket';
 
WITH CTE (Deb, Fin) AS
(
  SELECT 1 Deb, CHARINDEX(',', @str + ',') Fin
 UNION ALL
  SELECT Fin + 1, CHARINDEX(',', @str + ',', Fin + 1)
  FROM CTE
  WHERE CHARINDEX( ',', @str + ',', Fin + 1 ) > 0
)
SELECT SUBSTRING(@str, Deb , Fin - Deb), Deb, Fin
FROM CTE
après la clause FROM précédente, vous pouvez tout à fait écrire une jointure
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2008, 08h33   #5
Membre régulier
 
Avatar de stephane.julien
 
Inscription : septembre 2007
Messages : 339
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : septembre 2007
Messages : 339
Points : 92
Points : 92
Bonjour,

Je ne comprends pas bien le code SQL d'exemple et le principe. Est-ce qu'il consiste à utiliser une table permanente commune ou c'est un système autre qu'une table standard SQL?

Merci de ces précisions !
stephane.julien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2008, 09h25   #6
Expert Confirmé
 
Avatar de rudib
 
Inscription : mai 2006
Messages : 2 236
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2006
Messages : 2 236
Points : 2 983
Points : 2 983
Envoyer un message via ICQ à rudib Envoyer un message via MSN à rudib
L'expression de table ne peut être utilisée que dans l'instruction qui la suit. Elle est utile pour faire une requête récursive.
http://sqlpro.developpez.com/cours/s...te-recursives/

Souvent, elle entraîne la création d'un fichier temporaire... qui sera lui aussi stocké dans tempdb.

Utilise en effet les tables temporaires avec parcimonie, si tu peux les éviter.
__________________
Rudi Bruchez
Consultant indépendant
modélisation, administration, optimisation, formation,
solutions MS SQL Server et informatique libre.
MCDBA, MCITP, MCT, SCJP2 - http://www.babaluga.com/
Articles et tutoriels : http://rudi.developpez.com/
LIVRE : Optimiser SQL Server
rudib est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2008, 09h53   #7
Membre régulier
 
Avatar de stephane.julien
 
Inscription : septembre 2007
Messages : 339
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : septembre 2007
Messages : 339
Points : 92
Points : 92
Ok donc en résumé, je ne vais pas gagner de vitesse avec la méthode proposée par elsuket. Je suis bien d'accord que je dois utiliser les TempDB avec parcimonie, mais je n'ai pas vraiment le choix dans le cas ou je veux passer un tableau à ma procédure stockée :

Voir cette discussion

A moins que je passe à côté de quelque chose...
stephane.julien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2008, 10h06   #8
Expert Confirmé
 
Avatar de rudib
 
Inscription : mai 2006
Messages : 2 236
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2006
Messages : 2 236
Points : 2 983
Points : 2 983
Envoyer un message via ICQ à rudib Envoyer un message via MSN à rudib
Tu peux créer une fonction utilisateur, qui va retourner une variable de type table, ou utiliser une variable de type table directement. C'est un poil plus léger que la table temporaire, mais si elle est volumineuse, elle sera aussi écrite dans tempdb.
__________________
Rudi Bruchez
Consultant indépendant
modélisation, administration, optimisation, formation,
solutions MS SQL Server et informatique libre.
MCDBA, MCITP, MCT, SCJP2 - http://www.babaluga.com/
Articles et tutoriels : http://rudi.developpez.com/
LIVRE : Optimiser SQL Server
rudib est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2008, 10h49   #9
Membre régulier
 
Avatar de stephane.julien
 
Inscription : septembre 2007
Messages : 339
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : septembre 2007
Messages : 339
Points : 92
Points : 92
Le problème, c'est que je peux pas mettre de variable de type TABLE en paramètre de procédure stockée. Donc un moment donné, je suis obligé de parcourir mon VARCHAR(MAX) pour le mettre dans une variable TABLE...

Par contre, tu penses que j'ai meilleur temps de mettre le résultat du parcours du VARCHAR dans une variable de type TABLE que dans une table temporaire? Si oui, je vais jeter un oeil... As-tu un Benchmark ou quelque chose qui démontre cela?
stephane.julien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2008, 11h28   #10
Expert Confirmé
 
Avatar de rudib
 
Inscription : mai 2006
Messages : 2 236
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2006
Messages : 2 236
Points : 2 983
Points : 2 983
Envoyer un message via ICQ à rudib Envoyer un message via MSN à rudib
Non, pas de benchmark, c'est une question de logique quand on connaît les différences de stockage.
quand je parle de fonction, je veux dire utiliser dans ta procédure une fonction qui te retourne une table, mais tu peux utiliser la variable table directement. des différences de performance seront minimes.
__________________
Rudi Bruchez
Consultant indépendant
modélisation, administration, optimisation, formation,
solutions MS SQL Server et informatique libre.
MCDBA, MCITP, MCT, SCJP2 - http://www.babaluga.com/
Articles et tutoriels : http://rudi.developpez.com/
LIVRE : Optimiser SQL Server
rudib est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h47.


 
 
 
 
Partenaires

Hébergement Web