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

Développement SQL Server Discussion :

Optimisation de requête(temps de réponse)


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 39
    Points : 26
    Points
    26
    Par défaut Optimisation de requête(temps de réponse)
    Bonjour,

    Je travaille sur sql server 2008, je dois construire une requête qui est composée par plusieurs sous requêtes.
    Pour cela, j'ai développé deux requêtes
    requete 1 temps de réponse 20 seconde
    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
    SELECT   sect.lg_nomparent lg,  COUNT(DISTINCT a.lg_annonceur) AS ann   FROM          FilteredLg_compterendu AS a 
       INNER JOIN  Filteredlg_systemuser_lg_compterendu AS b ON b.lg_compterenduid = a.lg_compterenduid 
     INNER JOIN FilteredSystemUser AS usr ON usr.systemuserid = b.systemuserid 
      INNER JOIN  FilteredAccount AS d ON d.accountid = a.lg_annonceur 
     INNER JOIN FilteredLg_terraindejeu AS e ON e.lg_annonceur = d.accountid
      inner join FilteredLg_ouvertureterrainsdejeu ouv on ouv.lg_commercial=usr.systemuserid
      inner join FilteredLg_secteurdactivite sect on sect.lg_secteurdactiviteid=e.lg_secteurdactivite
      inner join Filteredlg_lg_pole_systemuser pole_usr on pole_usr.systemuserid=usr.systemuserid
      inner join FilteredLg_pole pole on pole_usr.lg_poleid=pole.lg_poleid
     WHERE     convert(nvarchar(max),a.lg_daterdv ,112) BETWEEN convert (nvarchar(max),ouv.lg_datededebut,112) AND convert (nvarchar(max),ouv.lg_datedefin,112)
     and e.lg_commercial=usr.systemuserid 
    and pole.lg_name='INTERNET'
     GROUP BY sect.lg_nomparent
    
    requete 2 temps de réponse 5 sec
    
    select sec.lg_nomparent,
    count(distinct prioritaire.count_prioritaire) as 'Client LP prioritaire',
    count (distinct count_client) as 'Client LP',
    count(distinct count_prospect) as 'Prospect',
    
     from FilteredLg_secteurdactivite sec  
     inner join FilteredLg_terraindejeu Ter on sec.lg_secteurdactiviteid=Ter.lg_secteurdactivite
    inner join FilteredSystemUser usr on usr.systemuserid=ter.lg_commercial
    inner join Filteredlg_lg_pole_systemuser pole_usr on pole_usr.systemuserid=usr.systemuserid
    inner join FilteredLg_pole pole on pole.lg_poleid=pole_usr.lg_poleid and   pole.lg_name='INTERNET'
     left  join  (select distinct(lg_annonceur) count_prioritaire,lg_terraindejeuid
     from FilteredLg_terraindejeu where lg_statut=1 and lg_annonceur is not null
     ) prioritaire on Ter.lg_terraindejeuid=prioritaire.lg_terraindejeuid
     left  join(select distinct(lg_annonceur) count_client,lg_terraindejeuid
     from FilteredLg_terraindejeu where lg_statut=2 and lg_annonceur is not null
     ) Client on Ter.lg_terraindejeuid=Client.lg_terraindejeuid
     left  join  (select distinct(lg_annonceur) count_prospect,lg_terraindejeuid
      from FilteredLg_terraindejeu where lg_statut=3 and lg_annonceur is not null
     ) prospect on Ter.lg_terraindejeuid=prospect.lg_terraindejeuid
    Ces deux requêtes sont jointes par la notion de secteur (sec) comme suit sur la requete finale:

    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
    select sec.lg_nomparent,
    count(distinct prioritaire.count_prioritaire) as 'Client LP prioritaire',
    count (distinct count_client) as 'Client LP',
    count(distinct count_prospect) as 'Prospect',
     
    H.ann as H
     
     from FilteredLg_secteurdactivite sec  
     inner join FilteredLg_terraindejeu Ter on sec.lg_secteurdactiviteid=Ter.lg_secteurdactivite
    inner join FilteredSystemUser usr on usr.systemuserid=ter.lg_commercial
    inner join Filteredlg_lg_pole_systemuser pole_usr on pole_usr.systemuserid=usr.systemuserid
    inner join FilteredLg_pole pole on pole.lg_poleid=pole_usr.lg_poleid and   pole.lg_name='INTERNET'
     left  join  (select distinct(lg_annonceur) count_prioritaire,lg_terraindejeuid
     from FilteredLg_terraindejeu where lg_statut=1 and lg_annonceur is not null
     ) prioritaire on Ter.lg_terraindejeuid=prioritaire.lg_terraindejeuid
     left  join(select distinct(lg_annonceur) count_client,lg_terraindejeuid
     from FilteredLg_terraindejeu where lg_statut=2 and lg_annonceur is not null
     ) Client on Ter.lg_terraindejeuid=Client.lg_terraindejeuid
     left  join  (select distinct(lg_annonceur) count_prospect,lg_terraindejeuid
      from FilteredLg_terraindejeu where lg_statut=3 and lg_annonceur is not null
     ) prospect on Ter.lg_terraindejeuid=prospect.lg_terraindejeuid
     /* calcul colonne H = Nombre d’annonceurs distincts appartenant à la famille de secteur d’activité A et faisant parti du terrain de jeu 
     du commercial Z ayant au moins 1 compte rendu où le commercial Z est dans la liste des Commerciaux et dont la date de rendez-vous est comprise entre la date de début et de fin du tdj */
      left join (SELECT   sect.lg_nomparent lg_sec,  COUNT(DISTINCT a.lg_annonceur) AS ann
       FROM          FilteredLg_compterendu AS a 
       INNER JOIN  Filteredlg_systemuser_lg_compterendu AS b ON b.lg_compterenduid = a.lg_compterenduid 
     INNER JOIN FilteredSystemUser AS usr ON usr.systemuserid = b.systemuserid 
      INNER JOIN  FilteredAccount AS d ON d.accountid = a.lg_annonceur 
     INNER JOIN FilteredLg_terraindejeu AS e ON e.lg_annonceur = d.accountid
      inner join FilteredLg_ouvertureterrainsdejeu ouv on ouv.lg_commercial=usr.systemuserid
      inner join FilteredLg_secteurdactivite sect on sect.lg_secteurdactiviteid=e.lg_secteurdactivite
      inner join Filteredlg_lg_pole_systemuser pole_usr on pole_usr.systemuserid=usr.systemuserid
      inner join FilteredLg_pole pole on pole_usr.lg_poleid=pole.lg_poleid
     WHERE     convert(nvarchar(max),a.lg_daterdv ,112) BETWEEN convert (nvarchar(max),ouv.lg_datededebut,112) AND convert (nvarchar(max),ouv.lg_datedefin,112)
     and e.lg_commercial=usr.systemuserid 
    and pole.lg_name='INTERNET'
     GROUP BY sect.lg_nomparent
    ) AS H on sec.lg_nomparent=H.lg_sec
      group by sec.lg_nomparent,H.ann
    Cette requête tourne sans renvoyer de résultat, je ne vois pas de produit cartésien, c bizare
    Merci pour votre aide

  2. #2
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Points : 4 792
    Points
    4 792
    Par défaut
    Y-a-t-il une obligation à convertir les dates dans la clause WHERE de la première requête ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    convert(nvarchar(max),a.lg_daterdv ,112)
    On pourrait écrire alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE a.lg_daterdv  BETWEEN ouv.lg_datededebut AND ouv.lg_datedefin
    Cela économise le temps de conversion

    .

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    Non il n'y a pas d'obligation, mais ça ne change pas mes temps de réponse, le problème c'est quand je lie les deux requêtes que ça ne marche plus.aucun résultat, j'ai laissé tourner toute la journée et il ne m'a rien afficher

  4. #4
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Pour plus de lisibilité mets tes requêtes dans la balise CODE de l'éditeur de message.
    A+

  5. #5
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Points : 4 792
    Points
    4 792
    Par défaut
    C'est vrai que c'est difficile à lire.

    Bon, il n'y a pas 36 solutions. Si tu n'obtiens aucun résultat alors que les 2 requêtes s'exécutent bien c'est qu'il doit y avoir un problème dans la jointure.

    Essaye :
    1) stocker les résultats des deux requêtes dans des tables temporaires.
    2) vérifier la bonne existence de "secteurs" communs (sec.lg_nomparent=H.lg_sec)
    3) faire la requête finale sur les tables temporaires pour valider la jointure.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    Dsl pour la lisibilité du code, quand je remplace le left en inner j'ai des résultats au bout de 30 seconde.Mais je dois aussi récuperer les donner de la premier requetes.
    Pour la requetes 1 j'ai que 26 ligne et requetes 2 ,12 lignes.
    La jointure est normalement bonne

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    je viens de tester avec des tables temporaires, j'ai bien les 26 lignes en faisant la jointure sur secteur, du coup pas de probleme de jointure

Discussions similaires

  1. [MySQL] Besoin d'astuce pour optimiser le temps de réponse de mes requêtes
    Par karlito40 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 28/01/2011, 18h08
  2. [MySQL] Optimisation temps de réponse requête
    Par jesusnavas dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 10/08/2010, 10h14
  3. Réponses: 6
    Dernier message: 11/03/2009, 12h26
  4. Comment optimiser les temps de réponse d'une requête ?
    Par renaudjuif dans le forum Requêtes
    Réponses: 3
    Dernier message: 19/02/2007, 15h12
  5. [Optimisation] Améliorer les temps de réponse
    Par n@n¤u dans le forum JOnAS
    Réponses: 5
    Dernier message: 24/08/2006, 12h04

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