Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/06/2011, 13h37   #1
Invité de passage
 
Homme
Développeur informatique
Inscription : juin 2011
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Services à domicile

Informations forums :
Inscription : juin 2011
Messages : 2
Points : 0
Points : 0
Par défaut Requête SQL trop lente

Bonjour, je débute en sql et j'ai une requete qui lorsque je la met sur un serveur en reseau me donne des temps trop long d'execution... pouvez vous m'aider à optimliser merci le code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT  SI1000_Utilisateur.Nom, AF1000_Affaire.Affaire, SE1000_Client.Societe, AF1000_Affaire.Action_Aff, AF1000_Affaire.VACT_Axia, AF1000_Affaire.VACT_Evol, PA1000_Parametre.ParmT5,
		 PA1000_Parametre.ParmT300, AF1000_Affaire.Accord_Client, AF1000_Affaire.Choix_Client_Proposition, AF1000_Affaire.Infos_Af, AF1000_Refinanceur.AccordRefi,
		 AF1000_Affaire.Date_Envoi_Prop, AF1000_Affaire.Des_Mat, AF1000_Refinanceur.Dte_Demande_FO, AF1000_Refinanceur.RefiMontant, AF1000_Refinanceur.Dte_Demande_BO, AF1000_Refinanceur.Dte_Accord_Refi, AF1000_Refinanceur.Dte_Finaccord_Refi,
		 AF1000_Refinanceur.Date_Refu_Refi, AF1000_Affaire.Date_ABA, AF1000_Affaire.Date_Contrat, AF1000_Affaire.DateCree, AF1000_Affaire.DateMaj, AF1000_Affaire.Statut_Affaire, AF1000_Affaire.IDSE1000_Contact_CLient, 
		 AF1000_Affaire.Client, AF1000_Affaire.Gen_kelaff, AF1000_Affaire.Utilisateur
		FROM AF1000_Affaire, SE1000_Client, PA1000_Parametre, AF1000_Refinanceur, SI1000_Utilisateur 
		WHERE AF1000_Affaire.Utilisateur LIKE 'S1'% 
		AND AF1000_Affaire.Statut_Affaire IN ('AA', 'BB', 'CC')
		--and (AF1000_Refinanceur.AccordRefi = 'OUI' or AF1000_Refinanceur.AccordRefi = '')
			AND SI1000_Utilisateur.Nom = (SELECT SI1000_Utilisateur.Nom FROM SI1000_Utilisateur  WHERE SI1000_Utilisateur.Utilisateur = AF1000_Affaire.Utilisateur)
			AND SE1000_Client.Societe = (SELECT SE1000_Client.Societe FROM SE1000_Client  WHERE SE1000_Client.Client = AF1000_Affaire.Client) 
			AND AF1000_Refinanceur.Affaire = (SELECT  AF1000_Refinanceur.Affaire FROM AF1000_Refinanceur WHERE AF1000_Refinanceur.Affaire = AF1000_Affaire.Affaire)
			AND PA1000_Parametre.ParmT5 = (SELECT  PA1000_Parametre.ParmT5 FROM PA1000_Parametre WHERE PA1000_Parametre.Param_Libelle = AF1000_Affaire.Statut_Affaire) 
			AND PA1000_Parametre.ParmT300 = (SELECT  PA1000_Parametre.ParmT300 FROM PA1000_Parametre WHERE PA1000_Parametre.Param_Libelle = AF1000_Affaire.Statut_Affaire)
GROUP BY  AF1000_Affaire.Affaire,SI1000_Utilisateur.Nom, SE1000_Client.Societe, AF1000_Affaire.Action_Aff, AF1000_Affaire.VACT_Axia, AF1000_Affaire.VACT_Evol, PA1000_Parametre.ParmT5,
PA1000_Parametre.ParmT300, AF1000_Affaire.Accord_Client, AF1000_Affaire.Choix_Client_Proposition, AF1000_Affaire.Infos_Af, AF1000_Refinanceur.AccordRefi,
AF1000_Affaire.Date_Envoi_Prop, AF1000_Affaire.Des_Mat, AF1000_Refinanceur.Dte_Demande_FO, AF1000_Refinanceur.RefiMontant, AF1000_Refinanceur.Dte_Demande_BO, AF1000_Refinanceur.Dte_Accord_Refi, AF1000_Refinanceur.Dte_Finaccord_Refi,
AF1000_Refinanceur.Date_Refu_Refi, AF1000_Affaire.Date_ABA, AF1000_Affaire.Date_Contrat, AF1000_Affaire.DateCree, AF1000_Affaire.DateMaj, AF1000_Affaire.Statut_Affaire, AF1000_Affaire.IDSE1000_Contact_CLient, 
AF1000_Affaire.Client, AF1000_Affaire.Gen_kelaff, AF1000_Affaire.Utilisateur
		ORDER BY AF1000_Affaire.Statut_Affaire, AF1000_Affaire.Affaire
enavant1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 13h41   #2
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
SVP lisez les règles d'utilisation du forum
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 13h48   #3
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Bonjour,

il va falloir ré-écrire entièrement votre requête.

