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

MySQL Discussion :

Requete gourmande à ameliorer [MySQL-5.6]


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 185
    Par défaut Requete gourmande à ameliorer
    Bonjour à tous,
    J'ai un probleme d'amelioration de performanaces d'une de mes requetes, le temps de traitement s'éleve à 2s.
    Ci-dessous la requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT trk.TrkTypeID , trk.TrkID as TrkID, tst.TrkStatusTypeID, jb.StatusTypeID , trk.JobID  , 
    jb.StartDate ,  trkm.DocumentType ,  trkm.InterchangeNb 
     
    FROM tracking trk 
    INNER JOIN TrackingStatusType tst on tst.TrkStatusTypeID=trk.TrkStatusTypeID 
    INNER JOIN Job jb on trk.JobID = jb.JobID  
    INNER JOIN _Interchange trkm ON trkm.TrkID=trk.TrkID  
    WHERE trk.EnvID = 42   AND trk.TrkTypeID = 15  
    Order BY  jb.StartDate DESC   LIMIT 20
    la table tracking contient 775 615 enregistrements
    la table TrackingStatusType contient 22 enregistrements
    la table Job contient 17 millions enregistrements
    la table _Interchange contient 315 000 enregistrements

  2. #2
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    Peux-tu nous donner la listes des index existant pour les tables concernées par cette requête ?

    Cordialement,
    Patrick Kolodziejczyk.


    EDIT :
    Que retourne le plan d'exécution pour la requête ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    EXPLAIN SELECT trk.TrkTypeID , trk.TrkID as TrkID, tst.TrkStatusTypeID, jb.StatusTypeID , trk.JobID  , 
    jb.StartDate ,  trkm.DocumentType ,  trkm.InterchangeNb 
     
    FROM tracking trk 
    INNER JOIN TrackingStatusType tst on tst.TrkStatusTypeID=trk.TrkStatusTypeID 
    INNER JOIN Job jb on trk.JobID = jb.JobID  
    INNER JOIN _Interchange trkm ON trkm.TrkID=trk.TrkID  
    WHERE trk.EnvID = 42   AND trk.TrkTypeID = 15  
    Order BY  jb.StartDate DESC   LIMIT 20
    Note : Le order by étant réalisé avant le limit, le coût de la requête est équivalant à la même requête sans le limit;
    Combien de ligne retourne cette requête sans limit ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT count(*)
    FROM tracking trk 
    INNER JOIN TrackingStatusType tst on tst.TrkStatusTypeID=trk.TrkStatusTypeID 
    INNER JOIN Job jb on trk.JobID = jb.JobID  
    INNER JOIN _Interchange trkm ON trkm.TrkID=trk.TrkID  
    WHERE trk.EnvID = 42   AND trk.TrkTypeID = 15
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  3. #3
    Membre chevronné Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Par défaut Grilled by kolodz
    Salut,

    Peux tu nous retourner le résultat de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql> describe tracking;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql> describe TrackingStatusType;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql> describe _Interchange;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    mysql> describe SELECT trk.TrkTypeID , trk.TrkID as TrkID, tst.TrkStatusTypeID, jb.StatusTypeID , trk.JobID  , 
    jb.StartDate ,  trkm.DocumentType ,  trkm.InterchangeNb 
     
    FROM tracking trk 
    INNER JOIN TrackingStatusType tst on tst.TrkStatusTypeID=trk.TrkStatusTypeID 
    INNER JOIN Job jb on trk.JobID = jb.JobID  
    INNER JOIN _Interchange trkm ON trkm.TrkID=trk.TrkID  
    WHERE trk.EnvID = 42   AND trk.TrkTypeID = 15  
    Order BY  jb.StartDate DESC   LIMIT 20;
    Ca prend 2s, ok, mais sur quel machine ?

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 185
    Par défaut
    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
     
    CREATE TABLE IF NOT EXISTS `_interchange` (
      `TrkID` int(10) unsigned NOT NULL,
      `SyntaxID` varchar(4) DEFAULT NULL,
      `SyntaxVersion` varchar(1) DEFAULT NULL,
      `TestID` varchar(1) DEFAULT NULL,
      `FileName` varchar(100) DEFAULT NULL,
      `MessageNb` int(10) DEFAULT NULL,
      `InterchangeDate` date DEFAULT NULL,
      `InterchangeNb` varchar(35) DEFAULT NULL,
      `SourceFile` varchar(70) DEFAULT NULL,
      `OutputFile` varchar(70) DEFAULT NULL,
      `Recipient` varchar(50) DEFAULT NULL,
      `Sender` varchar(50) DEFAULT NULL,
      `DocumentType` varchar(50) DEFAULT NULL,
      PRIMARY KEY (`TrkID`),
      KEY `InterchangeDate` (`InterchangeDate`),
      KEY `InterchangeNb` (`InterchangeNb`),
      KEY `SourceFile` (`SourceFile`),
      KEY `OutputFile` (`OutputFile`),
      KEY `Recipient` (`Recipient`),
      KEY `Sender` (`Sender`),
      KEY `DocumentType` (`DocumentType`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
     
     
    CREATE TABLE IF NOT EXISTS `Tracking` (
      `TrkID` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `TrkTypeID` smallint(5) unsigned NOT NULL,
      `JobID` int(10) unsigned NOT NULL,
      `Visible` tinyint(1) NOT NULL DEFAULT '1',
      `EnvID` int(5) unsigned NOT NULL,
      `TrkStatusTypeID` mediumint(8) unsigned NOT NULL DEFAULT '0',
      `LockUserID` int(10) unsigned DEFAULT NULL,
      `CreationDate` datetime DEFAULT NULL,
      PRIMARY KEY (`TrkID`),
      KEY `TrkTypeID` (`TrkTypeID`),
      KEY `JobID` (`JobID`),
      KEY `TrkStatusTypeID` (`TrkStatusTypeID`),
      KEY `LockUserID` (`LockUserID`),
      KEY `EnvID_TrkTypeID` (`EnvID`,`TrkTypeID`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1460347 ;
     
     
    CREATE TABLE IF NOT EXISTS `TrackingStatusType` (
      `TrkStatusTypeID` mediumint(8) unsigned NOT NULL,
      `Alias` varchar(20) NOT NULL,
      `LabelID` int(10) unsigned DEFAULT NULL,
      PRIMARY KEY (`TrkStatusTypeID`),
      KEY `LabelID` (`LabelID`),
      KEY `AliasID` (`Alias`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
     
     
    CREATE TABLE IF NOT EXISTS `job` (
      `JobID` int(10) unsigned NOT NULL,
      `StartDate` datetime NOT NULL,
      `EndDate` datetime DEFAULT NULL,
      `Duration` int(10) unsigned DEFAULT NULL,
      `ParentJobID` int(10) unsigned DEFAULT NULL,
      `SessionJobID` int(10) unsigned DEFAULT NULL,
      `JobTypeID` smallint(5) unsigned NOT NULL,
      `StatusTypeID` mediumint(8) unsigned NOT NULL,
      `Visible` tinyint(1) NOT NULL,
      `EnvID` int(5) unsigned NOT NULL,
      `Description` text,
      PRIMARY KEY (`JobID`),
      KEY `ParentJobID` (`ParentJobID`),
      KEY `SessionJobID` (`SessionJobID`),
      KEY `JobTypeID` (`JobTypeID`),
      KEY `StatusTypeID` (`StatusTypeID`),
      KEY `EnvID` (`EnvID`),
      KEY `StartDate` (`StartDate`),
      KEY `Duration` (`Duration`),
      KEY `StartDate_DESC` (`StartDate`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 185
    Par défaut
    Le résultat d' explain de la requete.
    Le résultat de la requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT count(*)
    FROM tracking trk 
    INNER JOIN TrackingStatusType tst on tst.TrkStatusTypeID=trk.TrkStatusTypeID 
    INNER JOIN Job jb on trk.JobID = jb.JobID  
    INNER JOIN _Interchange trkm ON trkm.TrkID=trk.TrkID  
    WHERE trk.EnvID = 42   AND trk.TrkTypeID = 15
    est de 308 236
    Images attachées Images attachées  

  6. #6
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    Du coup, il a-t-il un index sur la table tracking pour les colonnes EnvID et TrkTypeID ?
    Note : Peux-tu ajouter le nombre de ligne retournée par la requête ajouté dans mon édite de mon dernier message ?
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  7. #7
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 185
    Par défaut
    @kolodz
    EnvID_TrkTypeID est un index que j'avais rajouté sur la table tracking pour répondre à ma requete qui contient toujours ces 2 criteres.
    Le nombre de la requete que vous m'avez demandé est sur mon dernier poste, merci de raffrachir le navigateur.

  8. #8
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    A mon avis le temps perdu est lié à l'order by avant le limit. Car, le nombre d'entrées à trier est assez conséquence.

    A confirmer avec une requête sans l'order by :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT trk.TrkTypeID , trk.TrkID as TrkID, tst.TrkStatusTypeID, jb.StatusTypeID , trk.JobID  , 
    jb.StartDate ,  trkm.DocumentType ,  trkm.InterchangeNb 
     
    FROM tracking trk 
    INNER JOIN TrackingStatusType tst on tst.TrkStatusTypeID=trk.TrkStatusTypeID 
    INNER JOIN Job jb on trk.JobID = jb.JobID  
    INNER JOIN _Interchange trkm ON trkm.TrkID=trk.TrkID  
    WHERE trk.EnvID = 42   AND trk.TrkTypeID = 15  
    LIMIT 20;
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. requete trop gourmande
    Par nicerico dans le forum Requêtes
    Réponses: 3
    Dernier message: 26/03/2009, 14h23
  2. Amelioration de requete
    Par xian21 dans le forum Requêtes
    Réponses: 5
    Dernier message: 08/01/2009, 11h20
  3. Amelioration de requete
    Par xclam dans le forum SQL
    Réponses: 14
    Dernier message: 27/09/2007, 11h27
  4. Requete gourmande en base oracle 9I
    Par Mehdilis dans le forum Oracle
    Réponses: 1
    Dernier message: 29/06/2007, 08h48
  5. [MySQL] Amélioration Requête SQL
    Par Biboune2006 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 28/07/2006, 15h27

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