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 :

[optimisation] arguments procédure stocké


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Mai 2009
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 66
    Points : 46
    Points
    46
    Par défaut [optimisation] arguments procédure stocké
    Bonjour,

    Je me retrouve à faire des procédures stokées pas plus compliquées que ça mais qui prennent des paramètres en arguments..

    Or si j'éxécute ma requête de façon "en dure" elle met 5 secondes mais si je remplace les valeurs statics par des arguments elle met plus de 45minutes?

    Pourquoi ô monde si cruel, tu met temps de temps!!!!

    Je croyais que les procédures stockées étaient justement fais pour ça!!

    je fais comment moi, pour filtrer mes résultats de mes tables si il accroit de façon exponentiel le temps alors que je lui rajoute des arguments...



    Merci pour votre aide

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    bonjour

    il faudrait qu'on en sache un peu plus (code sql, plan d'éxécution, statistics io)

    merci
    Emmanuel T.

  3. #3
    Membre du Club
    Inscrit en
    Mai 2009
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 66
    Points : 46
    Points
    46
    Par défaut
    ah oui dsl ,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT		s.reference AS 'Référence', s.prom AS 'Prom', s.nom AS 'Nom', DATEDIFF(YEAR, se.d_naissance, GETDATE()) AS 'Age', COUNT(*)
    FROM		mc JOIN s ON s.reference =  mc.reference
    			JOIN se ON se.reference = s.reference
    WHERE		mc.codification like 'TEA%'
    			AND	s.reference IN ( SELECT reference FROM table3 where d_sys between '01/01/2010' and GETDATE())
    			AND se.c1 like '%'
    			AND se.c2 like '%'
    			AND se.c3 like '%'
    			AND se.c8 like '%'
    			AND s.ville like '%'
    GROUP BY	s.reference, s.prom, s.nom, se.d_naissance
    HAVING		COUNT(*) >= 4
    ORDER BY	s.reference ASC
    puis la procédure stoké :

    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
    18
     
    DECLARE arg ...
     
    AS 
     
    SELECT		s.reference AS 'Référence', s.prom AS 'Prom', s.nom AS 'Nom', DATEDIFF(YEAR, se.d_naissance, GETDATE()) AS 'Age', COUNT(*)
    FROM		mc JOIN s ON s.reference =  mc.reference
    			JOIN se ON se.reference = s.reference
    WHERE		mc.codification like @arg1 
    			AND	s.reference IN ( SELECT reference FROM table3 where d_sys between @arg2 and @arg3)
    			AND se.c1 like @arg4 
    			AND se.c2 like @arg5 
    			AND se.c3 like @arg6 
    			AND se.c8 like @arg7 
    			AND s.ville like @arg8 
    GROUP BY	s.reference, s.prom, s.nom, se.d_naissance
    HAVING		COUNT(*) >= @arg9
    ORDER BY	s.reference ASC
    Voilà

  4. #4
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Je ne comprend pas l'utilisation que vous faites de LIKE.
    En effet, LIKE '%' ne vous permet pas de rechercher le caractère symbolisant un pourcentage, mais une chaîne de caractères contenant n'importe quel caractère, y compris une chaîne vide.
    Sachez ensuite que tout prédicat LIKE utilisant le joker % autre part qu'en fin de prédicat n'est pas SARGable.
    Si vous souhaitez chercher le caractère symbolisant le pourcentage, jetez un œil ici
    C'est de l'utilisation que vous faites de LIKE

    Autre petite remarque : qualifiez le nom des objets qui participent à vos requêtes avec le nom du schéma auquel ils appartiennent.
    Cela évite au moteur de base de données de le rechercher dans les tables de métadonnées
    Enfin une colonne n'est pas une valeur, donc il est incorrect de la "coder" comme une valeur de chaîne.

    Donc votre requête non paramétrée pourrait s'écrire comme suit :

    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
    18
    19
    20
    21
    22
    SELECT		s.reference AS Référence
    		, s.prom AS Prom
    		, s.nom AS Nom
    		, DATEDIFF(YEAR, se.d_naissance, GETDATE()) AS Age
    		, COUNT(*)
    FROM		dbo.mc
    JOIN		dbo.s
    			ON s.reference =  mc.reference
    JOIN		dbo.se
    			ON se.reference = s.reference
    JOIN		dbo.table3 AS t
    			ON s.reference = t.reference
    			AND t.d_sys BETWEEN '20100101' AND GETDATE()
    WHERE		mc.codification LIKE 'TEA%'
    AND		se.c1 LIKE '\%'
    AND		se.c2 LIKE '\%'
    AND		se.c3 LIKE '\%'
    AND		se.c8 LIKE '\%'
    AND		s.ville LIKE '%'
    GROUP BY	s.reference, s.prom, s.nom, se.d_naissance
    HAVING		COUNT(*) >= 4
    ORDER BY	s.reference ASC
    quels sont les index sur les tables qui participent à la requête ?
    Si vous souhaitez paramétrer celle-ci, il vous faudra tester dans votre procédure stockée que la variable ne contient pas de % ou de crochets, auquel cas il vous faudra créer votre prédicat à l'aide d'ESCAPE.

    @++

  5. #5
    Membre du Club
    Inscrit en
    Mai 2009
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 66
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    Tout d'abord merci pour votre aide construite et bien expliquée.

    Premier point, je cherche non pas un pourcentage mais belle et bien '%' (joker qui prend tout).
    En effet, ma requête sert à filtrer certaines colonnes avec des paramètres. Donc si le paramètre est vide, il faut tout prendre. D'où le '%'.
    Je ne sais pas si je m'exprime bien , désolé.

    Deuxième point, j'ai bien entendu commencé par faire une jointure pour la table3 mais cela était vraiment plus long. Pourquoi? parce que j'en sais rien.
    En plus je ne suis pas fan de la recherche dans le IN (...) avec une autre requête mais c'est plus rapide alors...


    Exemple typique de l'utilisation du la procédure stokée de nom TEST:
    si je veux filtrer par ville et en suposant quelle prenne en compte 7 arguments (date début période, date fin période, c1, c2, c3, c4, ville):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TEST '', '', '', '', '', '', 'PARIS'
    Valeur default dans la procédure stokée:
    date début : '010120010'
    date fin : getDate()
    c1 : '%'
    c2 : '%'
    c3 : '%'
    c8 : '%'

    qui donne :

    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
    18
    19
    20
    21
    22
    SELECT		s.reference AS Référence
    		, s.prom AS Prom
    		, s.nom AS Nom
    		, DATEDIFF(YEAR, se.d_naissance, GETDATE()) AS Age
    		, COUNT(*)
    FROM		dbo.mc
    JOIN		dbo.s
    			ON s.reference =  mc.reference
    JOIN		dbo.se
    			ON se.reference = s.reference
    JOIN		dbo.table3 AS t
    			ON s.reference = t.reference
    			AND t.d_sys BETWEEN '20100101' AND GETDATE()
    WHERE		mc.codification LIKE 'TEA%'
    AND		se.c1 LIKE '%'
    AND		se.c2 LIKE '%'
    AND		se.c3 LIKE '%'
    AND		se.c8 LIKE '%'
    AND		s.ville LIKE 'PARIS%' --il peut y avoir PARIS-NORD PARIS-SUD
    GROUP BY	s.reference, s.prom, s.nom, se.d_naissance
    HAVING		COUNT(*) >= 4
    ORDER BY	s.reference ASC
    mais c'est toujours aussi long avec les arguments (en plus de la jointure)

    Merci encore , bonne journée

  6. #6
    Membre actif Avatar de David.V
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2004
    Messages : 191
    Points : 203
    Points
    203
    Par défaut
    Bonjour,

    Voila comment moi j'aurais écrit votre procédure :

    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
     
    SELECT		s.reference AS 'Référence', s.prom AS 'Prom', s.nom AS 'Nom', DATEDIFF(YEAR, se.d_naissance, GETDATE()) AS 'Age', COUNT(*)
    FROM		mc
    INNER JOIN s ON s.reference =  mc.reference
    INNER JOIN se ON se.reference = s.reference
    WHERE			(@arg1 = '' OR mc.codification LIKE @arg1)
    			AND	EXISTS (SELECT * FROM reference FROM table3 WHERE table3.reference = s.reference AND d_sys BETWEEN @arg2 AND @arg3)
    			AND (@arg4 = '' OR se.c1 LIKE @arg4 )
    			AND (@arg5 = '' OR se.c2 LIKE @arg5 )
    			AND (@arg6 = '' OR se.c3 LIKE @arg6 )
    			AND (@arg7 = '' OR se.c8 LIKE @arg7 )
    			AND (@arg8 = '' OR s.ville LIKE @arg8 )
    GROUP BY	s.reference, s.prom, s.nom, se.d_naissance
    HAVING		COUNT(*) >= @arg9
    ORDER BY	s.reference ASC
    A tester maintenant..

  7. #7
    Membre du Club
    Inscrit en
    Mai 2009
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 66
    Points : 46
    Points
    46
    Par défaut
    Je ne comprend pas pourquoi mais c'est plus rapide...

    Merci beaucoup!

    Si ils y en a qui s'ennui... j'ai lu , grâce au lien juste au dessut, qu'il fallait évité les 'OR'... Or là, David.V en rajoute !! et c'est plus rapide.

    Bref merci encore

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    Je ne comprend pas pourquoi mais c'est plus rapide...
    Il faudrait comparer les plans d'exécution et la consommation en E/S. Vous y trouverez sûrement la réponse.
    Emmanuel T.

  9. #9
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Citation Envoyé par freuh94
    j'ai lu , grâce au lien juste au dessut, qu'il fallait évité les 'OR'... Or là, David.V en rajoute !! et c'est plus rapide.
    Un OR entre une variable et une colonne fonctionne très bien.
    En revanche entre 2 colonnes ...

    @++

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/01/2013, 19h09
  2. optimiser une procédure stockée
    Par ed222 dans le forum Développement
    Réponses: 8
    Dernier message: 15/06/2010, 17h30
  3. [AC-2007] Erreur type argument procédure stockée
    Par Kawabaumga dans le forum VBA Access
    Réponses: 6
    Dernier message: 10/06/2010, 08h32
  4. [SQL2005] Optimiser une procédure stockée
    Par david_chardonnet dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 20/12/2006, 15h48
  5. Réponses: 5
    Dernier message: 09/05/2005, 12h24

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