Lisez cet article :
http://sqlpro.developpez.com/cours/sqlaz/jointures/

Puis refaites correctement vos jointure et montrez-nous la nouvelle requête.

Dans la clause where dégagez entièrement vos sous-requête qui n'ont pas lieu d'être (ce sont vos jointure !!)

Le group by est-il obligatoire ? à quoi sert-il ?

Avez vous des index sur :
- vos colonnes de jointure
- la colonne AF1000_Affaire.Utilisateur
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 17h13   #4
Membre expérimenté
 
Inscription : octobre 2002
Messages : 654
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 654
Points : 552
Points : 552
Bonjour,
Quel est le SGBD? Access?, SQL server,?MySQL?
J'ai l'impression qu'il y a des corrections à faire au niveau des jointure et que le group by "sert" à dédoublonner parcequ'il doit y avoir des produits cartésiens.
Soazig
soazig est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 18h09   #5
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 954
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 954
Points : 17 774
Points : 17 774
Utilisez aussi des alias de tables, parce que là on atteint les sommet de l'horreur et de l'illisibilité !!!!

Avez vous un jour suivi un cours de SQL ?????

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 20h24   #6
Membre expérimenté
 
Inscription : octobre 2002
Messages : 654
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 654
Points : 552
Points : 552
Bonjour,

Comme dit précédemment tu ne nous donnes pas la structure de tes tables, et leur relations (foreign key), tu ne nous explique pas ce que tu veux obtenir.
Tu nous donnes juste une requête dont tu nous dit qu'elle est lente.
En plus elle n'est pas indentée correctement.
Les remarques précédentes ne sont pas méchantes, mais pour t'aider il faut que tu nous aides un peu aussi
Je viens de réécrire ta requête à l'aveugle en utilisant les jointures normalisées et en imaginant ce que tu voulais faire. Franchement avec une boule de cristal j'y serai mieux arriver.
Voilà ce à quoi je suis arrivée
Code :
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
SELECT   U.Nom                     ,
         A.Affaire                 ,
         C.Societe                 ,
         A.Action_Aff              ,
         A.VACT_Axia               ,
         A.VACT_Evol               ,
         P.ParmT5                  ,
         P.ParmT300                ,
         A.Accord_Client           ,
         A.Choix_Client_Proposition,
         A.Infos_Af                ,
         R.AccordRefi              ,
         A.Date_Envoi_Prop         ,
         A.Des_Mat                 ,
         R.Dte_Demande_FO          ,
         R.RefiMontant             ,
         R.Dte_Demande_BO          ,
         R.Dte_Accord_Refi         ,
         R.Dte_Finaccord_Refi      ,
         R.Date_Refu_Refi          ,
         A.Date_ABA                ,
         A.Date_Contrat            ,
         A.DateCree                ,
         A.DateMaj                 ,
         A.Statut_Affaire          ,
         A.IDSE1000_Contact_CLient ,
         A.Client                  ,
         A.Gen_kelaff              ,
         A.Utilisateur
FROM     AF1000_Affaire A
         INNER JOIN SE1000_Client C
         ON       C.Client      = A.Client SI1000_Utilisateur U
         ON       U.Utilisateur = A.Utilisateur
         INNER JOIN PA1000_Parametre P
         ON       P.Param_Libelle = A.Statut_Affaire
         INNER JOIN AF1000_Refinanceur R
         ON       R.Affaire = A.Affaire ,
                  SI1000_Utilisateur U
WHERE    A.Utilisateur LIKE 'S1'%
AND      A.Statut_Affaire IN ('AA',
                              'BB',
                              'CC')
         --and (R.AccordRefi = 'OUI' or R.AccordRefi = '')
ORDER BY A.Statut_Affaire
Comme tu le vois avec une indentation correcte et des alias de tables on y voit mieux.

Pour indenter une requête qui ne l'est pas et que je n'ai pas écrite j'utilise.
http://www.sqlinform.com/free_online_sw.html

Le site de sqlpro déjà mentionné plus haut est super pour apprendre le SQL, c'est là que je me suis perfectionnée. Sa lecture te ferai le plus grand bien
[edit]Le fonctionnement de ta table Parametre semble bizarre, les autres jointures semble classiques, donc vérifie ce qui doit être fait pour la table paramètre[/edit]
je pense.
Courage
Soazig
soazig est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 16h44   #7
Invité de passage
 
Homme
Développeur informatique
Inscription : juin 2011
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Services à domicile

Informations forums :
Inscription : juin 2011
Messages : 2
Points : 0
Points : 0
Par défaut Du nouveau

Merci tout d'abord a vos réponses, aprés reflexion j'ai regardé vos tuto et revu la requete. Mais je n'ai pa mis de jointure.

Pour répondre à vos questions :
Je suis sur base Hyperfile SQL (windev)
ma nouvelle requete :
Code :
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
 
