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 :

Performances des procédures stockées exécutant une requête recomposée EXEC "SELECT"


Sujet :

MS SQL Server

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Performances des procédures stockées exécutant une requête recomposée EXEC "SELECT"
    Développeurs, Développeuses SQL Server,

    J'ai besoin des lumières des Pros SQL Server concernant les performances d'une procédure stockée qui exécuterait une requête par un EXEC "SELECT ..." (requête recomposée dans une chaîne de texte) par rapport a une procédure qui exécuterait la même requête mais recomposée sans passer par une chaîne de texte.

    Est ce une méthode à bannir ? les performances peuvent elles être plombées par ce type de développement ? (si oui pourquoi)

    Quant est il de la compilation ou recompilation de ce type de procédure ? de la possibilité de la part du moteur SQL Server de réutiliser le plan d'exécution en cache ? etc ...

    Merci de vos réponses avisées

  2. #2
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    La différence, en terme de performance, entre le SQL Dynamique et les procédures stockées est négligeable (généralement inférieur à 1%). Donc, le choix entre le SQL Dynamique (EXEC ou sp_executesql) et les procédures stockées, est rarement (pour ne pas dire jamais) guidé par le critère de performance.
    Ceci dit, il est fortement recommandé d'utiliser sp_executesql en lieu et place de EXEC .. En effet, sp_executesql permet l'utilisation des paramètres et de ce fait, une meilleur réutilisation du plan d’exécution de la requête. sp_executesql est également fortement recommandée pour mieux se prémunir contre l'Injection SQL.

    Le choix entre le SQL Dynamique et les procédures stockée se fait par rapport à d'autres aspects aussi importants que sont par exemple :
    - "couplage faible" en faveur des procédures stockées : Mettre le code d'accès aux données dans une procédure stockée vous permet de modifier le comportement sans avoir à recompiler l'application
    - Problème d'Injection SQL en défaveur du SQL Dymanique
    - D'autre problème de sécurité en défaveur du SQL Dynamique, mais en faveur des procédures stockées. Vous pouvez par exemple autoriser un utilisateur à exécuter une procédures manipulant des tables sans pour autant autoriser l'utilisateur à accéder directement aux dites tables (emprunt d'identité - impersonate).
    - Souplesse en faveur du SQL dynamique
    - etc..

    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci d'avoir pris de le tps de me répondre.

    Mon problème n'est pas réellement l'utilisation de requête dynamique en dehors de procédure stockée. Actuellement j'ai plutôt choisi de développer des procédures stockées extrêmement flexibles et pour ce faire la requête est recomposée grâce à des variables qui sont renseignés suivant les paramètres passés à la procédure, ex : EXEC @SELECT + @WHERE + @ORDERBY.

    Il y a bien d'autres techniques qui permettent de créer des requêtes dynamiques en utilisant le CASE...WHEN...THEN...ELSE...END dans la clause WHERE seulement cette technique limite la flexibilité de mes procédures.

    En terme de performance je n'ai pas remarqué de différence entre les 2 méthodes pour une même requête générée au final.

    Je me pose tout de même une question en cas de charge importante du serveur ou de gros volume à traiter est ce que ce genre de développement ne peut pas poser problème ?

    Je ne vois pas pourquoi ce serait le cas mais je préfère demander conseil à des spécialistes expérimentés.

  4. #4
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Ci-dessous quelques remarques:
    - Il faut absolument bannir l'utilisation, dans la clause where, des expressions comme CASE...WHEN...THEN...ELSE...END. En effet, on abouti fatalement à des expression NON S-ARG (NON Searchable ARGguments), et une forte dégradation des performance. Il ne s'agit donc pas uniquement d'une question de flexibilité. Il faut toujours dans ce genre de situation privilégier le SQL Dynamique.

    - Pour revenir à ta question. En cas de charge importante du serveur ou de gros volume à traiter, la requête finale qui sera analysée et exécutée par le moteur de base de donnée sera la même, et si problème de performance il y a, il ne faudra pas l'imputer à l'utilisation du SQL dynamique, il faudra analyser la requête finale transmise au serveur, analyser le plan d'exécution, indexes etc.., et ce, indépendamment de la manière dont la requête a été exprimée initialement (SQL static ou SQL dynamique).

    - Il faudra aussi, évidement limiter le nombre d'enregistrement retournés par la procédure ; retourner des centaines de milliers voire même des millions d'enregistrements à l'application ou à l'utilisateur final, n'a généralement aucun sens, et constitue une totale ineptie ! Il faudra avoir recours au technique de pagination.

    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 735
    Points
    52 735
    Billets dans le blog
    5
    Par défaut
    Deux remarques :

    Citation Envoyé par hmira Voir le message
    La différence, en terme de performance, entre le SQL Dynamique et les procédures stockées est négligeable (généralement inférieur à 1%). Donc, le choix entre le SQL Dynamique (EXEC ou sp_executesql) et les procédures stockées, est rarement (pour ne pas dire jamais) guidé par le critère de performance.
    Le SQL dynamique est même meilleur lorsque ce sont des petites requêtes peu complexes.
    En revanche pour des requêtes très complexes du fait de la moindre optimisation du plna dans le cache cela peut être pénalisant.

    Citation Envoyé par hmira Voir le message
    - Il faut absolument bannir l'utilisation, dans la clause where, des expressions comme CASE...WHEN...THEN...ELSE...END. En effet, on abouti fatalement à des expression NON S-ARG (NON Searchable ARGguments), et une forte dégradation des performance.
    Là c'est faux, le CASE est optimisé depuis longtemps sur SQL Server !!!

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Deux remarques :
    Le SQL dynamique est même meilleur lorsque ce sont des petites requêtes peu complexes.
    En revanche pour des requêtes très complexes du fait de la moindre optimisation du plna dans le cache cela peut être pénalisant.
    Là ça m'intéresse , pour quelles raison le plna d'une requête dynamique complexe est moins optimisé dans le cache ?
    Si a chaque appel de la procédure dans le code de l'application on récupère les données qui servent à générer les jointures, la clause where et la clause order by, n'est il pas possible de parfaitement optimiser les index et les statistiques en conséquence et du coup optimiser l'utilisation du cache SQL ?

  7. #7
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Salut SQLPro, et Merci pour tes précisions.

    En fait j'ai voulu parler des cas d'utilisation, que j'ai rencontrés plusieurs fois, et où à vouloir obstinément rendre une procédure la plus générique possible, gérant tous les cas et combinaisons possibles des paramètres en entrée, le développeur a recours à l’utilisation du CASE portant sur des expressions tordues
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CASE (@param1 <> '' and (Champ1 = 'A') OR (@param2 <> '' AND champ2 = 'B') ..   THENEND
    au lieu d'utiliser le SQL dynamique pour faire en sorte que la requête ne traite que le cas concerné en fonction des paramètres effectifs reçus en entrée. J'ai vu des requêtes de ce genre mettant plus 4 minutes pour s’exécuter alors qu'en les remplaçant par le SQL dynamique en obtient le même résultat en quelque millisecondes.

    En fait j'ai voulu attirer l'attention sur le problème de performance des procédures générique lorsqu'on n'utilise pas le SQL dynamique.

    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 735
    Points
    52 735
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par ValM_ENI Voir le message
    Là ça m'intéresse , pour quelles raison le plan d'une requête dynamique complexe est moins optimisé dans le cache ?
    Parce que le cache de procédure (contenant les requêtes SQL) est sensible à la casse et tout un tas d'autres choses comme l'ordre des colonnes dans toutes les listes (claude SELECT, GROUP B Y, ORDER BY).
    Donc les requêtes suivantes :
    et et enfin
    Conduirons à 3 plans de requêtes différents.
    Alors qu'avec une requête statique paramétrée, ce phénomène est rare.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Je ne pensais pas que la position des colonnes dans la clause SELECT avait une quelconque importance.

    Du coup on peut tomber dans des travers du style :
    J'ai une table de 10 colonnes, l'application a besoin sur certaines pages d'avoir un retour d'infos des colonnes 1 2 3 6 7 sur d'autres 3 4 6 10 et sur d'autres seulement 2, 8. Et donc le mieux dans ce cas serait une procédure qui retourne toutes les colonnes (tjrs dans le même ordre) plutôt qu'une procédure qui propose le choix des colonnes à retourner ?

    je vais devoir me relancer sur des tests cette semaine je crois

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 735
    Points
    52 735
    Billets dans le blog
    5
    Par défaut
    Non, car plus il y a de volume et moins rapide sera la requête.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci à vous 2 pour toutes ces précisions.

    Ça me conforte dans l'idée qu'il vaut mieux passer du temps sur la conception de la base de données et proposer dans la plupart des cas des procédures génériques en analysant la façon dont elles sont appelées plutôt que de créer une multitude de procédures très spécifiques qu'il faut maintenir à chaque évolution/modification/correction des applications.

    Bon dimanche

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 735
    Points
    52 735
    Billets dans le blog
    5
    Par défaut
    ça n'est pas si simple car le générique à ses propres limites !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. utiliser une procédure stockées dans une requête SQL
    Par Issam dans le forum Développement
    Réponses: 3
    Dernier message: 21/11/2011, 10h18
  2. Remplacer une procédure stockée par une requête live
    Par antoniofr dans le forum Requêtes
    Réponses: 0
    Dernier message: 05/12/2008, 15h58
  3. Réponses: 6
    Dernier message: 31/03/2008, 10h49
  4. Liste des procédures stockées d'une base de données
    Par Delphi-ne dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 06/03/2008, 19h31

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