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

WinDev Discussion :

Questions lenteurs SQL [WD16]


Sujet :

WinDev

  1. #1
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut Questions lenteurs SQL
    Bonjour,

    Et oui ! Encore un sujet sur les lenteurs de requêtes SQL

    C'est un vrai dilemme pour moi...

    J'ai effectué plusieurs tests hier soir avec un fichier de données contenant des codes postaux et communes (38000 enregistrements environ).

    1 - Une requête avec HExecuteRequete + TableAjouteLigne >> Résultat long... (facile 5 sec)

    2 - Même requête mais lié à la table en accès direct >>> là c'est pratiquement immédiat !

    Pourquoi une telle différence ?!

    Autre cas, avec un fichier de données d'une 20aine de colonnes contenant 10 000 enregistrements, là que ce soit avec HExecuteRequete + TableAjouteLigne ou en accès direct ou même en mémoire et même si je ne prend que l'un des champs... ça rame ! Pourtant il y a moins d'enregistrement que dans le précédant fichier !!

    Pourquoi un tel résultat ?!

    Je cherche une solution optimale pour limiter au maximum l'attente de chargement de données auprès des utilisateurs et là ça me fait très peur...

    Merci

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur et responsable micros/réseaux
    Inscrit en
    Octobre 2010
    Messages
    1 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur et responsable micros/réseaux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 286
    Points : 2 562
    Points
    2 562
    Par défaut
    Bonjour,

    plusieurs questions :

    • Quel est ton mode de connexion ? Accès natif, ODBC, OLE DB ?
    • Le serveur est de quel nature ? Hyperfile, MySQL, SQL Server .... ?
    • Les tables sont-elles indexées et si oui la recherche porte-t-elle sur un des ces indexes ?
    • Peux-tu nous fournir un exemple de requête et les ordres qui correspondent dans ton code ?


    Je garde les autres en fonction des réponses

    à bientôt,

    Nicolas

  3. #3
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Salut Nicolas,

    • Quel est ton mode de connexion ? Accès natif, ODBC, OLE DB ?

    Accès natif.

    • Le serveur est de quel nature ? Hyperfile, MySQL, SQL Server .... ?

    HF SQL C/S.

    • Les tables sont-elles indexées et si oui la recherche porte-t-elle sur un des ces indexes ?


    Tu parles des index crées lors de l'optimisation des requêtes ?

    • Peux-tu nous fournir un exemple de requête et les ordres qui correspondent dans ton code ?


    Un simple "SELECT IDAuditeur FROM Auditeur" met plusieurs secondes pour me sortir les 10 000 enregistrements.

    Dans mon code, c'est une simple boucle POUR TOUT avec HExecuteRequeteSQL.

    J'ai tenter de faire comme avec l'autre fichier de codes postaux, en liant la requête à la table mais cela ne fait pas gagner de temps Ou alors je m'y prend mal car lier une requête qui n'est pas faite avec l'éditeur de requête ce n'est pas évident.

    Je n'ai pas Windev sous la main, dès que possible, je colle mon code de parcours en mode lié.

    Par contre, mon fichier Auditeur à pas mal de liaisons avec d'autres fichiers, ça peux jouer ?

    Merci.

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur et responsable micros/réseaux
    Inscrit en
    Octobre 2010
    Messages
    1 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur et responsable micros/réseaux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 286
    Points : 2 562
    Points
    2 562
    Par défaut
    Les indexes permettent au serveur de trier les données selon un ou plusieurs critères et de restituer plus rapidement le résultat des requêtes. Il faut donc envisager plusieurs clefs sur la table (simples ou composées) pour pouvoir faire une recherche plus rapide sur la colonne. Par exemple, la colonne IDAuteur doit être une clef de la table Auteur.

  5. #5
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 723
    Points : 627
    Points
    627
    Par défaut
    Je suppose que donc ce cas "IDAuteur" sera certainement un index ?

    ( "ID")

    Olivier

  6. #6
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    IDAuditeur est bien en clé unique

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Ici un index sur IdAuteur ne changera pas grand chose (j'ai bien dit ici !), car il n'y a aucune restriction sur IdAuteur, aucune jointure.

    Il faudrait bous montrer le code en question, peut-être que quelque chose nous sautera aux yeux.
    Que dit l'analyseur de performance ?

    Tatayo.

  8. #8
    Membre émérite
    Homme Profil pro
    Développeur et responsable micros/réseaux
    Inscrit en
    Octobre 2010
    Messages
    1 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur et responsable micros/réseaux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 286
    Points : 2 562
    Points
    2 562
    Par défaut
    Citation Envoyé par WDKyle Voir le message
    IDAuditeur est bien en clé unique
    Sur ta base de données également ?

  9. #9
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Oui, voici la structure de mon fichier Auditeur

  10. #10
    Membre chevronné Avatar de EDM-TAHITI
    Homme Profil pro
    Directeur Service informatique et projet développement
    Inscrit en
    Janvier 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Directeur Service informatique et projet développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 994
    Points : 1 995
    Points
    1 995
    Par défaut
    Hello,
    Un bout de code qui pose problème pourrait éclairer notre lanterne.... en fait, la procédure qui te permet d'alimenter en sql ta table.
    le savoir est dans les livres, 'the magic touch F1'
    Amicalement
    Eric

  11. #11
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Voici la procédure qui rempli la table par programmation :

    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
     
    PROCEDURE AUDITEURS_Liste(Table est une chaîne)
     
    Sablier(Vrai)
     
    TableSupprimeTout({Table, indChamp})
     
    SI TableauCherche(Tableau_Radios, tcLinéairePremier, "Affichage", 1) = -1 ALORS
    	RENVOYER 0
    FIN
     
    Code_Requete_Auditeurs est une chaîne
    Code_Requete_Radios est une chaîne
    Nb_Auditeurs est un entier
     
    Code_Requete_Auditeurs =
    [
    SELECT DISTINCT
    	Auditeur.IDAuditeur AS IDAuditeur,	
    	Auditeur.Complet AS Complet,	
    	Auditeur.Liste_Noire AS Liste_Noire,	
    	Auditeur.Sexe AS Sexe,	
    	Auditeur.Nom AS Nom,	
    	Auditeur.Prenom AS Prenom,	
    	Auditeur.Age AS Age,	
    	Auditeur.Email AS Email,	
    	Auditeur.Adresse AS Adresse,	
    	Auditeur.Code_Postal AS Code_Postal,	
    	Auditeur.Commune AS Commune,	
    	Auditeur.Telephone_Fixe AS Telephone_Fixe,	
    	Auditeur.Telephone_Portable AS Telephone_Portable,	
    	Auditeur.Humeur AS Humeur,	
    	Auditeur.Mailing_Mail AS Mailing_Mail,	
    	Auditeur.Mailing_Sms AS Mailing_Sms,	
    	Auditeur.Commentaires AS Commentaires,	
    	Auditeur.Date_Heure_Creation AS Date_Heure_Creation
    FROM 
    	Radio,	
    	Radio_Auditeur,	
    	Auditeur
    WHERE 
    	Radio.IDRadio	=	Radio_Auditeur.IDRadio
    	AND	Auditeur.IDAuditeur	=	Radio_Auditeur.IDAuditeur
    	AND	(%1)
    ORDER BY 
    	Nom ASC
    ]
     
    TableauTrie(Tableau_Radios, ttMembre, "+IDRadio")
     
    POUR i = 1 _A_ Tableau_Radios..Occurrence
    	SI Tableau_Radios[i]:p_Affichage = 1 ALORS
    		SI Code_Requete_Radios = "" ALORS
    			Code_Requete_Radios = "Radio.IDRadio = " + Tableau_Radios[i]:p_IDRadio
    		SINON
    			Code_Requete_Radios += " OR Radio.IDRadio = " + Tableau_Radios[i]:p_IDRadio
    		FIN
    	FIN
    FIN
     
    Code_Requete_Auditeurs = ChaîneConstruit(Code_Requete_Auditeurs, Code_Requete_Radios)
     
    SI HExécuteRequêteSQL(Requete_Auditeurs, hRequêteDéfaut, Code_Requete_Auditeurs) = Vrai ALORS
    	POUR TOUT Requete_Auditeurs 
    		TableAjouteLigne({Table, indChamp},...
    		Requete_Auditeurs.IDAuditeur,...
    		Requete_Auditeurs.Complet,...
    		"",...
    		Requete_Auditeurs.Liste_Noire,...
    		Requete_Auditeurs.Sexe,...
    		"",...
    		Requete_Auditeurs.Nom,...
    		Requete_Auditeurs.Prenom,...
    		Requete_Auditeurs.Email,...
    		Requete_Auditeurs.Age,...
    		Requete_Auditeurs.Commune,...
    		Requete_Auditeurs.Code_Postal,...
    		Requete_Auditeurs.Humeur,...
    		"",...
    		Requete_Auditeurs.Mailing_Mail,...
    		"",...
    		Requete_Auditeurs.Mailing_Sms,...
    		"")
     
    		Nb_Auditeurs++
    	FIN
    FIN
    HLibèreRequête(Requete_Auditeurs)
     
    Sablier(Faux)
     
    RENVOYER Nb_Auditeurs

  12. #12
    Membre chevronné Avatar de EDM-TAHITI
    Homme Profil pro
    Directeur Service informatique et projet développement
    Inscrit en
    Janvier 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Directeur Service informatique et projet développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 994
    Points : 1 995
    Points
    1 995
    Par défaut
    Hello,
    Fais un test en remplacant le 'pour tout' par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    si hlitpremier(Requete_auditeur , hsansrafraichir) alors
       tantque htrouve(requete_auditeur)
          // ton code de lecture ici
     
          hlitsuivant(requete_auditeur)
       fin
    fin
    A près dis nous...
    le savoir est dans les livres, 'the magic touch F1'
    Amicalement
    Eric

  13. #13
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Je viens de virer des champs de ma requête qui ne me servent pas finalement c'est un peu plus rapide mais c'est pas encore ça...

    Je test ton code EDM-TAHITI

    Merci

    EDIT : Je viens de tester avec ton code, le traitement met 10.36 secondes pour remplir 8693 enregistrements, la requête met 0.008 secondes...

    Le POUR TOUT est plus rapide on dirait car j'ai 5 sec pour les 8693 enregistrements.

  14. #14
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Chose bizarre, je gagne un petit peu de temps en faisant comme ceci :

    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
     
    {Table, indChamp}..FichierParcouru = "Requete_Auditeurs"
    {Table, indChamp}..RubriqueParcourue = "IDAuditeur"
    {Table + ".COL_IDAuditeur", indChamp}..LiaisonFichier = "Requete_Auditeurs.IDAuditeur"
    {Table + ".COL_Complet", indChamp}..LiaisonFichier = "Requete_Auditeurs.Complet"
    {Table + ".COL_Liste_Noire", indChamp}..LiaisonFichier = "Requete_Auditeurs.Liste_Noire"
    {Table + ".COL_Sexe", indChamp}..LiaisonFichier = "Requete_Auditeurs.Sexe"
    {Table + ".COL_Nom", indChamp}..LiaisonFichier = "Requete_Auditeurs.Nom"
    {Table + ".COL_Prenom", indChamp}..LiaisonFichier = "Requete_Auditeurs.Prenom"
    {Table + ".COL_Email", indChamp}..LiaisonFichier = "Requete_Auditeurs.Email"
    {Table + ".COL_Age", indChamp}..LiaisonFichier = "Requete_Auditeurs.Age"
    {Table + ".COL_Commune", indChamp}..LiaisonFichier = "Requete_Auditeurs.Commune"
    {Table + ".COL_Codepostal", indChamp}..LiaisonFichier = "Requete_Auditeurs.Code_Postal"
    {Table + ".COL_Humeur", indChamp}..LiaisonFichier = "Requete_Auditeurs.Humeur"
    {Table + ".COL_Mailing_Email", indChamp}..LiaisonFichier = "Requete_Auditeurs.Mailing_Mail"
    {Table + ".COL_Mailing_Sms", indChamp}..LiaisonFichier = "Requete_Auditeurs.Mailing_Sms"
     
    SI HExécuteRequêteSQL(Requete_Auditeurs, hRequêteDéfaut, Code_Requete_Auditeurs) = Vrai ALORS	
    	TableAffiche({Table, indChamp})
    FIN
    0.017 la requête
    3.838 le remplissage

  15. #15
    Membre émérite
    Homme Profil pro
    Développeur et responsable micros/réseaux
    Inscrit en
    Octobre 2010
    Messages
    1 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur et responsable micros/réseaux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 286
    Points : 2 562
    Points
    2 562
    Par défaut
    à mon avis sur ta table dans la base de données (là on a vu l'analyse et les champs de la table), il n'y a pas les clés ...

  16. #16
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Citation Envoyé par Nicolas_Jeanneau Voir le message
    à mon avis sur ta table dans la base de données (là on a vu l'analyse et les champs de la table), il n'y a pas les clés ...
    La première image c'est dans le centre de contrôle et il y a bien la clé.

  17. #17
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Est-ce que c'est plus rapide en figeant la table le temps du remplissage (avec la propriété ..affichageactif) ?

    Tatayo.

  18. #18
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Est-ce que c'est plus rapide en figeant la table le temps du remplissage (avec la propriété ..affichageactif) ?

    Tatayo.
    Cela n'as rien de bien flangrant, je gagne 100ms... c'est tout.

    Donc avec un POUR TOUT 4.800 contre 4.900

  19. #19
    Membre émérite
    Homme Profil pro
    Développeur et responsable micros/réseaux
    Inscrit en
    Octobre 2010
    Messages
    1 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur et responsable micros/réseaux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 286
    Points : 2 562
    Points
    2 562
    Par défaut
    Peux-tu créer une table générique qui puisse accueillir tous les champs de la table passée en paramètre pour voir si c'est l'indirection qui fait perdre autant de temps ?

  20. #20
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    D'ac, je vais tenter avec une boucle POUR TOUT et l'autre facon de faire avec liaison fichier et je vous tiens au courant

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 6 12345 ... DernièreDernière

Discussions similaires

  1. question su sql server 2005 express edition
    Par nass06 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 25/04/2006, 20h15
  2. [MySQL] Questions include + sql
    Par Kerweb dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 01/02/2006, 10h01
  3. Question sur sql et ASP
    Par claralavraie dans le forum ASP
    Réponses: 5
    Dernier message: 23/12/2005, 11h41
  4. Quelques questions sur SQL Server 2000
    Par yinyang dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 07/12/2005, 19h39
  5. BTS Info de Gestion passé aujourd'hui question pour SQL
    Par red210 dans le forum Décisions SGBD
    Réponses: 11
    Dernier message: 29/05/2005, 14h48

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