IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

SP - tables temporaires - accès concurrents


Sujet :

MS SQL Server

  1. #1
    Membre éclairé Avatar de stephane.julien
    Inscrit en
    Septembre 2007
    Messages
    342
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Septembre 2007
    Messages : 342
    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 !

  2. #2
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    Bonjour,

    non, si elle est préfixée par un simple #, elle est locale à la session.

  3. #3
    Membre éclairé Avatar de stephane.julien
    Inscrit en
    Septembre 2007
    Messages
    342
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Septembre 2007
    Messages : 342
    Par défaut
    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 !

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 827
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    Membre éclairé Avatar de stephane.julien
    Inscrit en
    Septembre 2007
    Messages
    342
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Septembre 2007
    Messages : 342
    Par défaut
    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 !

  6. #6
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    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.

  7. #7
    Membre éclairé Avatar de stephane.julien
    Inscrit en
    Septembre 2007
    Messages
    342
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Septembre 2007
    Messages : 342
    Par défaut
    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...

  8. #8
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    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.

  9. #9
    Membre éclairé Avatar de stephane.julien
    Inscrit en
    Septembre 2007
    Messages
    342
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Septembre 2007
    Messages : 342
    Par défaut
    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?

  10. #10
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Accès concurrents et tables liées
    Par Tchebichef dans le forum Sécurité
    Réponses: 7
    Dernier message: 20/09/2012, 08h41
  2. accès concurrents entre 2 services distincts sur une même table
    Par grinder59 dans le forum Développement
    Réponses: 3
    Dernier message: 26/08/2011, 12h57
  3. Accès à une table temporaire dans du code C#
    Par justinedr71 dans le forum Développement
    Réponses: 8
    Dernier message: 19/07/2010, 17h27
  4. Gestion des accès concurrents à une table
    Par kodo dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 20/06/2006, 14h05
  5. accés concurrent à une table
    Par shout dans le forum Oracle
    Réponses: 5
    Dernier message: 06/10/2005, 10h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo