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

SQL Oracle Discussion :

Comment interpreter les recommendations d'oracle Tunning


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 428
    Points : 60
    Points
    60
    Par défaut Comment interpreter les recommendations d'oracle Tunning
    Bonjour;

    je souhaite interpreter la solution que propose l'outil Oracle Tunning Advisor sur une requete consommatrice de temps.
    Le rapport ADDM a identifié la requête suivante :

    RECOMMENDATION 1: SQL Tuning, 100% benefit (6487 seconds)
    ACTION: Examinez la possibilité d'améliorer les performances de
    l'instruction SQL où SQL_ID = "8rv158cfpqfda".
    RELEVANT OBJECT: SQL statement with SQL_ID 8rv158cfpqfda and
    PLAN_HASH 1772850126
    SELECT
    CONCAT(CONCAT(CONCAT(CONCAT(TO_CHAR(( Date_INDIC_TRIER.VA_SEMAINE
    ),'00'),'/'),( Date_INDIC_TRIER.VA_ANNEE )),' - Date début de semaine
    : '),TO_CHAR(( Date_INDIC_TRIER.DT_DEBUT_SEMAINE ),'dd/mm/YYYY'))
    FROM
    ( SELECT DISTINCT QS_INDIC_TOURNEE.VA_ANNEE ,
    QS_INDIC_TOURNEE.VA_SEMAINE , QS_INDIC_TOURNEE.DT_DEBUT_SEMAINE
    FROM
    QS_INDIC_TOURNEE
    ORDER BY
    QS_INDIC_TOURNEE.VA_ANNEE , QS_INDIC_TOURNEE.VA_SEMAINE )
    Date_INDIC_TRIER
    WHERE
    (
    ( ( Date_INDIC_TRIER.VA_ANNEE ) > TO_NUMBER(TO_CHAR(EXTRACT(YEAR
    FROM SYSDATE) - 2 , '0000'))
    OR
    (( Date_INDIC_TRIER.VA_SEMAINE ) > TO_NUMBER(TO_CHAR(SYSDATE, 'IW'))
    AND
    ( Date_INDIC_TRIER.VA_ANNEE ) = TO_NUMBER(TO_CHAR(EXTRACT(YEAR FROM
    SYSDATE) - 2 , '0000'))) )
    )

    RATIONALE: L'instruction SQL où SQL_ID = "8rv158cfpqfda" a été exécutée
    1458 fois, avec un temps écoulé moyen de 0.76 secondes.

    L'outil Tunning Advisor propose la soultion suivante :

    1- SQL Profile Finding (see explain plans section below)
    --------------------------------------------------------
    Un meilleur plan d'exécution éventuel a été trouvé pour cette instruction.

    Recommendation (estimated benefit: 72,14%)
    ------------------------------------------
    - Envisagez d'accepter le profil SQL recommandé.
    execute dbms_sqltune.accept_sql_profile(task_name => '8rv158cfpqfda',
    replace => TRUE);

    -------------------------------------------------------------------------------
    EXPLAIN PLANS SECTION
    -------------------------------------------------------------------------------

    1- Original
    -----------
    Plan hash value: 1772850126

    ----------------------------------------------------------------------------------------
    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
    ----------------------------------------------------------------------------------------
    | 0 | SELECT STATEMENT | | 18 | 630 | 325 (7)| 00:00:04 |
    | 1 | VIEW | | 18 | 630 | 325 (7)| 00:00:04 |
    | 2 | SORT UNIQUE | | 18 | 270 | 323 (7)| 00:00:04 |
    |* 3 | TABLE ACCESS FULL| QS_INDIC_TOURNEE | 10396 | 152K| 322 (6)| 00:00:04 |
    ----------------------------------------------------------------------------------------

    Query Block Name / Object Alias (identified by operation id):
    -------------------------------------------------------------

    1 - SEL$2 / DATE_INDIC_TRIER@SEL$1
    2 - SEL$2
    3 - SEL$2 / QS_INDIC_TOURNEE@SEL$2

    Predicate Information (identified by operation id):
    ---------------------------------------------------

    3 - filter("QS_INDIC_TOURNEE"."VA_ANNEE">TO_NUMBER(TO_CHAR(EXTRACT(YEAR FROM
    SYSDATE@!)-2,'0000')) OR "QS_INDIC_TOURNEE"."VA_SEMAINE">TO_NUMBER(TO_CHAR(SYSDA
    TE@!,'IW')) AND "QS_INDIC_TOURNEE"."VA_ANNEE"=TO_NUMBER(TO_CHAR(EXTRACT(YEAR
    FROM SYSDATE@!)-2,'0000')))

    Column Projection Information (identified by operation id):
    -----------------------------------------------------------

    1 - "DATE_INDIC_TRIER"."VA_ANNEE"[NUMBER,22],
    "DATE_INDIC_TRIER"."VA_SEMAINE"[NUMBER,22],
    "DATE_INDIC_TRIER"."DT_DEBUT_SEMAINE"[DATE,7]
    2 - (#keys=3) "QS_INDIC_TOURNEE"."VA_ANNEE"[NUMBER,22],
    "QS_INDIC_TOURNEE"."VA_SEMAINE"[NUMBER,22],
    "QS_INDIC_TOURNEE"."DT_DEBUT_SEMAINE"[DATE,7]
    3 - "QS_INDIC_TOURNEE"."VA_SEMAINE"[NUMBER,22],
    "QS_INDIC_TOURNEE"."VA_ANNEE"[NUMBER,22],
    "QS_INDIC_TOURNEE"."DT_DEBUT_SEMAINE"[DATE,7]

    2- Original With Adjusted Cost
    ------------------------------
    Plan hash value: 1772850126

    ----------------------------------------------------------------------------------------
    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
    ----------------------------------------------------------------------------------------
    | 0 | SELECT STATEMENT | | 18 | 630 | 1233 (4)| 00:00:15 |
    | 1 | VIEW | | 18 | 630 | 1233 (4)| 00:00:15 |
    | 2 | SORT UNIQUE | | 18 | 270 | 1222 (3)| 00:00:15 |
    |* 3 | TABLE ACCESS FULL| QS_INDIC_TOURNEE | 174K| 2550K| 322 (6)| 00:00:04 |
    ----------------------------------------------------------------------------------------

    Query Block Name / Object Alias (identified by operation id):
    -------------------------------------------------------------

    1 - SEL$2 / DATE_INDIC_TRIER@SEL$1
    2 - SEL$2
    3 - SEL$2 / QS_INDIC_TOURNEE@SEL$2

    Predicate Information (identified by operation id):
    ---------------------------------------------------

    3 - filter("QS_INDIC_TOURNEE"."VA_ANNEE">TO_NUMBER(TO_CHAR(EXTRACT(YEAR FROM
    SYSDATE@!)-2,'0000')) OR "QS_INDIC_TOURNEE"."VA_SEMAINE">TO_NUMBER(TO_CHAR(SYSDA
    TE@!,'IW')) AND "QS_INDIC_TOURNEE"."VA_ANNEE"=TO_NUMBER(TO_CHAR(EXTRACT(YEAR
    FROM SYSDATE@!)-2,'0000')))

    Column Projection Information (identified by operation id):
    -----------------------------------------------------------

    1 - "DATE_INDIC_TRIER"."VA_ANNEE"[NUMBER,22],
    "DATE_INDIC_TRIER"."VA_SEMAINE"[NUMBER,22],
    "DATE_INDIC_TRIER"."DT_DEBUT_SEMAINE"[DATE,7]
    2 - (#keys=3) "QS_INDIC_TOURNEE"."VA_ANNEE"[NUMBER,22],
    "QS_INDIC_TOURNEE"."VA_SEMAINE"[NUMBER,22],
    "QS_INDIC_TOURNEE"."DT_DEBUT_SEMAINE"[DATE,7]
    3 - "QS_INDIC_TOURNEE"."VA_SEMAINE"[NUMBER,22],
    "QS_INDIC_TOURNEE"."VA_ANNEE"[NUMBER,22],
    "QS_INDIC_TOURNEE"."DT_DEBUT_SEMAINE"[DATE,7]

    3- Using SQL Profile
    --------------------
    Plan hash value: 1495258575

    -------------------------------------------------------------------------------------------------------
    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
    -------------------------------------------------------------------------------------------------------
    | 0 | SELECT STATEMENT | | 18 | 630 | 344 (11)| 00:00:05 |
    | 1 | VIEW | | 18 | 630 | 344 (11)| 00:00:05 |
    | 2 | SORT UNIQUE | | 18 | 270 | 332 (8)| 00:00:04 |
    | 3 | CONCATENATION | | | | | |
    |* 4 | TABLE ACCESS BY INDEX ROWID| QS_INDIC_TOURNEE | 33345 | 488K| 4 (0)| 00:00:01 |
    |* 5 | INDEX RANGE SCAN | IXT_INDIC_TOURNEE_01 | 1 | | 3 (0)| 00:00:01 |
    |* 6 | TABLE ACCESS FULL | QS_INDIC_TOURNEE | 140K| 2062K| 317 (5)| 00:00:04 |
    -------------------------------------------------------------------------------------------------------

    Query Block Name / Object Alias (identified by operation id):
    -------------------------------------------------------------

    1 - SEL$2 / DATE_INDIC_TRIER@SEL$1
    2 - SEL$2
    4 - SEL$2_1 / QS_INDIC_TOURNEE@SEL$2
    5 - SEL$2_1 / QS_INDIC_TOURNEE@SEL$2
    6 - SEL$2_2 / QS_INDIC_TOURNEE@SEL$2_2

    Predicate Information (identified by operation id):
    ---------------------------------------------------

    4 - filter("QS_INDIC_TOURNEE"."VA_ANNEE"=TO_NUMBER(TO_CHAR(EXTRACT(YEAR FROM
    SYSDATE@!)-2,'0000')))
    5 - access("QS_INDIC_TOURNEE"."VA_SEMAINE">TO_NUMBER(TO_CHAR(SYSDATE@!,'IW')))
    6 - filter("QS_INDIC_TOURNEE"."VA_ANNEE">TO_NUMBER(TO_CHAR(EXTRACT(YEAR FROM
    SYSDATE@!)-2,'0000')) AND (LNNVL("QS_INDIC_TOURNEE"."VA_SEMAINE">TO_NUMBER(TO_CHAR(SYSDATE@!,'I
    W'))) OR LNNVL("QS_INDIC_TOURNEE"."VA_ANNEE"=TO_NUMBER(TO_CHAR(EXTRACT(YEAR FROM
    SYSDATE@!)-2,'0000')))))

    Column Projection Information (identified by operation id):
    -----------------------------------------------------------

    1 - "DATE_INDIC_TRIER"."VA_ANNEE"[NUMBER,22], "DATE_INDIC_TRIER"."VA_SEMAINE"[NUMBER,22],
    "DATE_INDIC_TRIER"."DT_DEBUT_SEMAINE"[DATE,7]
    2 - (#keys=3) "QS_INDIC_TOURNEE"."VA_ANNEE"[NUMBER,22],
    "QS_INDIC_TOURNEE"."VA_SEMAINE"[NUMBER,22], "QS_INDIC_TOURNEE"."DT_DEBUT_SEMAINE"[DATE,7]
    3 - "QS_INDIC_TOURNEE".ROWID[ROWID,10], "QS_INDIC_TOURNEE"."VA_SEMAINE"[NUMBER,22],
    "QS_INDIC_TOURNEE"."VA_ANNEE"[NUMBER,22], "QS_INDIC_TOURNEE"."DT_DEBUT_SEMAINE"[DATE,7]
    4 - "QS_INDIC_TOURNEE".ROWID[ROWID,10], "QS_INDIC_TOURNEE"."VA_SEMAINE"[NUMBER,22],
    "QS_INDIC_TOURNEE"."VA_ANNEE"[NUMBER,22], "QS_INDIC_TOURNEE"."DT_DEBUT_SEMAINE"[DATE,7]
    5 - "QS_INDIC_TOURNEE".ROWID[ROWID,10], "QS_INDIC_TOURNEE"."VA_SEMAINE"[NUMBER,22]
    6 - "QS_INDIC_TOURNEE".ROWID[ROWID,10], "QS_INDIC_TOURNEE"."VA_SEMAINE"[NUMBER,22],
    "QS_INDIC_TOURNEE"."VA_ANNEE"[NUMBER,22], "QS_INDIC_TOURNEE"."DT_DEBUT_SEMAINE"[DATE,7]

    Merci

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Lisez Subquery with OR .
    Je n'aime pas trop l'order by dans la sous-interogation.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 428
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Lisez Subquery with OR .
    Je n'aime pas trop l'order by dans la sous-interogation.

    Salut;

    Que proposes tu à la place ? Tu penses que ca a impact sur les perf ?

    En te remerciant

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Pour l’instant je vous propose de ré écrire la requête avec « union all » à la place de « or » et de vérifier les plan d’exécution.

  5. #5
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    RATIONALE: L'instruction SQL où SQL_ID = "8rv158cfpqfda" a été exécutée
    1458 fois, avec un temps écoulé moyen de 0.76 secondes.
    C'est pas bien moins d'une seconde pour cette requête ?
    Par contre, pourquoi est-elle exécutée 1458 ? en combien de temps ?

    Recommendation (estimated benefit: 72,14%)
    Ce sera tellement mieux 0.76 * 0.7214 = 0.548264 secondes au lieu de 0.76 ?

    Je ne suis pas sur que ce rapport soit très utile

    Cordialement,
    Franck.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 428
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par pachot Voir le message
    Bonjour,

    C'est pas bien moins d'une seconde pour cette requête ?
    Par contre, pourquoi est-elle exécutée 1458 ? en combien de temps ?

    Ce sera tellement mieux 0.76 * 0.7214 = 0.548264 secondes au lieu de 0.76 ?

    Je ne suis pas sur que ce rapport soit très utile

    Cordialement,
    Franck.
    Bonjour Franck;

    Ok par contre je n'arrive pas à optimiser ma requete ! En gros je ne vois pas qu'est ce qui pose problème sur cette requete :

    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
    SELECT 
    CONCAT(CONCAT(CONCAT(CONCAT(TO_CHAR(( Date_INDIC_TRIER.VA_SEMAINE 
    ),'00'),'/'),( Date_INDIC_TRIER.VA_ANNEE )),' - Date début de semaine 
    : '),TO_CHAR(( Date_INDIC_TRIER.DT_DEBUT_SEMAINE ),'dd/mm/YYYY'))
    FROM
    ( SELECT DISTINCT QS_INDIC_TOURNEE.VA_ANNEE , 
    QS_INDIC_TOURNEE.VA_SEMAINE , QS_INDIC_TOURNEE.DT_DEBUT_SEMAINE
    FROM
    QS_INDIC_TOURNEE
    ORDER BY
    QS_INDIC_TOURNEE.VA_ANNEE , QS_INDIC_TOURNEE.VA_SEMAINE ) 
    Date_INDIC_TRIER
    WHERE
    ( 
    ( ( Date_INDIC_TRIER.VA_ANNEE ) > TO_NUMBER(TO_CHAR(EXTRACT(YEAR 
    FROM SYSDATE) - 2 , '0000')) 
    OR 
    (( Date_INDIC_TRIER.VA_SEMAINE ) > TO_NUMBER(TO_CHAR(SYSDATE, 'IW')) 
    AND
    ( Date_INDIC_TRIER.VA_ANNEE ) = TO_NUMBER(TO_CHAR(EXTRACT(YEAR FROM 
    SYSDATE) - 2 , '0000'))) )
    )

    Merci

  7. #7
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    je ne vois pas qu'est ce qui pose problème
    Peut-être rien. Tu pense avoir un pb de performance ?
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 428
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Pour l’instant je vous propose de ré écrire la requête avec « union all » à la place de « or » et de vérifier les plan d’exécution.
    Bonjour;

    J'ai remplacé le "OR" par un "UNION ALL" mais pas de gain de performance ?

    A+;

  9. #9
    Membre actif Avatar de Ahmed AANGOUR
    Homme Profil pro
    DBA Oracle
    Inscrit en
    Janvier 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle

    Informations forums :
    Inscription : Janvier 2010
    Messages : 139
    Points : 271
    Points
    271
    Par défaut
    Combien de lignes retourne votre requête sur combien de lignes dans la table QS_INDIC_TOURNEE ? La clause ORDER BY dans la subquery est-elle vraiment utile ?

    Concernant l'article de Jonathan Lewis pointé par MNITU, il s'agit plus d'une astuce pour éviter d'avoir des FILTER clause pour les semi-jointures (clauses EXISTS/IN). En effet, lorsqu'on a une clause OR dans une subquery le CBO est incapable d'unnester la sous-requête pendant la phase de "query transformation" du parsing de la requête et donc un filter subquery est effectué à la place d'un NESTED LOOP SEMI (ou HASH JOIN SEMI). Selon le nombre de lignes processées dans la table directrice du FILTER (car un FTS est effectué sur cette table) les performances de la requête peuvent être catastrophique.

    Toutefois, concernant la requête de Yanis et selon le nombre de lignes retournées, il pourrait être effectivement intéressant de tester un UNION ALL au lieu d'avoir un OR dans la clause WHERE.

  10. #10
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    A ce que je comprends l’optimiseur estime que la requête en question va ramène 10 396 lignes depuis la table QS_INDIC_TOURNEE mais en réalité elle ramène 174 000.
    Donc il vous propose un autre plan où une partie des données provient d’un accès full de la table et une autre à partir d’un index.
    Vous allez gagnez en gros 0.2 * 1458 secondes. Pachot a tout à fait raison de demander si ça vaut la peine.

  11. #11
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Mauvaise gestion des dates.
    Peut-on connaître la structure de la table qs_indic_tournee ?

    Et avoir un petit extrait sur la semaine en cours par exemple ?

Discussions similaires

  1. comment interpreter les balises html saisies dans une zone de texte
    Par programmatrice dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 17/04/2012, 15h04
  2. comment avoir les Messages d'oracle ?
    Par krilas dans le forum Forms
    Réponses: 4
    Dernier message: 11/11/2010, 15h05
  3. Comment gérer les apostrophes dans oracle
    Par jenyfer dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 07/11/2006, 14h23
  4. [DEBUTANT][Exception] Comment interpreter les erreurs ?
    Par Battosaiii dans le forum Langage
    Réponses: 4
    Dernier message: 18/08/2006, 15h59
  5. Réponses: 1
    Dernier message: 01/12/2005, 17h52

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