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 :

Comment donner des ordres de priorité à mes requêtes ?


Sujet :

MS SQL Server

  1. #1
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    306
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 306
    Points : 71
    Points
    71
    Par défaut Comment donner des ordres de priorité à mes requêtes ?
    Bonjour à tous,

    J'utilise Microsoft SQL Server 2014 Standard Edition (64-bit) sur un serveur.
    J'ai des applications et un intranet qui communiquent avec ce SQL Server.
    Sur une de mes application j'ai un traitement qui est très lourd et dure quelques minutes, hélas pendant ce temps l'intranet est très lent et les timeouts fréquents

    J'aimerais donc donner une importance/priorité plus faible à l'application pour qu'elle laisse plus de ressource à l'intranet.
    J'ai vu qu'il existait un "Gouverneur de ressources" mais hélas indisponible sur la version Standard.

    Existe-il une solution à mon problème ?

    Merci d'avance

  2. #2
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 674
    Points
    674
    Par défaut
    Bonjour,

    Votre probleme est vague il nous manque des éléments mais j'ai déjà néamoins quelques pistes qui vous feront répondre :

    • Le traitement long a t'il été optimisé ? Est il possible de diminuer les ressources accaparé par ce traitement (Nombre d'io / CPU ... )
    • Est il possible de sortir ce traitement sur un autre environnement ?
    • Avez vous identifiés la ou les requetes consommatrices ? Et a quel niveau ?
    • Est il impératif de faire tourner ce traitement en journée ?
    MCSA SQL SERVER |MCT | MVP Data Platform

  3. #3
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    306
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 306
    Points : 71
    Points
    71
    Par défaut
    Merci pour ta réponse.

    Le traitement long a t'il été optimisé ? Est il possible de diminuer les ressources accaparé par ce traitement (Nombre d'io / CPU ... )
    Oui je savais que ce traitement allait être lourd, j'ai donc beaucoup travaillé l'optimisation.
    Qu'entends tu pars nombre d'IO ?

    Est il possible de sortir ce traitement sur un autre environnement ?
    Pas impossible mais difficile, car les données devrons être rapidement à jour d'un environnement à l'autre.

    Avez vous identifiés la ou les requêtes consommatrices ? Et a quel niveau ?
    Oui mais elles sont optimisées et indispensables.

    Est il impératif de faire tourner ce traitement en journée ?
    Hélas oui, c'est un calcul de prix d'articles.

  4. #4
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 674
    Points
    674
    Par défaut
    Dans l'optimisation je vois que vous effectuez un calcul de prix n'avez vous pas essayé de le faire en .Net via du CLR pour soulager le serveur SQL (piste possible, ce n'est pas forcément la solution ultime) ?

    Quel est le nombre d'IO remonté par votre requete consommatrice au niveau accès disque ? Avez vous le plan de la requete incriminé ?

    Normalement il est imperatif de sortir les traitements de scoring / BI ... du transactionnel, l'ideal serait de transferer les données sur une autre instance via un systeme de réplication par exemple et d'effectuer les calcul dans un environnement dédié.

    Autre point : Le parrallélisme est il activé sur votre machine ? Si oui votre requete consommatrice est elle élligible ? Comment se comporte le parrallélisme vis a vis de cette requete ? comment est solicité votre CPU au moment du passage de cette requete ?

    Julien
    MCSA SQL SERVER |MCT | MVP Data Platform

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Il faudrait savoir avant toutes choses si c'est bien un problème de charge sur le serveur. Dans votre cas, il me semble plus probable qu'il s'agisse de problème de verrouillage qui bloque les autres requête, lesquelles tombent alors en timeout.

    La solution au problème ne sera alors pas du tout la même.

    Il faudrait nous en dire plus sur le traitement, ce qu'il fait,...

  6. #6
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    306
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 306
    Points : 71
    Points
    71
    Par défaut
    Oui il s'agit plus d'un verrouillage j'ai l'impression.

    Le traitement parcours environ 10'000 articles et par article au moins 3 SELECT (dont 1 avec UNION) et un UPDATE sur environ 1 article sur 20.

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par aloisio11 Voir le message
    Le traitement parcours environ 10'000 articles et par article au moins 3 SELECT (dont 1 avec UNION) et un UPDATE sur environ 1 article sur 20.

    ça sent le curseur ! est-ce le cas ?

    Peut-on voir le code ?

    est-ce qu'une transaction englobe le traitement ?

  8. #8
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 674
    Points
    674
    Par défaut
    Dans votre cas il nous faudrait le code et le plan d'execution ...
    MCSA SQL SERVER |MCT | MVP Data Platform

  9. #9
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    306
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 306
    Points : 71
    Points
    71
    Par défaut
    Tu entends quoi par "ça sent le curseur" ?

    En gros ça donne ça.
    Quand il y a des ... c'est que j'ai volontairement caché le code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    vDrListe = GetReader("SELECT * FROM ...")
    
                vMoyenne(0) = 0
                vMoyenne(1) = 0
                vCpt = 0
                While vDrListe.Read
                    Try
                        vOldPrix = CDbl(vDrListe("PRIX"))
                        vCode = vDrListe("CODE").ToString
                        vMarge = vMargeDefault
                        vMargeCrt = vMargeCrtDefault
    
                        'Récupération des marges pour la catégorie 2
                        If vOldC2 <> UCase(vDrListe("CATEG2").ToString) Or vOldC1 <> UCase(vDrListe("CATEG1").ToString) Then
                            vMargeCat2 = -1
                            vMargeCrtCat2 = -1
    
                            vDr = GetReader("SELECT CATEG2.Marge, CATEG2.MargeCrt" & _
                                    " FROM ...'")
                            If vDr.Read Then
                                If IsNumeric(vDr("Marge")) Then vMargeCat2 = CDbl(vDr("Marge"))
                                If IsNumeric(vDr("MargeCrt")) Then vMargeCrtCat2 = CDbl(vDr("MargeCrt"))
                            End If
                            vDr.Close()
    
                            vOldC3 = ""
                        End If
    
                        'Récupération des marges pour la catégorie 3
                        If vOldC3 <> UCase(vDrListe("CATEG3").ToString) Or vOldC2 <> UCase(vDrListe("CATEG2").ToString) Or vOldC1 <> UCase(vDrListe("CATEG1").ToString) Then
                            vMargeCat3 = -1
                            vMargeCrtCat3 = -1
    
                            vDr = GetReader("SELECT CATEG3.Marge, CATEG3.MargeCrt" & _
                                    " FROM ...")
                            If vDr.Read Then
                                If IsNumeric(vDr("Marge")) Then vMargeCat3 = CDbl(vDr("Marge"))
                                If IsNumeric(vDr("MargeCrt")) Then vMargeCrtCat3 = CDbl(vDr("MargeCrt"))
                            End If
                            vDr.Close()
    
                            vOldC3 = ""
                        End If
    
                        If vMargeCat2 > 0 Then vMarge = vMargeCat2
                        If vMargeCat3 > 0 Then vMarge = vMargeCat3
                        If IsNumeric(vDrListe("Marge")) Then vMarge = CDbl(vDrListe("Marge"))
    
                        If vMargeCrtCat2 > 0 Then vMargeCrt = vMargeCrtCat2
                        If vMargeCrtCat3 > 0 Then vMargeCrt = vMargeCrtCat3
                        If IsNumeric(vDrListe("MargeCrt")) Then vMargeCrt = CDbl(vDrListe("MargeCrt"))
    
                        vMarge = 1 + (vMarge / 100)
                        vMargeCrt = vMargeCrt / 100
    
                        vPA = BestFour(vCode) 'Fonction qui retourne le meilleur prix d'achat (1 requette SQL avec un INNER JOIN)
    
                        vLigne.Remove(0, vLigne.Length)
    
                        If vPA > 0 Then
                            vLigne.Append(vDrListe("...").ToString & Chr(9) & _
                                            vDrListe("...").ToString & Chr(9) & _
                                            vDrListe("...").ToString & Chr(9) & _
                                            vDrListe("...").ToString & Chr(9) & _
                                            vDrListe("...").ToString & Chr(9))
    
                                vPrix2 = BestCrt(vCode)  'Fonction qui retourne un autre prix d'achat (2 requette SQL dont une avec plusieurs UNION)
    
                                vNewPrix = vPA * CDbl(vAppSettings("TVA")) * vMarge
    
                                If vPrix2 > 0 Then
                                    vNewPrix = vPrix2
                                End If
    
                                'Stock la marge pour le calcul de la marge moyenne
                                vMoyenne(0) += Math.Round(((vNewPrix / CDbl(vAppSettings("TVA"))) - vPA) / vPA, 4)
    
                                vNewPrix = Math.Round(vNewPrix, 1)
    
                                vLigne.Append(vNewPrix.ToString & Chr(9) & _
                                              "" & Chr(9) & _
                                              ... & Chr(9) & _
                                              ... & Chr(9) & _
                                              ... & Chr(9) & _
                                              "" & Chr(9) & _
                                              ... & Chr(9) & _
                                              ... & Chr(9))
    
                                'Mise à jour du prix s'il est différent
                                If vNewPrix <> vOldPrix Then
                                    vSQL = "UPDATE ..." & _
                                            " SET PRIX = " & vNewPrix & _
                                           " WHERE ... = '" & vCode & "';"
                                    ExecuteSQL(vSQL)
    
                                    vLigne.Append("1")
                                Else
                                        vLigne.Append("0")
                                End If
    
                                If CInt(vDrListe("...")) > 0 Then
                                    vSQL &= "UPDATE ..." & _
                                           " SET ... = 0" & _
                                           " WHERE ... = '" & vCode & "';"
                                    ExecuteSQL(vSQL)
                                End If
    
                            vWriter.WriteLine(vLigne.ToString)
    
                            vMoyenne(1) += 1
    
                        vOldC1 = UCase(vDrListe("CATEG1").ToString)
                        vOldC2 = UCase(vDrListe("CATEG2").ToString)
                        vOldC3 = UCase(vDrListe("CATEG3").ToString)
                    Catch ex As Exception
                        __FONCTIONS.LogAdd("CalculPrix 1 : ERREUR : " & ex.ToString & vbCrLf)
                    End Try
    
                    vCpt += 1
    
                    If vCpt Mod 100 = 0 Or vCpt = vNb Then
                        __FONCTIONS.AfficheLog(LogCalculPrix, "  " & Math.Floor(vCpt / vNb * 100).ToString & " %", True)
                    End If
                End While
    Et non, pas de transaction.

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par aloisio11 Voir le message
    Bonjour à tous,

    J'utilise Microsoft SQL Server 2014 Standard Edition (64-bit) sur un serveur.
    J'ai des applications et un intranet qui communiquent avec ce SQL Server.
    Sur une de mes application j'ai un traitement qui est très lourd et dure quelques minutes, hélas pendant ce temps l'intranet est très lent et les timeouts fréquents

    J'aimerais donc donner une importance/priorité plus faible à l'application pour qu'elle laisse plus de ressource à l'intranet.
    J'ai vu qu'il existait un "Gouverneur de ressources" mais hélas indisponible sur la version Standard.

    Existe-il une solution à mon problème ?

    Merci d'avance
    Globalement vous pouvez faire cela par le "resource governor" : https://msdn.microsoft.com/en-us/library/bb933866.aspx

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  11. #11
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    306
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 306
    Points : 71
    Points
    71
    Par défaut
    Pas disponible dans la version Standard hélas

  12. #12
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    ok, je pensais que vous faisiez cela dans une procédure stockée...
    Je n'ai pas lu votre code en détail mais :

    1/ il s'agit finalement surement bien de problème de performances. a priori, vous éxécutez pas moins de 20000 requetes...
    2/ vous devriez réécrire en procédure stockée. je pense qu'une seule requete UPDATE devrait suffire, et ne durera probablement que quelques secondes.
    3/ vous pourriez même envisager une vue indexée, si c'est possible et pertinent... (a quelle fréquence est exécutée cette procédure, et que fait-elle ?)

  13. #13
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    306
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 306
    Points : 71
    Points
    71
    Par défaut
    Oui je peux regrouper les updates mais ils ne sont pas exécuté pour chaque article. Uniquement sur 5%/10%.

    Cette routine passe toutes les 2 heures et dure entre 8 et 9 minutes.
    Elle calcule les prix des articles.

  14. #14
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 674
    Points
    674
    Par défaut
    Effectivement encapsuler les mise a jour dans une procédure stockée sera beaucoup plus performant ...

    Il faut :

    • Identifier les données a mettre a jour surtout c'est juste 5 a 10 % ça ira très vite
    • Mettre en place le syteme de mise a jour
    • Au besoin utiliser des fonctions CLR pour le calcul



    Si vous avez un DBA's SQL Server sous le coude essayez de vous rapprocher de lui pour qu'il vous auguille sur la bonne démarche.
    MCSA SQL SERVER |MCT | MVP Data Platform

  15. #15
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    306
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 306
    Points : 71
    Points
    71
    Par défaut
    Selon vous c'est plus les UPDATE qui posent problème ?

    Hélas le DBA ... c'est moi

  16. #16
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 674
    Points
    674
    Par défaut
    Il faut analyser les plans de requetes pour en etre certains.

    Mais pourquoi ne pas faire une procédure permettant d'identifier les lignes a modifier et les modifier ?
    MCSA SQL SERVER |MCT | MVP Data Platform

  17. #17
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par aloisio11 Voir le message
    Cette routine passe toutes les 2 heures et dure entre 8 et 9 minutes.
    Elle calcule les prix des articles
    vos prix changent toutes les deux heures ?

  18. #18
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    306
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 306
    Points : 71
    Points
    71
    Par défaut
    Entre 5 et 10 % oui ...

    Mais ça c'est pas moi qui choisit

  19. #19
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    est-ce que des nouvelles données sont importées toutes les deux heures pour le recalcul des prix, ou est-ce que les données changent au fil de l'eau (modification manuelles par exemple)
    Dans ce deuxième cas, une vue indexée pour remplacer votre table contenant les prix - si toutefois elle est possible - serait sans doute la meilleure solution : vos prix seraient alors à jour en temps réel.
    Si vous êtes dans la première situation (import de nouvelle données) ou si la vue indexée n'est pas possible, alors une seule requete UPDATE serait déjà nettement mieux.

  20. #20
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Donnez le plan de requête réel.
    Vous pouvez le poster ici en l'anonymisant avec SQL Sentry Plan Explorer.

    @++

Discussions similaires

  1. comment ajouter des infos projet sur mes JSP
    Par legad dans le forum Maven
    Réponses: 1
    Dernier message: 12/02/2008, 15h45
  2. comment donner des arguments au main()
    Par adel.87 dans le forum Débuter
    Réponses: 3
    Dernier message: 23/12/2007, 21h22
  3. Comment donner des droits sur tous les objets d'un schéma
    Par farenheiit dans le forum Administration
    Réponses: 2
    Dernier message: 07/06/2007, 16h27
  4. comment donner des couleurs au ligne d'un DBgrid
    Par tchimou dans le forum Bases de données
    Réponses: 1
    Dernier message: 16/05/2007, 01h50
  5. Réponses: 8
    Dernier message: 13/09/2006, 17h21

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