Questione : Il codice di SQL deve cambiare o ottimizzare - using il cursore attualmente

Hi

I ha ereditato il seguente codice ad un nuovo ruolo - scritto da uno sviluppatore molte lune ago.
Issues con esso sono che richiede un gran numero di tempo di rinviare e molte risorse sulla base di dati doloroso underspecced della corrente server.
The è nel modo di compatibilità 2k su uno SQL 2005 server.

I apprezzerebbero uno sguardo al codice e una riscrittura del codice per ottimizzarle
o persino un migliore senso farlo differently.
Im occupato su altri argomenti in modo da non hanno tempo di fare questo processo io stesso quindi perché im che cerca una risposta completa che posso appena run.
Id anche essere interessato in che gente pensa è errato con questo… il

Please non offre un

I può offrire qualunque altra informazione needed.
i ha attaccato una lima con il codice - che mostra il contenuto della vista che è denominata nello sproc.

Thank voi class= " i lineNumbers " >
1 del >

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: procedura codeBody del >CREATE " del prettyprint " " del class= del id= " codeSnippet910884 del >
 0 e 
                STANDARDMINUTESACHIEVED = 0) -- controllare soltanto se possibilmente assenze relative di giorno intero all'interno “della finestra„
  ordine vicino
   eiv.EmployeeID,
   tsd.ADMINISTRATIONDATE
 per colto soltanto

generare la tabella #tmp9001
(
 Carbone di EmployeeID (6),
 Datetime di NPDDay,
 Datetime di PrevWorkDayAbs,
 Datetime di NextWorkDayAbs
)

aprire il emp_cur
andare a prendere dopo da emp_cur in @w_EmployeeID, @w_EmployeeCode, @w_NPDDay

se <> 0 di @@fetch_status
 end_ret di avanzamento -- nessun dati di qualificazione al processo

