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 :

Aide pour Optimiser une Requete


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 16
    Points : 14
    Points
    14
    Par défaut Aide pour Optimiser une Requete
    Bonjour tout le monde,
    Je fais appelle à vous pour m'aider à optimiser une requête SQL qui me pose probléme.
    Elle met plus de 30 seconde a effecuter cette requete.

    D'aprés mes tests c'est la Sum(duration) qui fait que le temps soit aussi long.

    Voici la requéte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT SERVICES.ID_SERVICE, SERVICES.DESCRIPTION, SERVICES.KEYWORD, SERVICES.NUMERO_08XY, SERVICES.DESCRIPTION_LONGUE,
      COUNT(C.dst) AS NBappel,
     COALESCE (SUM(C.duration), 0) AS duree, SERVICES.COEFFICIENT, SERVICES.TVA 
    FROM SERVICES LEFT OUTER JOIN asterisk.dbo.cdr AS C ON SERVICES.KEYWORD = C.dst AND SERVICES.ID_TYPE = 2
    	 AND MONTH(C.calldate) = 11 AND C.duration > SERVICES.TEMPS_MINI_FACTURATION AND YEAR(C.calldate) = 2007 
    GROUP BY SERVICES.NUMERO_08XY, SERVICES.DESCRIPTION_LONGUE, SERVICES.ID_SERVICE, SERVICES.DESCRIPTION, SERVICES.KEYWORD, SERVICES.COEFFICIENT, SERVICES.TVA
    Merci d'avance pour votre aide.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 099
    Points : 28 407
    Points
    28 407
    Par défaut
    Si tu retires simplement COALESCE(SUM(c.duration), 0), ta requête est accélérée ?
    Et as-tu essayé avec SUM(COALESCE(c.duration, 0)), qui me semble plus pertinent ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Je vois une jointure dans la requête.

    Peut-être faudrait-il regarder si les prédicats de la dite jointure sont indexés ou pas ?

    Par ailleurs quelle est la cardinalité de ces deux tables ?

  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,
    Ce qui ne me plaît pas dans tes critères c'est comment du filtre sur le mois de novembre 2007 pour calldate, si ce champ est indéxé, je pense qu'il vaudrait mieux filtrer avec un between ou avec deux critères de dates.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT S.ID_SERVICE, S.DESCRIPTION, S.KEYWORD, 
    	S.NUMERO_08XY, S.DESCRIPTION_LONGUE,
    	COUNT(C.dst) AS NBappel,
    	COALESCE (SUM(C.duration), 0) AS duree, S.COEFFICIENT, S.TVA 
    FROM SERVICES LEFT OUTER JOIN asterisk.dbo.cdr AS C 
    	ON S.KEYWORD = C.dst AND S.ID_TYPE = 2
    	C.duration > S.TEMPS_MINI_FACTURATION 
    	AND C.Calldate between '2007/11/01' and '2007/12/01'
    GROUP BY S.NUMERO_08XY, S.DESCRIPTION_LONGUE, S.ID_SERVICE, S.DESCRIPTION, S.KEYWORD, S.COEFFICIENT, S.TVA
    A vérifier je ne sais jamais si avec un between les deux bornes sont incluses ou pas.
    Sachant qu'en plus pour les dates il faut toujours penser qu'elles peuvent être
    accompagnées de l'heure.
    [edit] Hier soir je n'étais pas réveillée, car bien sûr si on met le critère de date en between, il ne faut pas en plus mettre AND MONTH(C.calldate) = 11 AND AND YEAR(C.calldate) = 2007 .
    J'ai donc corrigé la requête.[/edit]
    A+
    Soazig

  5. #5
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Citation Envoyé par soazig Voir le message
    ... A vérifier je ne sais jamais si avec un between les deux bornes sont incluses ou pas.
    Avec BETWEEN les bornes sont incluses ...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    Merci pour réponses.

    Pour month = 11 et year = 2007
    C'est des valeur par défaut.
    Aprés elles seront variables @xxxx avec l'aspx.

    la date n'est pas accompagné de l'heure ( pas sur mais presque)

    Les prédicats sont indexés ,

    Une table a environ 500 lignes (Services)
    L'autre ( Asterisk.cdr.dbo ) depasse les 500 000 lignes.

    Aprés test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Select Sum(duration)
    From CDR --( Asterisk.cdr.dbo )
    Where calldate >= '20071101' and calldate < '20071201'
    Prends deja 28 secondes .

    Merci de votre aide et de votre futur aide.

  7. #7
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Citation Envoyé par Thanwiel Voir le message
    ... Les prédicats sont indexés ...
    Je suis surpris du temps d'exécution alors.
    Faudrait voir le plan d'accès choisi par le SGBD.
    Quel est le SGBD d'ailleurs ?

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    SQL Serveur 2005

    Le plan d'execution sera mis en ligne demain lors de mon prochain accés a la base.

    Merci

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    Rebonjour,

    MErci pour votre aide.

    Un oublie d'index.

  10. #10
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 63
    Points : 71
    Points
    71
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Sum(duration)
    FROM CDR --( Asterisk.cdr.dbo )
    WHERE to_char(calldate, 'MM/YYYY') = '11/2007'
    essai voir mais la aucune garantie sur les performances

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    Merci ,

    C'est duration qui bloqué tout j'ai oublié de l'indéxer car il était dans le select mais j'avais oublier que il était présent dans les conditions xD ca me rapelle les petites erreures de code C++ qu'on passe une journée à trouver

    Sur ce Bonne journée,
    Merci à tous !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. aide pour créer une requete sql
    Par DonKnacki dans le forum Langage SQL
    Réponses: 11
    Dernier message: 07/02/2008, 18h17
  2. demande d'aide pour construire une requete
    Par moabomotal dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/08/2007, 10h38
  3. [MySQL] Aide pour alleger une requete
    Par toniox dans le forum Langage SQL
    Réponses: 6
    Dernier message: 10/07/2006, 17h12
  4. besoin d'aide pour optimiser une requête
    Par jisse dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/01/2006, 09h41
  5. Aide pour optimiser une requete
    Par Akanath dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/09/2005, 11h05

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