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 :

Lenteur à l'utilisation d'une fonction dans une clause WHERE


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 70
    Points : 55
    Points
    55
    Par défaut Lenteur à l'utilisation d'une fonction dans une clause WHERE
    Bonjour,


    J'ai pu constaté aujourd'hui que l'appel d'une fonction à l'intérieur d'une clause WHERE faisait ralentir énormément l'exécution de la requête (de l'ordre de 30s contre 1s).

    Si je fais (pseudo code)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT
      champ1,
      champ2,
      uf_MaFonction(UnParametre) AS Nb
    FROM 
      maTable
      INNER JOIN monAutreTable
    ma requête s'exécute en 30s à peu près, sachant que la fonction fait juste un count(*) sur une autre table et retourne à peu près 6000 lignes

    Mais si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT
      champ1,
      champ2,
      (SELECT Count(*) FROM encoreUneAutreTable) AS Nb
    FROM 
      maTable
      INNER JOIN monAutreTable
    Cette fois ma requête s'exécute en 1s (en reprenant juste le code de la fonction précédente et en la mettant directement dans la clause SELECT comme ci dessus en tant que sous-requête)

    Je comprends à priori que la fonction doit certainement s'exécuter pour chaque ligne ce qui ralentit son exécution comparé à priori à l'utilisation de la sous-requête qui à priori s'exécute sur le résultat de ma requête principal. Est ce que je me trompe ?

    Y a t'il une explication précise quelque part dans la MSDN ou ailleurs sur ça (mes recherches n'ont pas été fructueuse je l'avoue et la solution de facilité de venir sur le forum s'est présenté à moi) ?
    Avez vous votre propre explication ?

    D'avance merci beaucoup

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Je comprends à priori que la fonction doit certainement s'exécuter pour chaque ligne ce qui ralentit son exécution comparé à priori à l'utilisation de la sous-requête qui à priori s'exécute sur le résultat de ma requête principal. Est ce que je me trompe ?
    Non

    Pour chaque ligne du résultat de la requête, puisque votre fonction doit prendre une valeur d'une colonne de celui-ci, la fonction est appelée.
    Ce comportement me semble logique, et je pense que MS est au courant du problème de performances.

    Vous avez deux moyens de passer outre :

    - Ajouter une colonne calculée à une table si votre fonction prend en entrée des valeurs de colonnes de la même table.
    - Créer une vue indexée spécifiant en plus la formule de calcul.
    Les vues indexées sont particulièrement efficaces pour les agrégats.

    @++

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 70
    Points : 55
    Points
    55
    Par défaut
    Bonjour elsuket,

    Merci beaucoup pour votre réponse.
    En fait je n'aurai pas l'utilité de faire une vue indexé ou une colonne calculée mais je retient pour la prochaine fois (jamais encore eu l'occasion d'utiliser ni l'un ni l'autre jusqu'à aujourd'hui et je ne connaissais pas)

    Pour l'instant je vais me contenter d'utiliser ma solution de sous requête à la place de la fonction. La sous requête étant exactement ce que faisait la fonction..

    Merci

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

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  3. Comment utiliser une fonction dans une fonction
    Par hatenaku dans le forum Langage
    Réponses: 3
    Dernier message: 19/04/2008, 20h00
  4. Réponses: 1
    Dernier message: 28/09/2007, 15h59
  5. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04

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