Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1
    Invité de passage
    Homme Profil pro sylvain Riviere
    Developpeur WINDEV
    Inscrit en
    août 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Nom : Homme sylvain Riviere
    Localisation : France

    Informations professionnelles :
    Activité : Developpeur WINDEV

    Informations forums :
    Inscription : août 2012
    Messages : 4
    Points : 0
    Points
    0

    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 :
    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 émérite
    Homme Profil pro Joël
    Inscrit en
    mars 2002
    Messages
    890
    Détails du profil
    Informations personnelles :
    Nom : Homme Joël
    Âge : 36
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : mars 2002
    Messages : 890
    Points : 959
    Points
    959

    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 :
    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
    Invité de passage
    Homme Profil pro sylvain Riviere
    Developpeur WINDEV
    Inscrit en
    août 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Nom : Homme sylvain Riviere
    Localisation : France

    Informations professionnelles :
    Activité : Developpeur WINDEV

    Informations forums :
    Inscription : août 2012
    Messages : 4
    Points : 0
    Points
    0

    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
    Invité de passage
    Homme Profil pro sylvain Riviere
    Developpeur WINDEV
    Inscrit en
    août 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Nom : Homme sylvain Riviere
    Localisation : France

    Informations professionnelles :
    Activité : Developpeur WINDEV

    Informations forums :
    Inscription : août 2012
    Messages : 4
    Points : 0
    Points
    0

    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
    Invité de passage
    Homme Profil pro sylvain Riviere
    Developpeur WINDEV
    Inscrit en
    août 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Nom : Homme sylvain Riviere
    Localisation : France

    Informations professionnelles :
    Activité : Developpeur WINDEV

    Informations forums :
    Inscription : août 2012
    Messages : 4
    Points : 0
    Points
    0

    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 émérite
    Homme Profil pro Joël
    Inscrit en
    mars 2002
    Messages
    890
    Détails du profil
    Informations personnelles :
    Nom : Homme Joël
    Âge : 36
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : mars 2002
    Messages : 890
    Points : 959
    Points
    959

    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 émérite
    Homme Profil pro Joël
    Inscrit en
    mars 2002
    Messages
    890
    Détails du profil
    Informations personnelles :
    Nom : Homme Joël
    Âge : 36
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : mars 2002
    Messages : 890
    Points : 959
    Points
    959

    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 expérimenté
    Homme Profil pro Arnaud Benhamdine
    Consultant
    Inscrit en
    octobre 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Nom : Homme Arnaud Benhamdine
    Localisation : France

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

    Informations forums :
    Inscription : octobre 2004
    Messages : 253
    Points : 504
    Points
    504

    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 confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    octobre 2012
    Messages
    136
    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 : 136
    Points : 227
    Points
    227

    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •