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 :

Comment se passer d'un curseur ?


Sujet :

Développement SQL Server

  1. #1
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut Comment se passer d'un curseur ?
    Bonjour,
    Je voudrais savoir s'il est possible de supprimer le curseur de la requête suivante afin d'améliorer les performances?
    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
    declare @ccy1 int, @ccy2 int
    declare curs1 cursor
    for select cp.Ccy1, cp.Ccy2
    	from CurrencyPair cp
    open curs1
    fetch from curs1 into @ccy1, @ccy2
    while @@fetch_status = 0
    begin
    	declare @y int
    	select @y = 1996
    	while (@y <= 2013)
    	begin
    		declare @m int
    		select @m = 1
    		while (@m <= 12)
    		begin
    			insert into CurrencyPair(Ccy1, Ccy2, Month, Year) values(@ccy1, @ccy2, @m, @y)
    			select @m = @m + 1
    		end
    		select @y = @y + 1
    	end
     
    	fetch from curs1 into @ccy1, @ccy2	
    end
    close curs1
    deallocate curs1

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Vous pouvez essayer ceci
    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
     
    ;WITH REF AS (
    	SELECT CAST('19960101' AS DATE) AS Dte
    	UNION ALL
    	SELECT DATEADD(MONTH, 1, dte)
    	FROM REF
    	WHERE dte < '20131201'
    )
    INSERT INTO CurrencyPair(Ccy1, Ccy2, Month, Year)
    	SELECT	cp.Ccy1, 
    			cp.Ccy2, 
    			MONTH(dte), 
    			YEAR(dte)
    	FROM	CurrencyPair cp
    	CROSS JOIN REF
    OPTION (MAXRECURSION 0)

  3. #3
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    wow, je découvre ce genre de syntaxe pour être honnête...
    1/ Il s'agit de common table expression, c'est ça?
    2/ Est-ce qu'il est normal que cela commence par ";" ?
    3/ L'option MAXRECURSION 0 est obligatoire ?
    4/ Je n'ai pas encore pu comparer la rapidité car ma première requête avec le curseur tourne toujours et elle va créer plus de 7 millions de lignes, mais a priori votre syntaxe est plus rapide que le curseur?
    Merci pour vos lumières,
    Julien

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par jmclej Voir le message
    1/ Il s'agit de common table expression, c'est ça?
    Oui, récursive ici. Elle sert à générer les dates sur la période donnée.

    Citation Envoyé par jmclej Voir le message
    2/ Est-ce qu'il est normal que cela commence par ";" ?
    en fait, c'est pour terminer un eventuelle commande qui se trouverait au dessus dans votre lot... Dans le cas des CTE, WITH doit etre le premier terme de l'instruction.

    Citation Envoyé par jmclej Voir le message
    3/ L'option MAXRECURSION 0 est obligatoire ?
    Par défaut, elle est a 100, donc cette requête sera en erreur.

    Citation Envoyé par jmclej Voir le message
    4/ Je n'ai pas encore pu comparer la rapidité car ma première requête avec le curseur tourne toujours et elle va créer plus de 7 millions de lignes, mais a priori votre syntaxe est plus rapide que le curseur?
    il y a des chances, tenez nous au courant !

  5. #5
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    en fait, c'est pour terminer un eventuelle commande qui se trouverait au dessus dans votre lot... Dans le cas des CTE, WITH doit etre le premier terme de l'instruction.
    D'accord, Cela n'empêche pas que l'on peut l'insérer au milieu d'un lot d'autres instructions non séparées par des go, n'est-ce pas?

    il y a des chances, tenez nous au courant !
    Effectivement c'était plus rapide, 5 minutes au lieu de 14h... Enfin je dis 14h, mais ça a crashé au bout d'environ 2h et ça avait fait un peu plus de 1/7 des insertions.

    Encore merci.

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par jmclej Voir le message
    D'accord, Cela n'empêche pas que l'on peut l'insérer au milieu d'un lot d'autres instructions non séparées par des go, n'est-ce pas?
    oui, en fait il s'agit de lever l'ambiguité sur le mot clef WITH , qui peut introduire une CTE, mais également des hint de table par exmple...

    Citation Envoyé par jmclej Voir le message
    Effectivement c'était plus rapide, 5 minutes au lieu de 14h... Enfin je dis 14h, mais ça a crashé au bout d'environ 2h et ça avait fait un peu plus de 1/7 des insertions.
    Encore merci.
    Étant donné le nombre de lignes insérées que vous avez évoqué, il pourrait même être utile de désactiver les index sur CurrencyPair s'il y en a et de les reconstruire après l'insertion

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

Discussions similaires

  1. [Débutant] Comment deployer un MenuItem sans passer par le curseur souris ?
    Par altahir007 dans le forum VB.NET
    Réponses: 11
    Dernier message: 06/08/2011, 21h53
  2. Comment se passer de ce curseur?
    Par Avatar dans le forum Développement
    Réponses: 3
    Dernier message: 09/03/2010, 13h48
  3. Réponses: 25
    Dernier message: 17/02/2005, 18h02
  4. Réponses: 5
    Dernier message: 08/03/2004, 10h28
  5. Comment limiter les mouvements du curseur??
    Par scorpiwolf dans le forum C++Builder
    Réponses: 9
    Dernier message: 07/07/2002, 22h09

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