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

HyperFileSQL Discussion :

[WD17] Requête lente suite à MAJ


Sujet :

HyperFileSQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Developpeur WINDEV
    Inscrit en
    Août 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Developpeur WINDEV

    Informations forums :
    Inscription : Août 2012
    Messages : 4
    Points : 4
    Points
    4
    Par défaut [WD17] Requête lente suite à MAJ
    Bonjour à tous,

    J'ai fait une mise à jour de Windev aujourd'hui.
    Je suis donc maintenant à la version 01F170078N#

    Je travaille avec des fichier HyperFile Classic

    Mon problème est le suivant :
    Toutes mes requêtes SQL sont devenues beaucoup plus lentes suite à cette mise à jour.

    Une requête qui avait un temps d'exécution de 25 centièmes de secondes, mais maintenant sous la nouvelle version une vingtaine de secondes.

    Apparement, cette nouvelle version de Windev 17 gèrerait de manière plus "stricte" les jointures externes.

    Je me suis donc posé la question : Est ce que j'écris correctement mes requêtes SQL ?
    (Je ne passe plus du tout par l'éditeur de requêtes parce qu'il est très limité à mon sens)

    Je vous poste donc le code SQL de ma requête afin que vous puissiez l'analyser, et m'aider à comprendre pourquoi elle est si lente

    Merci d'avance de vos futures réponse

    Cordialement

    Sylvain Riviere


    Le code SQL de la requête :

    Code sql : 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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    SELECT
     
    LigneCommande.IDLigneCommande 									AS IDLigneCommande,
    LigneCommande.NumeroLigneCommande 								AS NumeroLigneCommande,
    Commande.IDCommande 											AS IDCommande,
    Commande.NumeroCommande 										AS NumeroCommande,
    Commande.Date 													AS Commande_Date,
    C2.RaisonSociale 												AS RaisonSociale_ClientLivre,
    C1.RaisonSociale 												AS RaisonSociale_ClientFacture,
    Affaire.IDAffaire 												AS IDAffaire,
    Type_Affaire.Libellé 											AS Type_Affaire_Libelle,
    Besoin_Machine.IDBesoin_Machine 								AS IDBesoin_Machine,
    Besoin_Modele.Date_Prev_Livraison 								AS Date_Prev_Livraison,
    LigneCommande.TypeModele 										AS TypeModele,
    LigneCommande.Modele 											AS Modele,
    Configuration.Libellé 											AS Configuration_Libelle,
    Sourcing.Libellé 												AS Sourcing_Libelle,
    LigneCommande.Date_SU_Previsionnelle 							AS Date_SU_Previsionnelle,
    LigneCommande.Date_SU_Reelle 									AS Date_SU_Reelle,
    LigneCommande.Numero_MSO 										AS Numero_MSO,
    LigneCommande.Numero_Serie 										AS Numero_Serie,
    LigneCommande.Numero_Sourcing 									AS Numero_Sourcing,
    LigneCommande.SendAfter 										AS SendAfter,
    LigneCommande.SendBefore 										AS SendBefore,
    LigneCommande.Date_SU_Demandee 									AS Date_SU_Demandee,
    LigneCommande.DealerCode 										AS DealerCode,
    LigneCommande.NumeroReservation 								AS NumeroReservation,
    LigneCommande.SPAR_Upfront_Numero 								AS SPAR_Upfront_Numero,
    LigneCommande.SPAR_Upfront_Pourcentage 							AS SPAR_Upfront_Pourcentage,
    LigneCommande.SPAR_Numero 										AS SPAR_Numero,
    LigneCommande.SPAR_Pourcentage 									AS SPAR_Pourcentage,
    LigneCommande.MarketingPlan_Numero 								AS MarketingPlan_Numero,
    LigneCommande.PositionAutreDealer_DealerCode 					AS PositionAutreDealer_DealerCode,
    LigneCommande.PositionAutreDealer_NumeroMSO 					AS PositionAutreDealer_NumeroMSO,
    LigneCommande.Commentaires_OrdreCommande 						AS Commentaires_OrdreCommande,
    LigneCommande.FicheConfiguration								AS FicheConfiguration,
    LigneCommande.FicheConfiguration_Chemin							AS FicheConfiguration_Chemin,
     
    Statut_Attribution.Libellé 										AS Statut_Attribution_Libelle,
    Affaire.Incoterms + ' ' + Affaire.Incoterms_Destination 			AS Incoterms,
    Statut_Avancement_Administratif.Libellé 						AS Statut_Avancement_Administratif_Libelle,
    Besoin_Modele.IDBesoin_Modele 									AS IDBesoin_Modele,
    LigneCommandeParent.NumeroLigneCommande 						AS NumeroLigneCommande_Parent,
    Statut_Localisation.Libellé 									AS Statut_Localisation_Libelle,
    LigneCommande.Lieu 												AS Lieu,
     
    Facture_Magellan.NumeroFacture 									AS Facture_Magellan_NumeroFacture,
    Facture_Magellan.DateFacture 									AS Facture_Magellan_DateFacture,
     
    Facture_Fournisseur.NumeroFacture								AS Facture_Fournisseur_NumeroFacture,	
    Facture_Fournisseur.DateFacture									AS Facture_Fournisseur_DateFacture
     
     
    FROM
     
    LigneCommande INNER JOIN Commande ON 
    LigneCommande.IDCommande = Commande.IDCommande,
     
    LigneCommande INNER JOIN Statut_Avancement_Administratif ON 
    LigneCommande.IDStatut_Avancement_Administratif = Statut_Avancement_Administratif.IDStatut_Avancement_Administratif,
     
    LigneCommande INNER JOIN Statut_Localisation ON 
    LigneCommande.IDStatut_Localisation = Statut_Localisation.IDStatut_Localisation,
     
    LigneCommande LEFT OUTER JOIN  Attribution ON 
    LigneCommande.IDAttribution = Attribution.IDAttribution,
     
    Attribution LEFT OUTER JOIN  Besoin_Machine ON 
    Attribution.IDAttribution = Besoin_Machine.IDAttribution,
     
    Attribution LEFT OUTER JOIN  Statut_Attribution ON 
    Attribution.IDStatutAttribution = Statut_Attribution.IDStatutAttribution,
     
    Besoin_Machine LEFT OUTER JOIN  Besoin_Modele ON 
    Besoin_Machine.IDBesoin_Modele = Besoin_Modele.IDBesoin_Modele,
     
    Besoin_Modele LEFT OUTER JOIN  Affaire ON 
    Besoin_Modele.IDAffaire = Affaire.IDAffaire,
     
    Affaire LEFT OUTER JOIN  Type_Affaire ON 
    Affaire.IDType_Affaire = Type_Affaire.IDType_Affaire,
     
    LigneCommande LEFT OUTER JOIN Configuration ON 
    LigneCommande.IDConfiguration = Configuration.IDConfiguration,
     
    LigneCommande LEFT OUTER JOIN Sourcing ON 
    LigneCommande.Numero_Sourcing = Sourcing.Numero_Sourcing,
     
    Affaire LEFT OUTER JOIN Client C2 ON 
    Affaire.Client_Livre_Numero = C2.NumeroClient,
     
    Affaire LEFT OUTER JOIN Client C1 ON 
    Affaire.Client_Facture_Numero = C1.NumeroClient,
     
    LigneCommande LEFT OUTER JOIN LigneCommande LigneCommandeParent ON 
    LigneCommande.IDLigneCommande_Parent = LigneCommandeParent.IDLigneCommande,
     
    LigneCommande LEFT OUTER JOIN Facture_Magellan ON 
    LigneCommande.IDFacture_Magellan = Facture_Magellan.IDFacture_Magellan,
     
    Commande LEFT OUTER JOIN Facture_Fournisseur ON 
    Commande.IDFacture_Fournisseur = Facture_Fournisseur.IDFacture_Fournisseur

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 100
    Points
    1 100
    Par défaut
    16 fichiers pour tes données ?
    Tu dois vraiment avoir peu de données...
    Moi déjà à 3 ça n'avance plus à rien...
    Bon, déjà, as-tu vraiment besoin de tous ces fichiers ?
    Ensuite, je ne sais pas si la syntaxe changera la vitesse d'exécution, mais personnellement j'écris mes jointures comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT LigneCommande.IDLigneCommande, NumeroLigneCommande, <etc.>
    FROM Commande
    INNER JOIN Ligne Commande ON LigneCommande.IDCommande = Commande.IDCommande
    INNER JOIN Statut_Avancement_Administratif ON LigneCommande.IDStatut_Avancement_Administratif = Statut_Avancement_Administratif.IDStatut_Avancement_Administratif
    INNER JOIN Statut_Localisation ON LigneCommande.IDStatut_Localisation = Statut_Localisation.IDStatut_Localisation
    <etc.>
    EDIT : Par contre, tu ne dois pas avoir lu les règles de ce forum.
    Un seul post par problème. ça ne sert à rien de polluer le forum de TROIS posts identiques !
    Donc tu n'auras plus de réponse de ma part (et très probablement des autres aussi) tant que tu n'auras pas effacé les posts inutiles)

  3. #3
    Candidat au Club
    Homme Profil pro
    Developpeur WINDEV
    Inscrit en
    Août 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Developpeur WINDEV

    Informations forums :
    Inscription : Août 2012
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    J'ai testé avec ta syntaxe.

    Le résultat est le même

    Pour info la requete renvoie seulement 25 lignes.


    15 jointures, est ce beaucoup trop pour une requête ?

  4. #4
    Candidat au Club
    Homme Profil pro
    Developpeur WINDEV
    Inscrit en
    Août 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Developpeur WINDEV

    Informations forums :
    Inscription : Août 2012
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Mes utilisateurs veulent avoir ce genre de tableau "Récapitulatif"
    à l'entrée de la fenêtre.

    Donc ce genre de requête..

    Mais déja 25 secondes est ce cohérent même avec autant de jointures ?

  5. #5
    Candidat au Club
    Homme Profil pro
    Developpeur WINDEV
    Inscrit en
    Août 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Developpeur WINDEV

    Informations forums :
    Inscription : Août 2012
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Finalement, plus je supprime de jointure, plus le tps d'execution s'ameliore.
    Apres qq tests le nombre de jointures maximum acceptable est de 7 a 8 jointures. ( en tout cas pour cette requete en question )
    Ce que je ne comprends pas c'est qu'avant ma mise à jour de Windev le tps de cette requete etait normal ( 25 centiemes ).
    La mise a jour a bien du faire qq chose ???


    Du coup, comme le nombre de jointures semble etre au coeur du probleme
    J'ai reecris ma requete en utilisant plusieurs sous requetes pour repartir mes jointures.

    Resultat c'est plus rapide.

    Mais je me pose une question :

    En partant du principe que je travaille en client / serveur,
    Est ce que les resultats des sous requetes qui compose ma requete principale sont importés sur le poste client ou est ce que que ces resultats de sous requete reste en memoire sur me serveur ?

    En effet,
    Certains des postes clients sont en Algerie et le reseau n'est pas tres bon.

    Merci a ceux ou celles qui me répondront.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 100
    Points
    1 100
    Par défaut
    (Maintenant que tu n'as plus qu'un seul post pour ton sujet, je peux te répondre)
    La requête contient effectivement beaucoup trop de jointures.
    Si c'est pour une 15aine de lignes au total, moi j'enlèverais même les fichiers que tu as en LEFT JOIN.
    Tu dis que tu as ré-écrit ta requête, mais est-ce que tu peux nous montrer le résultat actuel STP ?
    (et utilise les balise [CODE], en cliquant sur la touche # en haut)

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 100
    Points
    1 100
    Par défaut
    Ah ! J'oubliais une piste de recherche :
    J'ai remarqué que les recherches sur les rubriques non indexées sont beaucoup plus lentes depuis la dernière version.
    Tu devrais vérifier si ce n'est pas le cas pour toi, et si besoin, soit sortir le fichier, soit indexer la rubrique.

  8. #8
    Membre confirmé
    Homme Profil pro
    Consultant
    Inscrit en
    Octobre 2004
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 254
    Points : 608
    Points
    608
    Par défaut
    Citation Envoyé par Sylvain RIVIERE Voir le message

    Du coup, comme le nombre de jointures semble etre au coeur du probleme
    Faire des jointures n'est pas très coûteux en temps pour un SGBD, du moins si les colonnes jointes sont indexées.
    C'est plus la lecture des lignes qui prend le plus de temps.

    Ta dégradation de performances est incompréhensible pour moi et vient à mon avis d'un problème distinct des requetes.

    Pour tes jointures, la norme SQL indique que tu dois les écrire de cette façon :

    (((TABLE1 LEFT OUTER JOIN TABLE2 ON ...)
    LEFT OUTER JOIN TABLE3 ON ...)
    LEFT OUTER JOIN TABLE4 ON ...)

    Et non pas répéter TABLE1 à chaque ligne.

    Cdlt, Arnaud.

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2012
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 162
    Points : 308
    Points
    308
    Par défaut
    Citation Envoyé par Arnaud B. Voir le message
    Ta dégradation de performances est incompréhensible pour moi et vient à mon avis d'un problème distinct des requêtes.
    je suis tout à fait de cet avis. Il serait pertinent à savoir si la base HyperFile n'est pas placée sur le réseau. Ça peut être un motif très probable de lenteur en plus de la multitude de jointure.

    Cordialement

Discussions similaires

  1. plusieurs requêtes à la suite ça ne marche pas
    Par zouhenlai dans le forum Access
    Réponses: 10
    Dernier message: 30/06/2006, 17h02
  2. Réponses: 12
    Dernier message: 30/12/2005, 11h55
  3. requète lente (10 min)
    Par jfwatteau dans le forum Access
    Réponses: 3
    Dernier message: 27/12/2005, 09h47
  4. Requery frm suite MAJ sfrm
    Par armagued dans le forum Access
    Réponses: 9
    Dernier message: 17/10/2005, 18h58

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