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 :

Procedure stockee VS commande SQL


Sujet :

MS SQL Server

  1. #1
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    344
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 344
    Points : 324
    Points
    324
    Par défaut Procedure stockee VS commande SQL
    Bonjour,

    Je me tourne vers vous car il y a un comportement de SQL Server que je ne comprends pas.
    Nous avons créé une procédure stockée qui est définie comme suit:
    CREATE PROCEDURE [dbo].[ma_proc]
    (
    @variable int
    )
    AS
    SET NOCOUNT ON;
    Select
    *
    From
    ma_table
    Where
    (champs1 = @variable Or @variable is null)
    GO
    la table ma_table possède une clé primaire (donc clustered) sur le champs1 (et uniquement ce champs là), mais aussi un index non clustered sur un champs2.
    Lorsque je regarde le plan d'exécution de la procédure stockée, il fait un index scan en utilisant l'index non clustered sur le champs2 (??? pourquoi ???), alors que si je prend la requête SQL et que je regarde directement le plan d'exécution de celle-ci, il me fait bien un index seek sur la clé primaire positionnée sur le champs1.

    Ce n'est pas un problème de statistiques, car je les recalcule et il fait pareil ...
    Quelqu'un aurait une explication ???

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Points : 502
    Points
    502
    Par défaut
    Salut,

    rien à voir avec ta question (quoi que ?) mais je ne comprends pas ce test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (champs1 = @variable Or @variable is null)

  3. #3
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    344
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 344
    Points : 324
    Points
    324
    Par défaut
    ouais .. tu as raison, je ne suis pas très clair sur le titre. En fait, je voulais parler de la différence entre utiliser la requête SQL directement ou encapsulée dans une SP.
    La procédure stockée est lancée de cette manière :

    exec ma_proc @variable = xxxxx
    où les xxxxx est un chiffre. Pour ce qui est du test, je reprends cette proc d'un autre programmeur .... J'ai aussi posé la question mais je n'ai pas eu de réponse. Tu penses que ça aurait une incidence sur l'utilisation ou non du bon index ? Selon que l'on teste la SP ou directement la requête SQL ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Points : 502
    Points
    502
    Par défaut
    Citation Envoyé par usf70
    ouais .. tu as raison, je ne suis pas très clair sur le titre. En fait, je voulais parler de la différence entre utiliser la requête SQL directement ou encapsulée dans une SP.
    si si la question était très claire t'inquiète




    Citation Envoyé par usf70
    Pour ce qui est du test, je reprends cette proc d'un autre programmeur .... J'ai aussi posé la question mais je n'ai pas eu de réponse. Tu penses que ça aurait une incidence sur l'utilisation ou non du bon index ? Selon que l'on teste la SP ou directement la requête SQL ?
    Ben si tu veux si on traduit en français la requete ca veut dire :
    "donne moi toutes les clonnes de matables pour lequelles le champs1 est égale à la valeur ou valeur = null".

    Bref ca veut rien dire... A moins que les connaissances SQL ne me permettent pas de comprendre une telle syntaxe.

    Si il voulait dire :
    "si valeur est null, on renvoie tout, ou sinon, on renvoie uniquement les lignes pour lesquels champs1= valeur non nulle", ben j'aurais pas du tout écris cela comme cela...

    Du coup, oui cela peut avoir une incidence sur le moteur sql.

  5. #5
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    344
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 344
    Points : 324
    Points
    324
    Par défaut
    J'ai trouvé cette page sur le site de microsoft:

    http://msdn2.microsoft.com/fr-fr/library/ms190439.aspx

    qui explique que si on a modifié une table qui est utilisée par une procédure stockée (rajout d'un index par exemple), la SP ne vera pas la modification, sauf si on la recompile. En fait, elle conserve son plan d'exécution initial tant qu'elle n'a pas été recompilée.

    Serait-ce ça mon problème ???

  6. #6
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    344
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 344
    Points : 324
    Points
    324
    Par défaut
    OK, j'ai réussi à cerner le problème. Et ZERS avait raison. C'est bien le test
    @variable is null
    qui fausse le plan d'exécution.
    J'ai remplacé ma SP par :

    CREATE PROCEDURE [dbo].[ma_proc] with RECOMPILE
    (
    @variable int
    )
    AS
    SET NOCOUNT ON;
    if @variable is null
    begin
    Select * From ma_table
    end
    else
    begin
    Select * From ma_table Where (champs1 = @variable)
    end
    Et là, c'est OK. Merci de ton aide ZERS.

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

Discussions similaires

  1. [JBoss][SQL SERVER] Procedures stockees
    Par dauggui dans le forum Wildfly/JBoss
    Réponses: 2
    Dernier message: 20/06/2006, 18h27
  2. [Pl/SQL]Probleme Procedure stockee[/Pl/SQL]
    Par rafounette dans le forum Oracle
    Réponses: 4
    Dernier message: 14/06/2006, 12h56
  3. Access et les procedures stockees sur sql server
    Par ouazou dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 20/09/2005, 13h08
  4. asp - procedure stockee - sql server
    Par nadege06130 dans le forum ASP
    Réponses: 7
    Dernier message: 06/08/2005, 13h31
  5. procedure stockee et sql
    Par fred33 dans le forum SQL
    Réponses: 2
    Dernier message: 27/11/2003, 10h23

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