|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre régulier
![]() Inscription : septembre 2007 Messages : 339 ![]() |
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 ! |
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() ![]() |
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 |
|
|
00
|
|
|
#3 |
|
Membre régulier
![]() Inscription : septembre 2007 Messages : 339 ![]() |
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 !
|
|
|
00
|
|
|
#4 | ||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 697 ![]() |
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 :
|
||
|
00
|
|
|
#5 |
|
Membre régulier
![]() Inscription : septembre 2007 Messages : 339 ![]() |
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 ! |
|
|
00
|
|
|
#6 |
|
Expert Confirmé
![]() ![]() |
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 |
|
|
00
|
|
|
#7 |
|
Membre régulier
![]() Inscription : septembre 2007 Messages : 339 ![]() |
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... |
|
|
00
|
|
|
#8 |
|
Expert Confirmé
![]() ![]() |
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 |
|
|
00
|
|
|
#9 |
|
Membre régulier
![]() Inscription : septembre 2007 Messages : 339 ![]() |
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? |
|
|
00
|
|
|
#10 |
|
Expert Confirmé
![]() ![]() |
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 |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com