mentre @@fetch_status = 0
 cominciare -- ciclo del cursore

  -- determinare i giorni precedenti & prossimi del lavoro
  @w_RetStatus del exec = @w_EmployeeId di dbo.xPLT_PrevNextWorkDay, @w_NPDDay, 0, uscita @r_PrevWorkDay, uscita @r_NextWorkDay
  se <> 0 di @w_RetStatus
   cominciare
    selezionare il @w_RetMsg = “xPLT_WTAAbsenceSpanNPD: denominare a venire a mancare xPLT_PrevNextWorkDay con il codice di ritorno: „ + convertito (carbone (1), @w_RetStatus)
    raiserror ("%s„, 18.1, @w_RetMsg)
    selezionare il @w_RetCode = 1
    end_ret di avanzamento
   estremità

  -- provare ad assenza di giorni interi i giorni precedenti & prossimi del lavoro
  se 
   (
    prescelto 
     conteggio (*)
    da 
     dbo.TIMESUMMARYDAY DST con (nolock)
    dove 
     tsd.EMPLOYEECODE = @w_EmployeeCode e
     (tsd.ADMINISTRATIONDATE = @r_PrevWorkDay o tsd.ADMINISTRATIONDATE = @r_NextWorkDay) e
     tsd.STANDARDMINSINDAILYPATTERN > 0 e
     tsd.STANDARDMINUTESACHIEVED = 0
   ) = 2
   cominciare
    inserire in #tmp9001 (EmployeeID, NPDDay, PrevWorkDayAbs, NextWorkDayAbs)
     valori (@w_EmployeeID, @w_NPDDay, @r_PrevWorkDay, @r_NextWorkDay)
   estremità 
     
    
  andare a prendere dopo da emp_cur in @w_EmployeeID, @w_EmployeeCode, @w_NPDDay
  
 estremità -- ciclo del cursore


-- resultset di ritorno
prescelto 
 t1.*,
 eiv. Cognome,
 eiv. Nomi,
 eiv. Centro,
 eiv. Squadra
 da 
  T1 #tmp9001
   interno unire il eiv di dbo.xPLT_EmpInfo_Vw
    su t1.EmployeeID = eiv.EmployeeID FASCICOLANO Latin1_General_CI_AS
 ordine vicino 
  t1.EmployeeID,
  t1.NPDDay

end_ret:
emp_cur vicino
cancell l'assegnazioneare del emp_cur
cadere la tabella #tmp9001
restituire il @w_RetCode


ANDARE
nome di schedario " " vuoto " >

view-called-from-sproc.txt " fileSize " > (207 byte) il Javascript " del href= " " dei attachmentDetails del class= di (tipo di lima particolari) il >view " di descrizione " del class= di
del >
class= del

Risposta : Il codice di SQL deve cambiare o ottimizzare - using il cursore attualmente

mooriginal

Dopo lo sguardo della vostra situazione, è chiaro che poiché non avete senso di archiviatura più vecchio (storico)
i dati, la vostra prestazione soffriranno come il tempo accende e più annotazioni si aggiungono.

Ho fatto funzionare questo codice con 5 milione annotazioni di TIMESUMMARYDAY e 15 mila annotazioni degli IMPIEGATI
(Generato a caso) su un vecchio sistema 2005 di SQL e su un 11k restituito provoca meno sec di 50.

Avere ancora fare tutta l'ottimizzazione, o attemped per liberarsi del cursore.  L'idea è di generare 2
la tabella del temp e li usa per generare l'insieme di risultato.  Dopo sarà generare queste tabelle sulla base di dati
(ancora non avere alcuni indici) e troncare, compilare e spostare ad incrementi i dati ed allora fare funzionare la domanda.
Ciò dovrebbe migliorare la prestazione.    
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:
--NUOVI RISULTATI DEL CURSORE

dichiarare
 @w_RetCode	        int,
 @w_RetStatus		int,

 @w_RetMsg          varchar (255),
 datetime     @r_PrevWorkDay,
 datetime     @r_NextWorkDay,
 carbone		del @w_EmployeeID (6),
 @w_EmployeeCode	int,
 datetime			@w_NPDDay,

 datetime        del @p_BeginDate,
 datetime          del @p_EndDate



selezionare il @w_RetCode = 0
selezionare il @p_BeginDate = “08/01/10„
selezionare il @p_EndDate = “08/10/10„



DICHIARARE
	 datetime        del @TMP_BeginDate,
	 datetime          del @TMP_EndDate

REGOLARE il @TMP_BeginDate = DATEADD (settimana, -3, @p_BeginDate)
REGOLARE il @TMP_EndDate = DATEADD (settimana, +3, @p_EndDate)

DICHIARARE LA TABELLA del @TSD (CNT [int] NON NULLO,
	[EMPLOYEECODE] [int] NON ANNULLARE,
	[ADMINISTRATIONDATE] [datetime] POSIZIONE DI SEGNALE MINIMO,
	[DAILYPATTERNCODE] [int] POSIZIONE DI SEGNALE MINIMO,
	[STANDARDMINSINDAILYPATTERN] [smallint] POSIZIONE DI SEGNALE MINIMO,
	[STANDARDMINUTESACHIEVED] [smallint] NON POSIZIONE DI SEGNALE MINIMO)

INSERIRE IN @TSD
	SELEZIONARE	CNT
			, EMPLOYEECODE
			, ADMINISTRATIONDATE
			, DAILYPATTERNCODE
			, STANDARDMINSINDAILYPATTERN
			, STANDARDMINUTESACHIEVED
	Da dbo.TIMESUMMARYDAY
	DOVE DAILYPATTERNCODE = 68206 E
    ADMINISTRATIONDATE 	FRA @TMP_BEGINDATE E @TMP_ENDDATE

CANCELLAZIONE  DA @TSD 
DOVE (STANDARDMINSINDAILYPATTERN = 0 E STANDARDMINUTESACHIEVED <> 0)


DICHIARARE LA TABELLA DEL @EMP (
	[EmployeeId] [varchar] (15) NON ANNULLARE,
	[EmployeeCode] [int] POSIZIONE DI SEGNALE MINIMO,
	[Cognome] [varchar] (40) ANNULLANO,
	[Nomi] [varchar] (40) ANNULLANO,
	[Squadra] [varchar] (16) ANNULLANO,
	[Centro] [varchar] (5) POSIZIONE DI SEGNALE MINIMO)


INSERTO IN @EMP
	SELEZIONARE	EmployeeId
			, EmployeeCode
			, Cognome
			, Nomi
			, Centro
			, Squadra
	Da dbo.xPLT_EmpInfo 
	DOVE active > 0

DICHIARARE IL CURSORE del emp_cur per
	
 SELEZIONARE
  eiv.EmployeeID,
  tsd.EMPLOYEECODE,
  tsd.ADMINISTRATIONDATE
  Dal eiv del @EMP 
  interno unire il @TSD DST
  su eiv.EmployeeCode = tsd.EmployeeCode
  DOVE
   tsd.ADMINISTRATIONDATE fra @p_BeginDate e @p_EndDate e
   tsd.STANDARDMINSINDAILYPATTERN = 0



GENERARE LA TABELLA #TMP9001
(
 Carbone			di EmployeeID (6),
 Datetime				di NPDDay,
 Datetime		di PrevWorkDayAbs,
 Datetime		di NextWorkDayAbs
)

aprire il emp_cur
andare a prendere dopo da emp_cur in @w_EmployeeID, @w_EmployeeCode, @w_NPDDay

se @@fetch_status <> 0
 end_ret di avanzamento -- nessun dati di qualificazione al processo

mentre @@fetch_status = 0
 cominciare -- ciclo del cursore

  -- determinare i giorni precedenti & prossimi del lavoro

  @w_RetStatus del exec = @w_EmployeeId di dbo.xPLT_PrevNextWorkDay, @w_NPDDay, 0, uscita @r_PrevWorkDay, uscita @r_NextWorkDay
  se @w_RetStatus <> 0
   cominciare
    selezionare il @w_RetMsg = “xPLT_WTAAbsenceSpanNPD: denominare a venire a mancare xPLT_PrevNextWorkDay con il codice di ritorno: „ + convertito (carbone (1), @w_RetStatus)
    raiserror ("%s„, 18.1, @w_RetMsg)
    selezionare il @w_RetCode = 1
    end_ret di avanzamento
   estremità

  -- provare ad assenza di giorni interi i giorni precedenti & prossimi del lavoro
  se 
   (
    prescelto 
     conteggio (*)
    da 
     @TSD DST
    dove 
     tsd.EMPLOYEECODE = @w_EmployeeCode e
     (tsd.ADMINISTRATIONDATE = @r_PrevWorkDay o tsd.ADMINISTRATIONDATE = @r_NextWorkDay) e
     tsd.STANDARDMINSINDAILYPATTERN > 0 e
     tsd.STANDARDMINUTESACHIEVED = 0
   ) = 2
   cominciare
    inserire in #tmp9001 (EmployeeID, NPDDay, PrevWorkDayAbs, NextWorkDayAbs)
     valori (@w_EmployeeID, @w_NPDDay, @r_PrevWorkDay, @r_NextWorkDay)
   estremità 

  andare a prendere dopo da emp_cur in @w_EmployeeID, @w_EmployeeCode, @w_NPDDay

 estremità -- ciclo del cursore


-- resultset di ritorno

prescelto 
 t1.*,
 eiv. Cognome,
 eiv. Nomi,
 eiv. Centro,
 eiv. Squadra
 da 
  T1 #tmp9001
   interno unire il eiv di dbo.xPLT_EmpInfo_Vw
    su t1.EmployeeID = eiv.EmployeeID FASCICOLANO Latin1_General_CI_AS
 ordine vicino 
  t1.EmployeeID,
  t1.NPDDay


--selezionare * a partire  dal T1 #tmp9001

end_ret:


emp_cur vicino
cancell l'assegnazioneare del emp_cur
cadere la tabella #tmp9001

--restituire il @w_RetCode
selezionare il @w_RetCode

ANDARE
Altre soluzioni  
 
programming4us programming4us