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 :

Optimiser procédure stockée


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Chacha35
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 264
    Par défaut Optimiser procédure stockée
    Bonjour,

    J'ai une procédure stockée qui prend 3 varchar comme parametres, mais ils peuvent être égaux à "" donc je fais ma clause where en fonction de mes varchar. Si le varchar est vide je ne fais pas de like.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ALTER PROCEDURE [dbo].[Consult_SearchAvecCodeCltDescSGR] (@CodeCltContient varchar(50),@DescContient varchar(50),@SGRMagContient varchar(50),@Env varchar(50))
    AS 
    IF ( @CodeCltContient != '' AND @DescContient = '' AND @SGRMagContient = '') 
    SELECT DISTINCT KNKNDK,KNKNMN,LAPRTN,LALADI 
    FROM KNDF
    INNER JOIN KLAF ON KLAF.LAKNDI = KNDF.KNKNDI
    WHERE KNKNDK LIKE '%' + @CodeCltContient + '%' AND KNDF.ENV_CD = @Env ORDER BY KNKNDK
     
    ELSE IF ( @CodeCltContient != '' AND @DescContient != '' AND @SGRMagContient = '') 
    SELECT DISTINCT KNKNDK,KNKNMN,LAPRTN,LALADI 
    FROM KNDF
    INNER JOIN KLAF ON KLAF.LAKNDI = KNDF.KNKNDI
    WHERE KNKNDK LIKE '%' + @CodeCltContient + '%' AND KNKNMN LIKE '%' + @DescContient + '%' AND KNDF.ENV_CD = @Env ORDER BY KNKNDK
    Et cela pour tous les autres cas.

    Y a t-il un façon plus optimisée d'écrire cette procédure?

    Merci d'avance

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Le like joker devant + joker derrière n'est pas optimisable par l'indexation courante car il faut lire tout le contenu de la ligne caractère par caractère...
    Le like joker derrière est directement optimisable.
    Le like joker devant est optimisable à condition de créer une colonne calculée indexée qui renverse le littéral et baser sa recherche dessus

    Quand au like avec joker devant et derrière il faut implémenter une stratégie d'indexation textuelle ou recourir aux index rotatifs.

    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/ * * * * *

  3. #3
    Membre éclairé Avatar de Chacha35
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 264
    Par défaut
    Merci pour ta réponse. Mais c'était surtout au niveau des if que j'aurais voulu optimiser, car je n'ai mis qu'une partie du code.

    En effet je fais :

    Si varchar1 != "" et varchar2 = "" et varchar3 = ""

    Si varchar1 != "" et varchar2 != "" et varchar3 = ""

    Si varchar1 != "" et varchar2 != "" et varchar3 != ""
    ...

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    1) l'opérateur différent de est <> et non !=
    2) les chaines de caractères se délimitent par des apostrophes ' et non par des guillemets. Ceci a son importance pour les performance.
    3) il serait préférable de faire un CASE plutôt qu'une série de IF systématiquement testé
    4) le mieux est de placer le CASE dans 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/ * * * * *

  5. #5
    Membre éclairé Avatar de Chacha35
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 264
    Par défaut
    J'ai tenter ça mais il me dit qu'il y a une erreur de syntaxe sur le LIKE:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ALTER PROCEDURE [dbo].[Consult_SearchAvecCodeCltDescSGR] (@CodeCltContient varchar(50),@DescContient varchar(50),@SGRMagContient varchar(50),@Env varchar(50))
    AS  
    SELECT DISTINCT KNKNDK,KNKNMN,LAPRTN,LALADI 
    FROM KNDF
    INNER JOIN KLAF ON KLAF.LAKNDI = KNDF.KNKNDI
    WHERE 
    CASE WHEN @CodeCltContient <> '' THEN KNKNDK LIKE '%' + @CodeCltContient + '%' AND
    CASE WHEN @DescContient <> '' THEN KNKNMN LIKE '%' + @DescContient + '%'
    CASE WHEN @SGRMagContient <> '' THEN (LAPRTN LIKE '%' + @SGRMagContient + '%' OR LALADI LIKE '%' + @SGRMagContient + '%')
    AND KNDF.ENV_CD = @Env ORDER BY KNKNDK

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Le squelette de syntaxe de CASE est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CASE uneColonneOuUneVariable
    	WHEN valeur THEN valeur
    	ELSE valeurParDefaut
    END
    Le ELSE est facultatif, mais pas le END

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    SELECT DISTINCT KNKNDK,KNKNMN,LAPRTN,LALADI 
    FROM KNDF
    INNER JOIN KLAF ON KLAF.LAKNDI = KNDF.KNKNDI
    WHERE CASE
    		WHEN @CodeCltContient <> '' THEN KNKNDK LIKE '%' + @CodeCltContient + '%'
    	END
    AND CASE
    		WHEN @DescContient <> '' THEN KNKNMN LIKE '%' + @DescContient + '%'
    	END
    AND CASE
    		WHEN @SGRMagContient <> '' THEN
    									(
    										LAPRTN LIKE '%' + @SGRMagContient + '%'
    										OR LALADI LIKE '%' + @SGRMagContient + '%'
    									)
    	END
    AND KNDF.ENV_CD = @Env ORDER BY KNKNDK
    @++

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

Discussions similaires

  1. Optimisation Procédure Stockée
    Par neojeff dans le forum Développement
    Réponses: 3
    Dernier message: 15/06/2011, 17h24
  2. Optimisation Procédure stocké utilisant 2 curseurs
    Par m-mas dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 23/02/2007, 09h27
  3. [SQL SVR 2K]Optimisation procédure stockée
    Par Franck2mars dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/06/2006, 13h41
  4. Réponses: 6
    Dernier message: 21/06/2005, 15h06
  5. Réponses: 5
    Dernier message: 04/10/2004, 18h20

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