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 :

Réduire le temps d'exécution de ma requête


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Autodidacte
    Inscrit en
    Octobre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Autodidacte

    Informations forums :
    Inscription : Octobre 2006
    Messages : 58
    Points : 38
    Points
    38
    Par défaut Réduire le temps d'exécution de ma requête
    bonjour,

    la requête suivante fonctionne mais nécessite plus de 6secondes pour retourner les résultats !
    aussi je cherche de l'aide pour améliorer les performances.

    merci par avance de votre aide
    starting 0.000021
    Opening tables 0.000030
    System lock 0.000005
    init 0.000004
    optimizing 0.000003
    statistics 0.000005
    preparing 0.000004
    executing 0.000165
    Sending data 0.000011
    end 0.000003
    query end 0.000002
    closing tables 0.000002
    removing tmp table 0.000004
    closing tables 0.000003
    freeing items 0.000029
    logging slow query 0.000040
    cleaning up 0.000006


    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
    SELECT cbo_emploi_candidats.id, cbo_emploi_candidats.nom, cbo_emploi_candidats.coef, cbo_emploi_candidats.prenom, cbo_emploi_candidats.tel, cbo_emploi_candidats.code_postal, cbo_emploi_candidats.ville, cbo_rep_recrut.date_rep, cbo_emploi_type_poste.type_poste
    FROM cbo_emploi_candidats
    JOIN cbo_emploi_type_poste
      ON cbo_emploi_type_poste.id_poste_cat = cbo_emploi_candidats.qualification
      JOIN cbo_rep_recrut
      ON cbo_rep_recrut.id_candidat = cbo_emploi_candidats.id
     
        WHERE  recherche_emploi='1' AND ( cbo_emploi_candidats.id IN (SELECT id_candidat
    FROM cbo_rep_recrut
    JOIN cbo_emploi ON cbo_rep_recrut.id_annonce = cbo_emploi.id_emploi
    WHERE cbo_emploi.id_mb_annonceur =  '" . $_SESSION['id_user'] . "' AND cbo_rep_recrut.reponse=  '1' AND verifie!=  '4' ) OR cbo_emploi_candidats.id IN (SELECT  cbo_emploi_candidats.id
    FROM  `cbo_achat_coordonnees`
    LEFT JOIN cbo_emploi_candidats ON cbo_emploi_candidats.id = cbo_achat_coordonnees.id_candidat
     
    WHERE  id_officine='" . $_SESSION['id_user'] . "'
    ) ) GROUP BY cbo_emploi_candidats.id

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 129
    Points : 38 540
    Points
    38 540
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Difficile de vous aider efficacement, sans avoir le DDL de vos tables et index, et sans connaitre les volumes ni la base de données.

    Quelques pistes toutefois :
    - pour vos tests d'existence, remplacez "where toto in (select toto from...)" par "where exists (select 1 from..."
    - ce bout de requete "... AND verifie!= '4' ) OR cbo_emploi_candidats.id IN (SELECT... " cumule un prédicat "Not =" avec un OR, 2 bonnes raison pour que vos index si présents ne soient pas éligibles, essayez de trouver une autre approche pour éviter ces écueils

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 759
    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 759
    Points : 52 538
    Points
    52 538
    Billets dans le blog
    5
    Par défaut
    Pourquoi faite vous un GROUP BY qui ne sert à rien ? (sauf si vous êtes masochistes et que vous aimez pourrir vos requêtes !) ????

    Accessoirement :
    1) connaissez vous la notion d'alias de table ?
    2) savez vous que DIFFERENT DE s'écir en SQL <> et non != ?

    Enfin ,postez le DDL de vos tables....

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

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Autodidacte
    Inscrit en
    Octobre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Autodidacte

    Informations forums :
    Inscription : Octobre 2006
    Messages : 58
    Points : 38
    Points
    38
    Par défaut
    bonjour et merci pour vos reponses, j'ai reussi a reduire le temps d'execution par 10.

    j'utilise groupe BY pour dedoubler mes resultats

    mais afin de m'ameliorer j'aimerai bien que vous me donniez votre avis.

    qu'estce que le DDL ? la structure?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        SELECT cbo_emploi_candidats.id, cbo_emploi_candidats.nom, cbo_emploi_candidats.coef, cbo_emploi_candidats.prenom, cbo_emploi_candidats.tel, cbo_emploi_candidats.code_postal, cbo_emploi_candidats.ville, cbo_rep_recrut.date_rep, cbo_emploi_type_poste.type_poste
    FROM cbo_emploi_candidats
    JOIN cbo_emploi_type_poste
      ON cbo_emploi_type_poste.id_poste_cat = cbo_emploi_candidats.qualification
      JOIN cbo_rep_recrut
      ON cbo_rep_recrut.id_candidat = cbo_emploi_candidats.id
    JOIN cbo_emploi ON cbo_rep_recrut.id_annonce = cbo_emploi.id_emploi
        WHERE  recherche_emploi='1' AND cbo_rep_recrut.reponse=  '1' AND verifie!=  '4' AND cbo_emploi.id_mb_annonceur =  '" . $_SESSION['id_user'] . "' OR cbo_emploi_candidats.id IN (SELECT  cbo_emploi_candidats.id
    FROM  `cbo_achat_coordonnees`
    LEFT JOIN cbo_emploi_candidats ON cbo_emploi_candidats.id = cbo_achat_coordonnees.id_candidat
     
    WHERE  id_officine='" . $_SESSION['id_user'] . "'
    )  GROUP BY cbo_emploi_candidats.id

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 129
    Points : 38 540
    Points
    38 540
    Billets dans le blog
    9
    Par défaut
    Le DDL c'est le Data Definition Language, autrement dit le script qui permet de définir vos database, tablespace, table, index et autres objets de bases de données

    Vous n'avez tenu aucun compte des remarques précédentes, ni sur les alias, ni sur le test d'existence, ni sur la façon de coder une inégalité

    Voici un corrigé rapide, et j'en ai profité pour formater la présentation, c'est quand même autrement plus facile à lire, en rouge, ce que vous auriez pu (du) faire en tenant compte des posts précédents

    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
    SELECT EC.id,
           EC.nom,
           EC.coef,
           EC.prenom,
           EC.tel,
           EC.code_postal,
           EC.ville,
           RR.date_rep,
           TP.type_poste
    FROM cbo_emploi_candidats   as EC
    JOIN cbo_emploi_type_poste  as TP 
      ON TP.id_poste_cat = EC.qualification
    JOIN cbo_rep_recrut         as RR 
      ON RR.id_candidat  = EC.id
    JOIN cbo_emploi as EM 
      ON EM.id_emploi    = RR.id_annonce
    WHERE recherche_emploi='1'
      AND RR.reponse= '1'
      AND verifie  not = '4' 
      AND EM.id_mb_annonceur = '" . $_SESSION['id_user'] . "'
       OR exists (select 1 
                  from `cbo_achat_coordonnees` as AC
                  WHERE AC.id_candidat = EC.id  
                    AND AC.id_officine='" . $_SESSION['id_user'] . "' 
    )
    GROUP BY EC.id
    A noter : vous avez une combinaison and / or sans parenthèses dans votre filtrage qui est bigrement dangereuse
    Je l'ai laissée telle qu'elle faute de savoir où positionner les parenthèses pour lever toute équivoque, à vous de les ajouter.

  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 759
    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 759
    Points : 52 538
    Points
    52 538
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par fwebconcept Voir le message
    j'utilise groupe BY pour dedoubler mes resultats
    Un GROUP BY n'a pas vocation à dédoublonner ! Seule l'opérateur DISTINCT le fait.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/06/2007, 12h10
  2. [MySQL] temps d'ouverture d'une connexion VS temps d'exécution d'une requête
    Par epoz dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 25/04/2007, 18h06
  3. Calculer le temps d'exécution d'une requête
    Par BRAUKRIS dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 16/03/2007, 12h59
  4. [MySQL] Temps d'exécution d'une requête
    Par eon-of-the-scorn dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/07/2006, 11h06
  5. 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

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