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

WinDev Discussion :

Optimisation de requêtes


Sujet :

WinDev

  1. #1
    Membre actif Avatar de thierrybatlle
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2005
    Messages : 618
    Points : 222
    Points
    222
    Par défaut Optimisation de requêtes
    Bonjour,

    J'ai dans mon code des requêtes sur plusieurs tables qui me remontent des millier de résultats.
    Mon problème c'est qu'elle sont longue à s'exécuter, je cherche des pistes pour optimiser mes requêtes ou pour les éclater en plusieurs requêtes ou pour optimiser mes liens.
    Voici un exemple de requête :
    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
     
    SELECT DISTINCT
    T_produits.T_produits_num AS T_produits_num,	
    T_produits.T_produits_dateAchat AS T_produits_dateAchat,	
    T_clients.T_clients_responsable AS T_clients_responsable,	
    T_clients.T_clients_prenom AS T_clients_prenom,	
    T_clients.T_clients_RS AS T_clients_RS,	
    T_clients.T_clients_tel AS T_clients_tel,	
    T_clients.T_clients_GSM1 AS T_clients_GSM1,	
    T_clients.T_clients_ad1,
    T_distributeurs.T_distributeurs_nom AS T_distributeurs_nom,	
    T_villes.T_villes_cp AS T_villes_cp,	
    T_villes.T_villes_nom AS T_villes_nom,
    T_typeIntervention.T_typeIntervention_initiales
    FROM 
    T_intervention INNER JOIN T_typeIntervention ON T_typeIntervention.T_typeIntervention_ID	=	T_intervention.T_intervention_typeInter,	
    T_villes LEFT OUTER JOIN T_pays ON T_pays.T_pays_ID	=	T_villes.T_villes_numPays,	
    T_clients LEFT OUTER JOIN T_villes ON T_villes.T_villes_ID	=	T_clients.T_clients_numVille,	
    T_produits LEFT OUTER JOIN T_distributeurs ON T_distributeurs.T_distributeurs_ID	=	T_produits.T_produits_numDistributeur,	
    T_produits LEFT OUTER JOIN T_clients ON T_clients.T_clients_ID	=	T_produits.T_produits_numClient,	
    T_intervention RIGHT OUTER JOIN T_produits ON T_produits.T_produits_ID	=	T_intervention.T_intervention_numProduit
    WHERE 
    (
    T_produits.T_produits_numSecatTrie >70000 AND 
    T_distributeurs.T_distributeurs_nom LIKE '%'
     AND	T_distributeurs.T_distributeurs_numType =1
    AND	T_distributeurs.T_distributeurs_numPays LIKE '%'
      AND T_typeIntervention.T_typeIntervention_initiales LIKE '%'
    AND	T_intervention.T_intervention_date BETWEEN 19000101 AND 20100402
    )
    ORDER BY 
    T_distributeurs_nom ASC
    Merci à tous.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Déjà, tu peux enlever tous les like '%' qui ne servent à rien.
    Ensuite il faut vérifier si toutes les clé étrangères sont bien indexées (pour optimiser les jointures), ainsi que les colonnes utilisés dans la clause WHERE.

    Tatayo.

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    A tester mais à priori faire sauter le DISTINCT et préférer une condition dans une sous requête à base de EXISTS ou de IN.

    Je m'explique. Si je veux la liste des clients qui ont des impayées, je dois faire une jointure sur des tables de facture. Mais comme je ne veux que des usagers, je vais avoir envie de faire un distinct pour n'avoir qu'une seule ligne par client.

    Il est préférable de n'avoir que CLIENT dans le FROM et de filtrer WHERE EXISTS/ WHERE IDCLIENT IN et d'exprimer la notion d'impayer à cet endroit.

  4. #4
    Membre expert
    Avatar de Emmanuel Lecoester
    Profil pro
    Inscrit en
    Février 2003
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2003
    Messages : 1 493
    Points : 3 266
    Points
    3 266
    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
    SELECT 
    T_produits.T_produits_num AS T_produits_num,    
    T_produits.T_produits_dateAchat AS T_produits_dateAchat,    
    T_clients.T_clients_responsable AS T_clients_responsable,    
    T_clients.T_clients_prenom AS T_clients_prenom,    
    T_clients.T_clients_RS AS T_clients_RS,    
    T_clients.T_clients_tel AS T_clients_tel,    
    T_clients.T_clients_GSM1 AS T_clients_GSM1,    
    T_clients.T_clients_ad1,
    T_distributeurs.T_distributeurs_nom AS T_distributeurs_nom,    
    T_villes.T_villes_cp AS T_villes_cp,    
    T_villes.T_villes_nom AS T_villes_nom,
    T_typeIntervention.T_typeIntervention_initiales
    FROM 
    T_intervention INNER JOIN T_typeIntervention ON T_typeIntervention.T_typeIntervention_ID    =    T_intervention.T_intervention_typeInter,    
    T_villes LEFT OUTER JOIN T_pays ON T_pays.T_pays_ID    =    T_villes.T_villes_numPays,    
    T_clients LEFT OUTER JOIN T_villes ON T_villes.T_villes_ID    =    T_clients.T_clients_numVille,    
    T_produits LEFT OUTER JOIN T_distributeurs ON T_distributeurs.T_distributeurs_ID    =    T_produits.T_produits_numDistributeur and AND   T_distributeurs.T_distributeurs_numType =1,    
    T_produits LEFT OUTER JOIN T_clients ON T_clients.T_clients_ID    =    T_produits.T_produits_numClient and T_produits.T_produits_numSecatTrie >70000,    
    T_intervention RIGHT OUTER JOIN T_produits ON T_produits.T_produits_ID    =    T_intervention.T_intervention_numProduit
    WHERE T_intervention.T_intervention_date BETWEEN 19000101 AND 20100402)
    De manière générale
    - Retrait du distinct
    - Retrait des like inutile
    - Les left outer join bouffe bcp plus de ressources...
    - dans le cas de left outer join on met les restriction dans le left et non dans la clause where (résultats différents)

    Maintenant je ne comprends pas trop l'interet de tout récupérer la base en une seule requete
    Emmanuel Lecoester
    => joomla addict.

  5. #5
    Membre actif Avatar de thierrybatlle
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2005
    Messages : 618
    Points : 222
    Points
    222
    Par défaut
    Effectivement je ne suis pas obligé de tout récupérer dans une seule et unique requête.
    Je pense qu'avec une seule requête j'évite de surcharger le réseau.
    Sinon quel serait le chemin à suivre en faisant plusieurs requêtes.

    Merci

  6. #6
    Membre expert
    Avatar de Emmanuel Lecoester
    Profil pro
    Inscrit en
    Février 2003
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2003
    Messages : 1 493
    Points : 3 266
    Points
    3 266
    Par défaut
    la question est surtout : pourquoi autant de jointures ouvertes
    Emmanuel Lecoester
    => joomla addict.

  7. #7
    Membre actif Avatar de thierrybatlle
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2005
    Messages : 618
    Points : 222
    Points
    222
    Par défaut
    Je dois récupérer, pour les afficher, des données qui se trouvent dans plusieurs tables et donc pour les remonter je n'ai pas d'autres choix que de faire des jointures.

    Je n'ai pas l'habitude de faire des requêtes sur autant de tables et je ne sais pas vraiment comment m'y prendre.

    En gros j'ai une fenêtre avec des champs à remplir qui sont mes options de recherche.

    Je peux rechercher par le numéro de produit qui se trouve dans ma table produit ET/OU rechercher par le type de distributeur (revendeur, agent, ...) qui est une autre table ET/OU par le nom du distributeur qui est ma table distributeurs .... et ainsi de suite.

    En tout je dispose sur ma fenêtre de 11 critères de recherche possible et ces critères ne sont par tous sur une seule et unique table d'où mes jointures pour remonter les données.

Discussions similaires

  1. [Access] Optimisation performance requête - Index
    Par fdraven dans le forum Access
    Réponses: 11
    Dernier message: 12/08/2005, 14h30
  2. Optimisation de requête avec Tkprof
    Par stingrayjo dans le forum Oracle
    Réponses: 3
    Dernier message: 04/07/2005, 09h50
  3. Optimiser une requête SQL d'un moteur de recherche
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2005, 20h55
  4. optimisation des requêtes
    Par yech dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/09/2004, 19h03
  5. Optimisation de requête
    Par olivierN dans le forum SQL
    Réponses: 10
    Dernier message: 16/12/2003, 10h09

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