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 :

Fonctions définies par l'utilisateur


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 11
    Points : 11
    Points
    11
    Par défaut [Résolu] Fonctions définies par l'utilisateur
    Bonjour,

    Soit les procédures suivantes qui s'éxécutent séquentiellement de la manière suivante :

    1. j'ai une procédure stockée qui créent dynamiquement des tables t1, t2 qu'elles remplient.

    2. Ensuite, une procédure stockée crée dynamiquement une fonction inline fct1 me renvoyant une table résultat d'une jointure de 2 tables
    SELECT ...
    FROM table1 t1 INNER JOIN table2 t2 ON t1.cle = t2.cle
    WHERE ....

    3. une autre procédure stockée crée dynamiquement une table t3 qu'elle initialise

    4. Une procédure stockée crée dynamiquement une deuxieme fonction inline fct2 me renvoyant une table jointure d'une table et de ma fonction fct1.
    SELECT ....
    FROM fct1 f1 INNERJOIN table3 t3 ON f1.cle = t3.cle
    WHERE ....

    5. Enfin une procédure stockée effectue un group by sur ma fonction fct2.
    SELECT champ1, champ2, count(*)
    FROM fct2
    GROUB BY champ1, champ2

    Le pb est que ce group by est bcp trop long par rapport aux contraintes que j'ai. J'ai donc analysé mes requetes pour voir de quelle manière je pourrais optimiser. J'ai ecrit un exemple de ma fonction fct2 pour voir le plan d'éxécution complet en écrivant :
    SELECT champ1, champ2, count(*)
    FROM table t1
    INNER JOIN table t2 ON ....
    INNER JOIN table t3 ON ....
    WHERE [conditions fct1] AND [conditions fct2]
    GROUP BY champ1, champ2

    Et là ma requete est instantanée ! De plus une fois cette requete exécutée, l'éxécution du group by sur ma fonction devient aussi instantanée ( plus de pb de lenteur)... Le pb revient à chaque fois que je repart de l'étape n°1 ( drop et create de mes tables sources ).

    J'utilise des fonctions mais je me suis aperçu que j'aurai pu utiliser des vues, y-a t'il une différence au niveau des performances ( sachant que le contenu de mes tables sources est variable ) ?

    merci pour toute aide

  2. #2
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 566
    Points
    19 566
    Billets dans le blog
    25
    Par défaut
    Ca vient sans doute du fait que la suppression et la création de tes tables pour chaque appel crée une contention sur les meta-tables système (principalement syscolumns, sysindexes, sysobjects et systypes).

    Pourquoi supprimer et recréer ? Pourquoi simplement ne pas vider avec truncate table ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 11
    Points : 11
    Points
    11
    Par défaut plus de pb
    Merci pour ton observation , je pense aussi que la fait de supprimer les tables nuis aux performances mais cela ne m'explique pas pourquoi l'éxécution de la fonction est lente tant que je n'est pas lancé explicitement la requete qu'elle est censé faire.
    Les tables que je crée et supprime sont des tables temporaires de travail et elles évoluent ( ajout et suppression de colonnes) voila pourquoi je suis obligé de faire un drop et un create pour les initialiser afin d'être sur qu'elles aient la structure attendue.

    De toute façon, j'ai remis à plat toutes les requetes et les étapes nécessaire pour obtenir le résultat souhaité, et j'ai trouvé le moyen d'y parvenir sans aucune fonction ni vue et les performances sont tres correctes à présents ! J'avais intégré les fonctions parce que je trouvais ca pratique mais dans mon cas ca n'était pas indispensable.

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

Discussions similaires

  1. [2005] Invoquer une fonction définie par l'utilisateur dans un ordre SQL
    Par Pozzo dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 13/02/2014, 10h08
  2. Fonctions définies par les utilisateurs
    Par zglurb dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 19/10/2011, 11h19
  3. SQL dynamique dans une fonction définie par l'utilisateur
    Par messalux dans le forum Développement
    Réponses: 7
    Dernier message: 11/11/2010, 09h25
  4. Fonction défini par l'utilisateur
    Par m-mas dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/07/2005, 09h45
  5. SQL Server / Fonction définie par l'utilisateur
    Par borgfabr dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/03/2005, 15h14

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