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 :

simple select plus performant que procédure stockée


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 73
    Points : 48
    Points
    48
    Par défaut simple select plus performant que procédure stockée
    Bonjour,


    Je surveille actuellement une instance SQL SERVER 2000 EE SP4 avec le profiler. Je remarque qu'une procédure stockée exécutée est assez gourmande en ressources (nb de reads > 100 000) !!!. Cette procédure reçoit un paramètre de type tinyint en entrée, pour pouvoir l'optimiser la requête qu'elle contient j'ai exécute la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DECLARE @input TINYINT
    SET @INPUT = ...
    SELECT (traitement prenant en compte @INPUT identique à celui de la procédure)
    GO
    exec procedure_gourmande @INPUT= ...
    Si je regarde les plans d'exécution j'observe que la requête avec le SELECT et l'exécution de la procédure stockée donne des plans d'exécutions différents
    et si je regarde le profiler :
    SELECT => Nb read = 10 000
    Procédure stockée => NB read > 100 000

    Pouvez-vous m'aider ? Je ne comprends pas pourquoi la procédure stockée et le SELECT on des plans d'exécution différents et pourquoi le SELECT est beaucoup moins gourmand (en term de read).

    Merci d'avance.
    Cdlt.

  2. #2
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonjour,

    Pour pouvoir vous aider, il nous faut le code de la requête et les DDL des tables concernées (et éventuellement les index).

    ++

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    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 849
    Points : 52 975
    Points
    52 975
    Billets dans le blog
    6
    Par défaut
    De plus, vous devez préfixer par le schéma SQL tout les objets (Tables, vues, procédures, fonctions....) à défaut c'est dbo.

    A +

  4. #4
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 73
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    Tout d'abord merci de vos réponses.

    Pour répondre à Mikedavem, la requête est vraiment longue avec beaucoup de table est d'index, donc je veux vous épargner d'avoir à regarder tout ceci.

    Le point qui demeure obscure est le suivant, pourquoi peut-on obtenir des plans d'exécution différents si on exécute une requête SELECT dans une procédure stockée ou directement la même requête dans un batch T-SQL (attention je tiens à préciser que j'ai gardé exactement la même casse, les même noms ... entre la requête du batch T-SQL et celle présente dans la procédure stockée).

    Cdlt.

  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 849
    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 849
    Points : 52 975
    Points
    52 975
    Billets dans le blog
    6
    Par défaut
    Le contexte d'exécution peut être différent en fonction :
    • de l'utilisateur qui lance ("sa", user_sql ou compte NT)
    • du contexte d'exécution de la PS (EXECUTE AS)
    • du chainage des propriétaires
    • du préfixage par les schémas SQL

    Si rien de cela n'est ambigu, le plan devrait être le même !

    A +

  6. #6
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 73
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    @SQLPro : rien de ce que vous avez énuméré n'est ambigüe

    Désolé pour ma réponse tardive, en fait j'ai placé un "with recompile" derrière le exec nom_de_la_procedure et j'obtiens le même plan d'exécution que pour la requête simple.
    Le problème que j'ai observé est que si j'exécute de nouveau la procédure sans le "with recompile" je retombe sur mon problème initial.
    Si je re-exécute encore la procédure avec un "with recompile" j'obtiens de nouveau le même plan d'exécution que pour la requête simple.

    Le fait d'utiliser "with recompile" ne devrait-il pas recalculer le plan d'exécution une bonne fois sans avoir à le rajouter à la fin de la commande d'exécution de la procédure stockée. Si vous avez une réponse à mon problème ?

    Cdlt.

Discussions similaires

  1. Réponses: 31
    Dernier message: 22/04/2014, 14h55
  2. Réponses: 11
    Dernier message: 15/02/2011, 00h10
  3. Curseur plus performant que SELECT TOP 1 DELETE
    Par zinzineti dans le forum Administration
    Réponses: 4
    Dernier message: 12/07/2010, 12h15
  4. Batch T-SQL plus rapide que procédure stockée
    Par dens19 dans le forum Développement
    Réponses: 3
    Dernier message: 15/01/2010, 10h49
  5. [VB.NET]Performance exécution procédure stockée
    Par Franck2mars dans le forum Windows Forms
    Réponses: 3
    Dernier message: 29/05/2006, 16h11

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