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

Langage SQL Discussion :

Pourquoi cette requête est lente ?


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 55
    Points : 28
    Points
    28
    Par défaut Pourquoi cette requête est lente ?
    Bonjour à tous et bonne année !
    Voilà, j'ai un souci de performance sur une base Mysql version 4.0 :
    J'ai 2 tables : la table ville avec comme identifiant des pays leur code
    international unique (exemple suisse=>CH);
    et une table pays.

    CREATE TABLE `ville` (
    `VILLE_ID` int(11) NOT NULL auto_increment,
    `VILLE_NOM` varchar(50) NOT NULL default '',
    `VILLE_CODE_POSTAL` int(5) unsigned zerofill default '00000',
    `PAYS_ID` char(2) NOT NULL default '',
    UNIQUE KEY `PK_VILLE_ID` (`VILLE_ID`),
    FULLTEXT KEY `IDX_VILLE_NOM` (`VILLE_NOM`),
    FULLTEXT KEY `IDX_PAYS_ID` (`PAYS_ID`)
    ) ENGINE=MyISAM ;


    CREATE TABLE `pays` (
    `PAYS_NOM` varchar(50) NOT NULL default '',
    `PAYS_ID` char(2) NOT NULL,
    UNIQUE KEY `PK_PAYS_ID` (`PAYS_ID`),
    FULLTEXT KEY `IDX_PAYS_NOM` (`PAYS_NOM`),
    FULLTEXT KEY `IDX_PAYS_ID` (`PAYS_ID`)
    ) ENGINE=MyISAM ;

    et quand je souhaite extraire le nombre de ville de chaque pays
    ma requête dure entre 30 et 40 secondes ;

    voici ma situation:
    le temps d'execution est le même chez mon hébergeur (donc exit problème machine)
    base Mysql version 4.0 ;
    nombre de villes total =46087
    nombre pays=237


    voici ma requête :
    SELECT
    pays.PAYS_ID ,
    COUNT(ville.PAYS_ID) AS NOMBRE_VILLE
    FROM ville
    RIGHT JOIN pays
    ON pays.PAYS_ID=ville.PAYS_ID
    GROUP BY pays.PAYS_ID
    ORDER BY NOMBRE_VILLE DESC

    -----------
    bien sûr, le RIGHT me permet de montrer les pays avec 0 villes (cela me renseigne sur les pays sans villes).

    Si j'oublie quelques informations, je m'en excuse d'avance !
    Cordialement.

  2. #2
    Membre habitué Avatar de souellet
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2003
    Messages : 155
    Points : 171
    Points
    171
    Par défaut
    Je crois qu'il y a un erreur dans ton count. J'imagine que c'est le count de ville et nom de pays que tu veux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT 
    pays.PAYS_ID , COUNT(ville.VILLE_ID) AS NOMBRE_VILLE 
    FROM ville 
    RIGHT JOIN pays ON pays.PAYS_ID=ville.PAYS_ID 
    GROUP BY pays.PAYS_ID 
    ORDER BY NOMBRE_VILLE DESC
    Probablement que la lenteur vient du ORDER BY de ton count.
    Est-ce qu'en SQL il y a la notion de vue et index?
    Je crois que la solution réside dans l'utilisation d'index et de vues.

    A+

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 55
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par souellet
    Je crois qu'il y a un erreur dans ton count. J'imagine que c'est le count de ville et nom de pays que tu veux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT 
    pays.PAYS_ID , COUNT(ville.VILLE_ID) AS NOMBRE_VILLE 
    FROM ville 
    RIGHT JOIN pays ON pays.PAYS_ID=ville.PAYS_ID 
    GROUP BY pays.PAYS_ID 
    ORDER BY NOMBRE_VILLE DESC
    Probablement que la lenteur vient du ORDER BY de ton count.
    Est-ce qu'en SQL il y a la notion de vue et index?
    Je crois que la solution réside dans l'utilisation d'index et de vues.

    A+
    je crois que tu n'as pas bien lu mon post !

  4. #4
    Membre habitué Avatar de souellet
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2003
    Messages : 155
    Points : 171
    Points
    171
    Par défaut
    Désolé, ça m'arrive des fois.

    Ce que j'avais compris c'est que tu avais un problème de lenteur avec la requête précédente.

    J'avais soulevé peut-être une erreur de champ dans le count et que les index et vues aide à la performance.
    Aussi le fait de faire un Order By avec le résultat du count bouffe énormément de performance et ce, dans probablement tous les SGBD.

    Je ne connais pas MySQL, peut-être viens de là mon incompréhension à ta question.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 55
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par souellet
    Désolé, ça m'arrive des fois.

    Ce que j'avais compris c'est que tu avais un problème de lenteur avec la requête précédente.

    J'avais soulevé peut-être une erreur de champ dans le count et que les index et vues aide à la performance.
    Aussi le fait de faire un Order By avec le résultat du count bouffe énormément de performance et ce, dans probablement tous les SGBD.

    Je ne connais pas MySQL, peut-être viens de là mon incompréhension à ta question.
    j'ai testé sans la clause order by et j'obtiens le même résultat !
    et pourtant mes index ne sont pas complexes et j'espère qu'il sont correctement formulés ! merci quand même !
    Cordialement

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 55
    Points : 28
    Points
    28
    Par défaut
    Bonjour à tous,
    je poursuis donc ma série de tests à 2 balles (je craque !) :
    la même requête avec un clone de ma base mais dans SQL server 2000
    est instantanée !
    Méditation...en attendant SQLPro !
    cordialement .

  7. #7
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 566
    Points
    19 566
    Billets dans le blog
    25
    Par défaut
    Pas assez de compétences sous l'optimiseur de MySQL pour en parler.
    Par contre,MS-SQL utilise, lors d'un count, la traversée de l'index le plus court. Du mement que vous avez indexé vos clés de jointures, pas étonnant que cela se passe vite.

    Peut-être MySQL ne fait pas de même ?
    Avez-vous un outil permettant de visualiser un plan d'exécution sous MySQL ?
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 55
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par fadace
    Pas assez de compétences sous l'optimiseur de MySQL pour en parler.
    Par contre,MS-SQL utilise, lors d'un count, la traversée de l'index le plus court. Du mement que vous avez indexé vos clés de jointures, pas étonnant que cela se passe vite.

    Peut-être MySQL ne fait pas de même ?
    Avez-vous un outil permettant de visualiser un plan d'exécution sous MySQL ?
    Bonjour,
    merci d'abord pour la réponse; et pour répondre à ta question,
    je ne connais pas ce genre d'outil mais je devine que le RIGHT de ma requête est le fautif mais c'est le seul moyen (je crois) pour lister les pays sans villes à moins de faire ça en 2 requêtes, choses que je ne souhaiterai pas faire !
    Merci en tout cas !
    Cordialement.

Discussions similaires

  1. Réponses: 12
    Dernier message: 24/07/2007, 11h09
  2. es ce que cette requête est possible
    Par stan21 dans le forum Access
    Réponses: 2
    Dernier message: 01/02/2006, 10h22
  3. Cette requête est-elle valide?
    Par FrankOVD dans le forum Requêtes
    Réponses: 4
    Dernier message: 13/01/2006, 19h21

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