Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > WinDev > HyperFileSQL
HyperFileSQL HyperFileSQL est un système de gestion de base de données relationnel exploité par les logiciels WinDev, WebDev et WinDev Mobile.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 24/08/2012, 15h30   #1
Sylvain RIVIERE
Invité de passage
 
Homme sylvain Riviere
Developpeur WINDEV
Inscription : 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
Sylvain RIVIERE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2012, 15h58   #2
Bowen
Membre émérite
 
Homme
Inscription : mars 2002
Messages : 846
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 35
Localisation : France

Informations forums :
Inscription : mars 2002
Messages : 846
Points : 905
Points : 905
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)
Bowen est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 24/08/2012, 16h22   #3
Sylvain RIVIERE
Invité de passage
 
Homme sylvain Riviere
Developpeur WINDEV
Inscription : 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
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 ?
Sylvain RIVIERE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2012, 16h27   #4
Sylvain RIVIERE
Invité de passage
 
Homme sylvain Riviere
Developpeur WINDEV
Inscription : 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
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 ?
Sylvain RIVIERE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2012, 20h00   #5
Sylvain RIVIERE
Invité de passage
 
Homme sylvain Riviere
Developpeur WINDEV
Inscription : 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
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.
Sylvain RIVIERE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2012, 15h20   #6
Bowen
Membre émérite
 
Homme
Inscription : mars 2002
Messages : 846
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 35
Localisation : France

Informations forums :
Inscription : mars 2002
Messages : 846
Points : 905
Points : 905
(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)
Bowen est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/08/2012, 15h23   #7
Bowen
Membre émérite
 
Homme
Inscription : mars 2002
Messages : 846
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 35
Localisation : France

Informations forums :
Inscription : mars 2002
Messages : 846
Points : 905
Points : 905
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.
Bowen est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/10/2012, 17h25   #8
Arnaud B.
Membre éprouvé
 
Homme Arnaud Benhamdine
Consultant
Inscription : octobre 2004
Messages : 209
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 : 209
Points : 447
Points : 447
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.
Arnaud B. est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/10/2012, 09h36   #9
PointCarreJo
Membre du Club
 
Homme
Consultant informatique
Inscription : octobre 2012
Messages : 31
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Luxembourg

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : octobre 2012
Messages : 31
Points : 59
Points : 59
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
PointCarreJo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 12h50.


 
 
 
 
Partenaires

Hébergement Web