Question : Le code de SQL a besoin changer ou optimiser - using le curseur actuellement

Hi

I ont hérité du code suivant à un nouveau rôle - écrit par un réalisateur beaucoup de lunes ago.
Issues avec ce sont qu'il prend un grand nombre de temps de retourner et beaucoup de ressources sur la base de données affligeant underspecced du courant server.
The est en mode de compatibilité 2k sur un SQL 2005 server.

I apprécieraient un regard au code et une réécriture du code pour l'optimiser le
ou même une meilleure manière de la faire differently.
Im occupé sur d'autres sujets ainsi n'ont pas le temps pour faire ce processus moi-même par conséquent pourquoi im recherchant une réponse complète que je peux juste run.
Id également être intéressé par quelles personnes pensent est erroné avec ceci… le

Please n'offrent pas un

I peut n'offrir aucune autre information needed.
i ont attaché un dossier avec le code - qui montre le contenu de la vue qui s'appelle dans le sproc.

Thank vous class= les " lineNumbers " >
1 de >

Mo : 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 : 33 : 34 : 35 : 36 : 37 : 38 : 39 : 40 : 41 : 42 : 43 : 44 : 45 : 46 : 47 : 48 : 49 : 50 : 51 : 52 : 53 : 54 : 55 : 56 : 57 : 58 : 59 : 60 : 61 : 62 : 63 : 64 : 65 : 66 : 67 : 68 : 69 : 70 : 71 : 72 : 73 : 74 : 75 : 76 : 77 : 78 : 79 : 80 : 81 : 82 : 83 : 84 : 85 : 86 : 87 : 88 : 89 : 90 : 91 : 92 : 93 : 94 : 95 : 96 : 97 : 98 : 99 : 100 : 101 : 102 : 103 : 104 : 105 : 106 : 107 : 108 : 109 : 110 : 111 : 112 : 113 : 114 : 115 : 116 : 117 : 118 : 119 : 120 : 121 : 122 : 123 : 124 : 125 : 126 : 127 : 128 : 129 : procédé " de
CREATE de " prettyprint " de class= de l'id= " codeSnippet910884 " de >
 0 et 
                STANDARDMINUTESACHIEVED = 0) -- vérifier seulement si possible les absences appropriées de jour complet dans la « fenêtre »
  ordre près
   eiv.EmployeeID,
   tsd.ADMINISTRATIONDATE
 pour lu seulement

créer la table #tmp9001
(
 Char d'EmployeeID (6),
 Date-heure de NPDDay,
 Date-heure de PrevWorkDayAbs,
 Date-heure de NextWorkDayAbs
)

ouvrir l'emp_cur
chercher après de l'emp_cur dans le @w_EmployeeID, @w_EmployeeCode, @w_NPDDay

si <> 0 de @@fetch_status
 end_ret goto -- aucunes données de qualification au processus

