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

Requêtes MySQL Discussion :

Jointure et temps d'exécution


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 41
    Points : 39
    Points
    39
    Par défaut Jointure et temps d'exécution
    Bonjour,

    Je cherche depuis plusieurs jours à optimiser une Jointure classique entre deux tables afin que celle ci dure moins de 0.10sec

    Cette jointure est exécutée 2.700.000 de fois avec des paramètres variants à chaque fois.
    à 0.10sec par requête cela ferait un traitement de 3 jours.
    J'en suis très loin ! ma jointure prends généralement 0.5 voir plus (jusqu'à 1.5sec) soit une estimation de 20 jours.

    La Question est :
    Est il envisageable de réaliser via Mysql, une Jointure simple entre deux tables "volumineuses" contenant respectivement chacune 3.000.000 d'un côté (table de sélection) et 8.000.000 de l'autre (table de liaison) le tout en moins de 0.10sec ? (sans cache, il s'agit de requêtes uniques)

    Cela vous parait il raisonnable ou il est normal qu'une jointure de ce type mette autant de temps ?

    cordialement

  2. #2
    Membre averti
    Profil pro
    Administrateur
    Inscrit en
    Mai 2008
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2008
    Messages : 237
    Points : 433
    Points
    433
    Par défaut
    Citation Envoyé par mickael.camelot Voir le message
    Bonjour,

    Je cherche depuis plusieurs jours à optimiser une Jointure classique entre deux tables afin que celle ci dure moins de 0.10sec

    Cette jointure est exécutée 2.700.000 de fois avec des paramètres variants à chaque fois.
    à 0.10sec par requête cela ferait un traitement de 3 jours.
    J'en suis très loin ! ma jointure prends généralement 0.5 voir plus (jusqu'à 1.5sec) soit une estimation de 20 jours.

    La Question est :
    Est il envisageable de réaliser via Mysql, une Jointure simple entre deux tables "volumineuses" contenant respectivement chacune 3.000.000 d'un côté (table de sélection) et 8.000.000 de l'autre (table de liaison) le tout en moins de 0.10sec ? (sans cache, il s'agit de requêtes uniques)

    Cela vous parait il raisonnable ou il est normal qu'une jointure de ce type mette autant de temps ?

    cordialement
    Les tables sont trop grandes pour atteindre ce genre de performance. Je pense qu'il faut revoir la modélisation pour baisser le coût d'exécution des requête. et aussi vu que c'est un traitement batch, il faudra penser peut-être lancer plusieurs process en parallèle.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 41
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    malheureusement c'est le découpage le plus fin que nous puissions faire.
    Il s'agit d'une simple table de liaison.

    Une vidéothèque doit avoir le même problème.
    un film peut appartenir à plusieurs genres.

    SELECT ID_FILM
    FROM FILM_GENRE
    WHERE ID_GENRE IN (1,2,3,4,5,6,7,8,9,10)

    C'est un processus métier très commun, je ne comprends pas que ce processus soit aussi long.

    Vous me confirmez donc que ce genre de traitement a un temps d'exécution proportionnel au volume de données ?

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    la question que je me pose, c'est pourquoi vouloir exécuter 2.700.000 fois une requête ..? (même si certain paramètre varie.)

    Ca ressemble à un traitement itératif, alors que sql est un langage ensembliste.

  5. #5
    Membre confirmé
    Avatar de tse_jc
    Homme Profil pro
    Data Solutions
    Inscrit en
    Août 2010
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Data Solutions
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 287
    Points : 597
    Points
    597
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    N'oubliez pas que MySQL reste MySQL, et à ce titre l'optimiseur va vous scanner la table temporaire dans le cadre d'un WHERE .... IN

    Avec MySQL privilégiez toujours la jointure à ce genre de structure de requête.

    Cordialement,

    Jc.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 821
    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 821
    Points : 52 892
    Points
    52 892
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par mickael.camelot Voir le message
    ...
    Vous me confirmez donc que ce genre de traitement a un temps d'exécution proportionnel au volume de données ?
    Oui dans MySQL, non dans la plupart des vrais SGBD Relationnels.

    En effet, MySQL dispose d'un optimiseur très pauvre par rapport à la concurrence et surtout il ne sait pas faire des requêtes multithreadées.
    Par exemple dans oracle ou SQL Server, dès que le volume est important, la requête est distribuée sur tous les CPU ce qui divise d’autant les temps de réponse.
    En sus, Oracle ou SQL Server savent faire des vues indexées (ou matérialisées) qui précaculent en temps réel, des données venant de requêtes. Dans ce cas, le résultat est instantané quelque soit la volumétrie !

    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/ * * * * *

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 948
    Points : 5 847
    Points
    5 847
    Par défaut
    Je suis d'accord avec Punkoff, d'où viennent ces 2 700 000 exécutions...
    Par ailleurs comment sont passés ces paramètres ? La requête est elle bien préparée puis exécutée 2 millions de fois ?
    Je ne sais pas si ça fait une grosse différence sur mysql mais en général, c'est capitale de préparer la requête.

Discussions similaires

  1. Réponses: 24
    Dernier message: 06/12/2013, 12h10
  2. Temps d'exécution très long : jointure
    Par ddazou dans le forum SQL
    Réponses: 18
    Dernier message: 28/10/2008, 21h59
  3. Réponses: 2
    Dernier message: 25/05/2004, 15h33
  4. Affichage du temps d'exécution d'une requête
    Par milka dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/03/2004, 17h48
  5. Temps d'exécution des instructions FPU
    Par ubi dans le forum Assembleur
    Réponses: 2
    Dernier message: 24/10/2003, 18h39

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