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

Accès aux données Discussion :

Procédure stockée : comment faire plus simple / plus fiable ?


Sujet :

Accès aux données

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Points : 8
    Points
    8
    Par défaut Procédure stockée : comment faire plus simple / plus fiable ?
    Bonjour,

    Je débute tout juste en SQL server express, c'est etonnant tout ce que ca
    apporte... en particulier les procédures stockées..

    Pour ma part, voici le soucis. J'ai une table contenant 3 champs :
    Code / Date / Valeur
    Je cherche, pour une date donnée, à obtenir la valeur la plus récente
    pour chaque Code..
    En Access, je passais par 2 requêtes successives :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Code, Max(Date) AS MaxDeDate
    FROM MyDATA
    GROUP BY Code
    HAVING ((Max(Date))<#8/1/2007#);
    Pour récupérer les dates les plus récentes pour chaque code... Ensuite,
    je reliai cette requête avec la table de départ pour associer les champs
    Valeur avec les champs MaxDeDate..

    1ere question : est-il possible de faire plus simple, cad en une seule fois ?
    J'ai le sentiment qu'avec les sous-requêtes c'est possible mais je n'y arrive
    pas...

    Par ailleurs, j'ai reproduit ce schéma sous forme d'une procédure stockée :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    CREATE PROCEDURE dbo.GetLastValeur
    				(
    				   @Date datetime
    				)
    AS
    	DECLARE @LastDate TABLE
    	(
    		LastCode nchar(15),
    		LastDate datetime
    	)
    	DECLARE @Result TABLE
    	(
    		R_Code nchar(15),
    		R_Date datetime,
    		R_Valeur real
    	)
    BEGIN
    	INSERT INTO @LastDate
    	SELECT a.Code, Max(a.Date) AS MaxDeDate
    	FROM dbo.MyDATA AS a
    	GROUP BY a.Code
    	HAVING (((Max(a.Date))<@Date))
     
    	INSERT INTO @Result
    	SELECT b.LastCode, b.LastDate, c.Valeur
    	FROM @LastDate AS b, dbo.MyDATA AS c
    	GROUP BY b.LastCode, b.LastDate, c.Valeur, c.Code, c.Date
    	HAVING (b.LastCode = c.Code AND b.LastDate = c.Date)
     
    	SELECT * FROM @Result
    END
    GO
    Qui respecte donc ces 2 étapes décrites au dessus. Est-il possible de faire
    plus simple, plus rapide, plus fiable ? Ou ma solution est-elle convenable ?..

    Merci de votre aide, je débute pleinement en SQL Server mais je sens que
    ses possibilités sont plus qu'adaptées à mes besoins...

    Bonne journée.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    Alors tout d'abord il faut savoir que MSSQL Server est équipé d'un mécanisme qui décompile TOUTE les requetes SQL et les reconstruit comme lui l'entend.

    En réalité, il ne fait pas cela comme il en a envie, mais il décompose tes requetes en algebre relationnelle et reconstruit une requete à partir de là, pour "OPTIMISER" la requete, en fait il réordonne les différentes opérations pour obtenir un gain de temps souvent substanciel.

    Ensuite par le biais des requetes imbriquées tu peux très bien applanir des requetes qui se font en deux étapes.
    Ensuite tu peux simplement si ton traitement est long, mettre le tout dans une procédure stockée et la préparer avant l'exécution.


    Ensuite une amélioration facile à apporter à ton code...

    La table transitoire #Result est "INUTILE"
    En effet tu fait un
    INSERT INTO ... SELECT

    et tu ne fait aucune autre transformations sur cette table avant de la retourner par un SELECT * FROM #Result

    Supprime donc la déclaration de cette table #Result et supprime le INSERT INTO
    et laisse juste le SELECT directement !!!!
    Car en réalité ton second select se fait en mémoire, si tu le met dans une table temporaire, il n'est plus fait en mémoire/cache.
    Tu perd donc des performances sur un gros lot.

Discussions similaires

  1. Windows Azure : plus simple, plus flexible, plus ouvert
    Par Gordon Fowler dans le forum Microsoft Azure
    Réponses: 2
    Dernier message: 08/06/2012, 21h44
  2. Comment faire pour ne plus recevoir la Newsletter ?
    Par Yusha dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 4
    Dernier message: 25/11/2011, 19h34
  3. [Procédure stockée]comment faire pour vérifier l'état d'un job
    Par HelpmeMM dans le forum Développement
    Réponses: 5
    Dernier message: 28/04/2009, 16h11
  4. Comment faire pour entrer plus de 255 champs dans une table.
    Par adelsunwind dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 16/03/2009, 19h35
  5. case tableau: comment faire des hauteurs plus petites que 23px
    Par cortex024 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 28/11/2006, 17h01

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