SELECT
	AF1000_Affaire.Affaire AS Affaire,	
	AF1000_Affaire.Action_Aff AS Action_Aff,	
	AF1000_Affaire.VACT_Axia AS VACT_Axia,	
	AF1000_Affaire.VACT_Evol AS VACT_Evol,	
	AF1000_Affaire.Accord_Client AS Accord_Client,	
	AF1000_Affaire.Choix_Client_Proposition AS Choix_Client_Proposition,	
	AF1000_Affaire.Infos_Af AS Infos_Af,	
	AF1000_Affaire.Date_Envoi_Prop AS Date_Envoi_Prop,	
	AF1000_Affaire.Des_Mat AS Des_Mat,	
	AF1000_Affaire.Date_ABA AS Date_ABA,	
	AF1000_Affaire.Date_Contrat AS Date_Contrat,	
	AF1000_Affaire.DateCree AS DateCree,	
	AF1000_Affaire.DateMaj AS DateMaj,	
	AF1000_Affaire.Statut_Affaire AS Statut_Affaire,	
	AF1000_Affaire.IDSE1000_Contact_CLient AS IDSE1000_Contact_CLient,	
	AF1000_Affaire.Client AS Client,	
	AF1000_Affaire.Gen_kelaff AS Gen_kelaff,	
	AF1000_Affaire.Utilisateur AS Utilisateur,	
	SI1000_Utilisateur.Nom AS Nom,	
	SE1000_Client.Societe AS Societe,	
	PA1000_Parametre.ParmT5 AS ParmT5,	
	PA1000_Parametre.ParmT300 AS ParmT300,	
	SE1000_Client.Societe AS Socite,	
	AF1000_Refinanceur.AccordRefi AS AccordRefi,	
	AF1000_Refinanceur.Date_Refu_Refi AS Refurfi,	
	AF1000_Refinanceur.Dte_Accord_Refi AS Accrefi,	
	AF1000_Refinanceur.Dte_Demande_BO AS Demdborefi,	
	AF1000_Refinanceur.Dte_Demande_FO AS Demforefi,	
	AF1000_Refinanceur.Dte_Finaccord_Refi AS Finaccrefi,
	AF1000_Refinanceur.RefiMontant	
FROM 
	PA1000_Parametre,	
	SI1000_Utilisateur,	
	SE1000_Client,
	AF1000_Refinanceur,	
	AF1000_Affaire
WHERE 
	(
		AF1000_Affaire.Utilisateur LIKE {Req_parm_utili}
		AND	AF1000_Affaire.Statut_Affaire IN ({Req_parm_statut}) 	)
		AND SI1000_Utilisateur.Utilisateur = AF1000_Affaire.Utilisateur
		AND	SE1000_Client.Client = AF1000_Affaire.Client
		AND PA1000_Parametre.Param_Libelle = AF1000_Affaire.Statut_Affaire
		AND AF1000_Refinanceur.Affaire = AF1000_Affaire.Affaire
ORDER BY AF1000_Affaire.Affaire
Elle fonctionne un peu plus rapide. Pour info j'ai bien des clefs sur :
AF100_Affaire et AF1000_Refinanceur (AF1000_Affaire.Affaire et AF1000_Refinanceur.Affaire)

ainsi que :
AF100_Affaire et SE1000_CLient (AF1000_Affaire.Client et SE1000_Client.client )

ainsi que :
AF100_Affaire et SI1000_Utilisateur (AF100_Affaire .utilisateur et SI1000_Utilisateur.utilisateur)

ainsi que :
AF100_Affaire et PA1000_Parametre(AF100_Affaire.Statut_Affaire et AF1000_Affaire.Statut_Affaire )

Pensez-vous qu'il ya une autre façon de faire je ne suis vraiment pas à l'aise avec les jointures
Merci d'avance
enavant1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 16h52   #8
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
pour les jointures utilisez ce modèle


Code sql :
1
2
3
4
5
6
7
8
SELECT ...
FROM SE1000_Client
INNER JOIN AF1000_Affaire ON (SE1000_Client.Client = AF1000_Affaire.Client
...
 
WHERE
               AF1000_Affaire.Utilisateur LIKE {Req_parm_utili}
		AND	AF1000_Affaire.Statut_Affaire IN ({Req_parm_statut})

If faut aussi un index pour la colonne indiquée dans le ORDER BY (AF1000_Affaire.Affaire)
en gros tous les éléments qui interviennent dans la clause WHERE et ORDER BY
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 20h01   #9
Membre expérimenté
 
Inscription : octobre 2002
Messages : 654
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 654
Points : 552
Points : 552
Bonjour,
Citation:
. Pour info j'ai bien des clefs sur :
Qu'entends-tu par là. Des clés primaires? Des clés primaires et des foreigns keys.
Prenons un exemple
AF100_Affaire et AF1000_Refinanceur (AF1000_Affaire.Affaire et AF1000_Refinanceur.Affaire)
Est-ce que Affaire est clé primaire de AF100_Affaire?
Est-ce que Affaire est clé étrangère de AF1000_Refinanceur?
Est-ce qu'il y a un index sur Affaire dans AF1000_Refinanceur?

Sinon il y a beaucoup de progrès dans ta requête.
Cordialement
Soazig
soazig est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h37.


 
 
 
 
Partenaires

Hébergement Web