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

MS SQL Server Discussion :

Problème avec une fonction utilisateur !


Sujet :

MS SQL Server

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Problème avec une fonction utilisateur !
    Bonjour à tous !

    Voici mon problème :
    J'ai écrit une fonction en transact SQL, son temps d'exécution est de 13 secondes lorsque je l'appelle de façon classique, select * from ma_fonction(), pourtant, lorsque je tape le code de ma fonction directement dans un analyseur de requête, le temps d'exécution passe à 6 secondes ! Je me demande pourquoi ce diféré, j'ai essayé d'appeler une fonction "bidon" pour voir s'il ne fallait pas un minimum de temps à SQL Server pour appeler une fonction, et le résultat est venu instantanément ! Je me demande d'où peuvent venir ces 7 secondes de différence !

    Voici ma fonction :
    DECLARE @annee_min int --année la plus ancienne
    DECLARE @annee_max int --année la plus récente
    DECLARE @annee_mineur int --année à partir de laquelle les personnes nées sont encore mineures
    DECLARE @annee_courante int

    --récupération de la date courante depuis la table resid..date, puisque l'appel getDate() est impossible
    set @annee_courante=(select DATENAME(year,date) from resid..date)
    set @annee_mineur= @annee_courante-18

    --calcul de la tranche:
    if @age_min=0 set @annee_max=@annee_mineur
    else set @annee_max=@annee_courante-@age_min
    if @age_max=0 set @annee_min=1900
    else set @annee_min=@annee_courante-@age_max

    insert into @liste select prenom
    from resid..homme_et_femme_ok a
    group by prenom
    having (
    (( (select cast (sum(b.nb) as float)
    from resid..homme_et_femme_ok b
    where b.annee>=@annee_min AND b.annee<@annee_max AND
    b.prenom=a.prenom
    group by b.prenom )/ (select
    case sum(nb)
    when 0 then 100000000.0
    else cast(sum(nb) as float)
    end
    from resid..homme_et_femme_ok c
    where c.annee<@annee_mineur and c.prenom=a.prenom
    group by c.prenom ))*100)>=@pourcentage)

    La réquête d'insert ne prend que 6 secondes, le reste du code est quasi instantané lorsqu'on l'exécute "en live", l'appel parait lui aussi instantané; si quelqu'un pouvait me renseigner cela m'aiderait beaucoup !!

    Merci !

  2. #2
    Membre éprouvé
    Avatar de HULK
    Inscrit en
    Juillet 2003
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 273
    Points : 1 280
    Points
    1 280
    Par défaut
    ca m'arrive aussi quelque fois, c'est surement du à l'état de ton reseau, ou du fait que les prod stock sont compilées et vont plus vite après une première execution
    j'suis vert !

  3. #3
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour ta réponse, le problème n'était cependant pas le réseau j'ai quand même réussi à réduire mon temps d'exécution à 6 secondes merci !

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 31
    Points : 39
    Points
    39
    Par défaut
    Ce qui serait sympa ... c'est de nous expliquer ce que tu as fait pour réduire le temps d'exécution

  5. #5
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Alors en fait,
    dans ma requête qui tue à la fin, je faisais une division avec un select sum(nb) (une fois) / select sum(nb) (deux fois) ....
    Bref, avec le select, je calculais mes sum(nb) pour toutes les lignes à chaque fois, et j'allais chercher celle qui m'intéressait avec un where;
    Donc, j'ai déclaré une table locale, je l ai rempli avec un insert select sum(nb) from ... pour mon divisuer,
    la même pour mon dividende, comme ca j'avais tous mes sum(nb) dans une table et je les calculais qu'une seule fois, et dans la requete finale,
    au lieu faire mes select sum(nb), (donc les calculer tous a chaque fois alros qu'un seul ne m'intéresse) et un where pour prendre la valeur qui m intéressait, je vais direct chercher la ligne qui m interesse puisque les sum(nb) sont deja calculés bien au chaud dans mes tables locales
    voila voila je sais pas si c'est très clair mais ca a bien marché !!

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

Discussions similaires

  1. Problème avec une fonction
    Par philippef dans le forum Langage
    Réponses: 1
    Dernier message: 05/07/2006, 10h51
  2. Problème avec une fonction
    Par mademoizel dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 24/06/2006, 10h51
  3. problème avec une fonction javaScript
    Par volthur dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 16/05/2006, 18h04
  4. Problème avec une fonction et un array
    Par Neal Morse dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 28/08/2005, 12h04
  5. Problème avec une fonction date.
    Par kmayoyota dans le forum ASP
    Réponses: 8
    Dernier message: 09/09/2004, 12h33

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