tandis que @@fetch_status = 0
 commencer -- boucle de curseur

  -- déterminer les jours précédents et suivants de travail
  @w_RetStatus d'exec = @w_EmployeeId de dbo.xPLT_PrevNextWorkDay, @w_NPDDay, 0, rendement @r_PrevWorkDay, rendement @r_NextWorkDay
  si <> 0 de @w_RetStatus
   commencer
    choisir le @w_RetMsg = « xPLT_WTAAbsenceSpanNPD : appeler à xPLT_PrevNextWorkDay avec le code retour :  » + converti (char (1), @w_RetStatus)
    raiserror ("%s », 18.1, @w_RetMsg)
    choisir le @w_RetCode = 1
    end_ret goto
   extrémité

  -- déterminer l'absence de jours complets des jours précédents et suivants de travail
  si 
   (
    choisi 
     compte (*)
    de 
     dbo.TIMESUMMARYDAY DST avec (nolock)
    là où 
     tsd.EMPLOYEECODE = @w_EmployeeCode et
     (tsd.ADMINISTRATIONDATE = @r_PrevWorkDay ou tsd.ADMINISTRATIONDATE = @r_NextWorkDay) et
     tsd.STANDARDMINSINDAILYPATTERN > 0 et
     tsd.STANDARDMINUTESACHIEVED = 0
   ) = 2
   commencer
    insérer dans #tmp9001 (EmployeeID, NPDDay, PrevWorkDayAbs, NextWorkDayAbs)
     valeurs (@w_EmployeeID, @w_NPDDay, @r_PrevWorkDay, @r_NextWorkDay)
   extrémité 
     
    
  chercher après de l'emp_cur dans le @w_EmployeeID, @w_EmployeeCode, @w_NPDDay
  
 extrémité -- boucle de curseur


-- resultset de retour
choisi 
 t1.*,
 eiv. Nom de famille,
 eiv. Prénoms,
 eiv. Centre,
 eiv. Équipe
 de 
  T1 #tmp9001
   intérieur joindre l'eiv de dbo.xPLT_EmpInfo_Vw
    sur t1.EmployeeID = eiv.EmployeeID ASSEMBLENT Latin1_General_CI_AS
 ordre près 
  t1.EmployeeID,
  t1.NPDDay

end_ret :
emp_cur étroit
désaffecter l'emp_cur
laisser tomber la table #tmp9001
renvoyer le @w_RetCode


ALLER
nom de fichier " " de >

le " le " de >
class= de

Réponse : Le code de SQL a besoin changer ou optimiser - using le curseur actuellement

mooriginal

Après regard d'une votre situation, il est clair que puisque vous n'avez aucune manière de l'archivage plus ancienne (historique)
les données, votre exécution souffriront comme le temps continue et plus de disques sont ajoutés.

J'ai couru ce code avec 5 millions de disques de TIMESUMMARYDAY et 15 mille disques des EMPLOYÉS
(Aléatoirement produit) sur un vieux système 2005 de SQL et un 11k retourné a comme conséquence plus moins sec de 50.

Avoir faire encore n'importe quelle optimisation, ou attemped pour se débarasser du curseur.  L'idée est de créer 2
la table de temp et les emploient pour créer l'ensemble de résultat.  Est après créer ces tables sur la base de données
(n'avoir encore aucun index) et tronquer, remplir, et indexer les données et puis courir la question.
Ceci devrait améliorer l'exécution.    
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 :
33 :
34 :
35 :
36 :
37 :
38 :
39 :
40 :
41 :
42 :
43 :
44 :
45 :
46 :
47 :
48 :
49 :
50 :
51 :
52 :
53 :
54 :
55 :
56 :
57 :
58 :
59 :
60 :
61 :
62 :
63 :
64 :
65 :
66 :
67 :
68 :
69 :
70 :
71 :
72 :
73 :
74 :
75 :
76 :
77 :
78 :
79 :
80 :
81 :
82 :
83 :
84 :
85 :
86 :
87 :
88 :
89 :
90 :
91 :
92 :
93 :
94 :
95 :
96 :
97 :
98 :
99 :
100 :
101 :
102 :
103 :
104 :
105 :
106 :
107 :
108 :
109 :
110 :
111 :
112 :
113 :
114 :
115 :
116 :
117 :
118 :
119 :
120 :
121 :
122 :
123 :
124 :
125 :
126 :
127 :
128 :
129 :
130 :
131 :
132 :
133 :
134 :
135 :
136 :
137 :
138 :
139 :
140 :
141 :
142 :
143 :
144 :
145 :
146 :
147 :
148 :
149 :
150 :
151 :
152 :
153 :
154 :
155 :
156 :
157 :
158 :
159 :
160 :
161 :
162 :
163 :
164 :
165 :
166 :
167 :
168 :
--NOUVEAUX RÉSULTATS DE CURSEUR

déclarer
 @w_RetCode	        international,
 @w_RetStatus		international,

 @w_RetMsg          varchar (255),
 date-heure     @r_PrevWorkDay,
 date-heure     @r_NextWorkDay,
 char		de @w_EmployeeID (6),
 @w_EmployeeCode	international,
 date-heure			@w_NPDDay,

 date-heure        de @p_BeginDate,
 date-heure          de @p_EndDate



choisir le @w_RetCode = 0
choisir le @p_BeginDate = « 08/01/10 »
choisir le @p_EndDate = « 08/10/10 »



DÉCLARER
	 date-heure        de @TMP_BeginDate,
	 date-heure          de @TMP_EndDate

PLACER le @TMP_BeginDate = le DATEADD (sem., -3, le @p_BeginDate)
PLACER le @TMP_EndDate = le DATEADD (sem., +3, le @p_EndDate)

DÉCLARER LA TABLE de @TSD (CNT [l'international] NON NUL,
	[EMPLOYEECODE] [international] PAS ANNULER,
	[ADMINISTRATIONDATE] [date-heure] NULLE,
	[DAILYPATTERNCODE] [international] NULLE,
	[STANDARDMINSINDAILYPATTERN] [smallint] NULLE,
	[STANDARDMINUTESACHIEVED] [smallint] PAS NULLE)

INSÉRER DANS LE @TSD
	CHOISIR	CNT
			, EMPLOYEECODE
			, ADMINISTRATIONDATE
			, DAILYPATTERNCODE
			, STANDARDMINSINDAILYPATTERN
			, STANDARDMINUTESACHIEVED
	De dbo.TIMESUMMARYDAY
	LÀ OÙ DAILYPATTERNCODE = 68206 ET
    ADMINISTRATIONDATE 	ENTRE LE @TMP_BEGINDATE ET LE @TMP_ENDDATE

SUPPRESSION  DE @TSD 
LÀ OÙ (STANDARDMINSINDAILYPATTERN = 0 ET STANDARDMINUTESACHIEVED <> 0)


DÉCLARER LA TABLE DE @EMP (
	[EmployeeId] [varchar] (15) PAS ANNULER,
	[EmployeeCode] [international] NULLE,
	[Nom de famille] [varchar] (40) ANNULENT,
	[Prénoms] [varchar] (40) ANNULENT,
	[Équipe] [varchar] (16) ANNULENT,
	[Centre] [varchar] (5) NULLE)


INSERTION DANS LE @EMP
	CHOISIR	EmployeeId
			, EmployeeCode
			, Nom de famille
			, Prénoms
			, Centre
			, Équipe
	De dbo.xPLT_EmpInfo 
	LÀ OÙ active > 0

DÉCLARER LE CURSEUR d'emp_cur pour
	
 CHOISIR
  eiv.EmployeeID,
  tsd.EMPLOYEECODE,
  tsd.ADMINISTRATIONDATE
  De l'eiv de @EMP 
  intérieur joindre le @TSD DST
  sur eiv.EmployeeCode = tsd.EmployeeCode
  LÀ OÙ
   tsd.ADMINISTRATIONDATE entre le @p_BeginDate et le @p_EndDate et
   tsd.STANDARDMINSINDAILYPATTERN = 0



CRÉER LA TABLE #TMP9001
(
 Char			d'EmployeeID (6),
 Date-heure				de NPDDay,
 Date-heure		de PrevWorkDayAbs,
 Date-heure		de NextWorkDayAbs
)

ouvrir l'emp_cur
chercher après de l'emp_cur dans le @w_EmployeeID, @w_EmployeeCode, @w_NPDDay

si @@fetch_status <> 0
 end_ret goto -- aucunes données de qualification au processus

tandis que @@fetch_status = 0
 commencer -- boucle de curseur

  -- déterminer les jours précédents et suivants de travail

  @w_RetStatus d'exec = @w_EmployeeId de dbo.xPLT_PrevNextWorkDay, @w_NPDDay, 0, rendement @r_PrevWorkDay, rendement @r_NextWorkDay
  si @w_RetStatus <> 0
   commencer
    choisir le @w_RetMsg = « xPLT_WTAAbsenceSpanNPD : appeler à xPLT_PrevNextWorkDay avec le code retour :  » + converti (char (1), @w_RetStatus)
    raiserror ("%s », 18.1, @w_RetMsg)
    choisir le @w_RetCode = 1
    end_ret goto
   extrémité

  -- déterminer l'absence de jours complets des jours précédents et suivants de travail
  si 
   (
    choisi 
     compte (*)
    de 
     @TSD DST
    là où 
     tsd.EMPLOYEECODE = @w_EmployeeCode et
     (tsd.ADMINISTRATIONDATE = @r_PrevWorkDay ou tsd.ADMINISTRATIONDATE = @r_NextWorkDay) et
     tsd.STANDARDMINSINDAILYPATTERN > 0 et
     tsd.STANDARDMINUTESACHIEVED = 0
   ) = 2
   commencer
    insérer dans #tmp9001 (EmployeeID, NPDDay, PrevWorkDayAbs, NextWorkDayAbs)
     valeurs (@w_EmployeeID, @w_NPDDay, @r_PrevWorkDay, @r_NextWorkDay)
   extrémité 

  chercher après de l'emp_cur dans le @w_EmployeeID, @w_EmployeeCode, @w_NPDDay

 extrémité -- boucle de curseur


-- resultset de retour

choisi 
 t1.*,
 eiv. Nom de famille,
 eiv. Prénoms,
 eiv. Centre,
 eiv. Équipe
 de 
  T1 #tmp9001
   intérieur joindre l'eiv de dbo.xPLT_EmpInfo_Vw
    sur t1.EmployeeID = eiv.EmployeeID ASSEMBLENT Latin1_General_CI_AS
 ordre près 
  t1.EmployeeID,
  t1.NPDDay


--choisir * à partir  de T1 #tmp9001

end_ret :


emp_cur étroit
désaffecter l'emp_cur
laisser tomber la table #tmp9001

--renvoyer le @w_RetCode
choisir le @w_RetCode

ALLER
Autres solutions  
  •  MS Excel 2007 et pdf - l'exportation vers le pdf prend de longues heures !
  •  Dans le Perl, comment j'ajoute une valeur à la liste, puis le contrôle pour voir si la valeur existent avant d'ajouter une nouvelle valeur
  •  Comment fais j'initialiser de la HP BL460c G6 de san et de la HP XP 240000
  •  Comment fais j'employer une clef de permis de volume sur un ordinateur de HP avec du CD de restauration
  •  Emplacement primaire de deux SCCM dans l'annuaire actif
  •  L'initiateur et la HP D2D de l'iSCSI R2 du serveur 2008 de Windows GERCENT l'issue
  •  Stocker le dossier dans le mysql using connector.net et le champ de goutte
  •  Carte vidéo d'USB - bit 32 sur le matériel travaillant au niveau du bit 64 ?
  •  asp.net que j'essaye de convertir une forme de HTML en forme d'aspx ou ? ce qui jamais. Aide du besoin sur la façon dont à à elle.
  •  Winzip 12 issues de secours du travail ?
  •  
    programming4us programming4us