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

Langage SQL Discussion :

Requête SQL trop lente


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    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 : 1
    Points
    1
    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 : 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
    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

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    SVP lisez les règles d'utilisation du forum
    Merci d'ajouter un sur les tags qui vous ont aidé

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    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

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    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

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 571
    Points
    52 571
    Billets dans le blog
    5
    Par défaut
    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
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    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 : 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
    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

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    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 : 1
    Points
    1
    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 : 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
     
    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

  8. #8
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    pour les jointures utilisez ce modèle


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Merci d'ajouter un sur les tags qui vous ont aidé

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    . 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

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/07/2013, 15h07
  2. Requête SQL trop compliquée pour moi
    Par goldenboy68 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 10/04/2008, 14h50
  3. [AJAX] Requête serveur trop lente
    Par _FaFa_ dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/02/2008, 14h21
  4. [SQL] Requête SQL trop compliquée pour lui.
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 23/05/2006, 22h52
  5. erreur requète SQL : trop peu de paramètres
    Par pierre.egaud dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 21/04/2006, 14h57

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