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 :

Récupérer un liste de valeur, procédure ou fonction ?


Sujet :

Développement SQL Server

  1. #1
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut Récupérer un liste de valeur, procédure ou fonction ?
    Bonjour,

    Je souhaite connaître les différences de performances (et la raison) entre les différentes solutions suivantes :

    Différence de performances entre :
    - fonction qui retourne une table
    - procédure stockée qui effectue un SELECT
    - procédure stockée qui alimente une table temporaire

    Fonction qui retourne une table :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    create function GetCliSigleFromYear(@year int)
    returns @res table (cli_sigle varchar(6))
    as
    begin
    	insert into @res select cli_sigle from client where year(cli_naissance) = @year;
    	return;
    end;
    go
     
    select * from GetCliSigleFromYear(1990);
    => J'ai pu constater que c'était, et de loin, beaucoup plus lent que les deux autres solutions. Pourquoi ? Pour moi, une fonction ne modifiant pas les données dans la base, elle devrait pourtant être rapide, puisqu'il y a moins de verrous et de vérifications de cohérence à effectuer (??)

    Procédure stockée qui fait un select (et donc, ne devrait rien retourner) :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    create procedure SelectCliSigleFromYear(@year int)
    as
    begin
    	select cli_sigle from client where year(cli_naissance) = @year;
    end;
    go
     
    exec SelectCliSigleFromYear 1990;
    => D'après mes tests, c'est ce qu'il y a de plus rapide. Pourquoi ? Déjà, je ne comprends même pas pourquoi ça "retourne" quelque chose !

    Procédure stockée qui alimente une table temporaire :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    create procedure FillCliSigleFromYear(@year int)
    as
    begin
    	truncate table ##CliSigle;
    	insert into ##CliSigle (cli_sigle) select cli_sigle from client where year(cli_naissance) = @year;
    end;
    go
     
    create table ##CliSigle (cli_sigle varchar(6));
    exec FillCliSigleFromYear 1990;
    select * from ##CliSigle;
    drop table ##CliSigle;
    => Celle là se situe entre les deux, au détail près qu'on démultiplie les accès à la base, notamment lorsque le code est exécuté depuis une application cliente. Comment est-ce possible qu'il soit plus rapide de créer des objets (même temporaires) en base, que d'alimenter directement une variable ???

    Sémantiquement, la première solution me semble donc la meilleure. Cependant, d'après mes tests, c'est, et de loin, la plus lente... Pourquoi. Quelle autre solution privilégier ?

  2. #2
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 6

  3. #3
    Membre actif
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : R&D

    Informations forums :
    Inscription : Avril 2004
    Messages : 127
    Par défaut
    StringBuilder,

    Vu le code, je dirais qu'une vue ou la fonction table incluse sera beaucoup mieux que la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE FUNCTION GetCliSigleFromYear(@year int)
    RETURNS TABLE
    AS
    RETURN
       SELECT cli_sigle FROM client WHERE year(cli_naissance) = @year;
    go
     
    SELECT * FROM GetCliSigleFromYear(1990);
    Voir aussi ma notice Table temporaire vs table variable ce que corresponde "fonction table vs table temporaire".

    Si la fonction table incluse / vue (choix #1 toujours) ne peut pas être utilisée, il n'y a pas de solution unique et propre puisque cela dépende des volumes et des complexité des requêtes dont les fonctions/tables temporaires font la partie.

Discussions similaires

  1. [MySQL] Connaitre le nombre et récupérer la liste de valeur d'un champ
    Par clairetj dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 06/04/2015, 16h02
  2. Avis sur 2 solutions pour récupérer une liste de valeurs
    Par bernidupont dans le forum Oracle
    Réponses: 4
    Dernier message: 31/01/2015, 17h57
  3. [XL-2010] Récupérer une liste avec valeurs uniques depuis une colonne
    Par Onkas81 dans le forum Excel
    Réponses: 5
    Dernier message: 08/08/2013, 18h46
  4. Réponses: 4
    Dernier message: 01/08/2013, 14h50
  5. Réponses: 2
    Dernier message: 29/06/2007, 14h49

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