Cuestión : El código del SQL necesita cambiar u optimizar - usar el cursor actualmente

Hi

I ha heredado el código siguiente en un nuevo papel - escrito por un revelador muchas lunas ago.
Issues con él son que lleva una gran cantidad de tiempo para volver y muchos recursos en la base de datos lamentablemente underspecced de la corriente server.
The están en modo de compatibilidad 2k en un SQL 2005 server.

I apreciarían una mirada en el código y una reescritura del código para optimizarlo el
o aún una mejor manera de hacerla differently.
Im ocupado en otras materias así que no tienen tiempo para hacer este proceso mismo por lo tanto porqué im que busca una respuesta completa que puedo apenas run.
Id también estar interesado en qué gente piensa es incorrecto con esto… el

Please no ofrece un

I puede ofrecer ninguna otra información needed.
i ha atado un archivo con el código - que demuestra el contenido de la opinión que se llama en el sproc.

Thank usted class= " 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: procedimiento codeBody del >CREATE del " prettyprint " del class= del id= " codeSnippet910884 " del >
 0 y 
                STANDARDMINUTESACHIEVED = 0) -- comprobar solamente si es posible las ausencias relevantes del día entero dentro de la “ventana”
  orden cerca
   eiv.EmployeeID,
   tsd.ADMINISTRATIONDATE
 para leído solamente

crear la tabla #tmp9001
(
 Carbón de leña de EmployeeID (6),
 Fecha y hora de NPDDay,
 Fecha y hora de PrevWorkDayAbs,
 Fecha y hora de NextWorkDayAbs
)

abrir el emp_cur
traer después de emp_cur en el @w_EmployeeID, @w_EmployeeCode, @w_NPDDay

si <> 0 del @@fetch_status
 end_ret indicado -- ningunos datos de calificación al proceso

mientras que @@fetch_status = 0
 comenzar -- lazo del cursor

  -- determinar los días anteriores y próximos del trabajo
  @w_RetStatus del exec = @w_EmployeeId de dbo.xPLT_PrevNextWorkDay, @w_NPDDay, 0, salida @r_PrevWorkDay, salida @r_NextWorkDay
  si <> 0 del @w_RetStatus
   comenzar
    seleccionar el @w_RetMsg = “xPLT_WTAAbsenceSpanNPD: llamar a fall xPLT_PrevNextWorkDay con el código de retorno: ” + convertido (carbón de leña (1), @w_RetStatus)
    raiserror (“%s”, 18.1, @w_RetMsg)
    seleccionar el @w_RetCode = 1
    end_ret indicado
   extremo

  -- probar para la ausencia de los días enteros en los días anteriores y próximos del trabajo
  si 
   (
    selecto 
     cuenta (*)
    de 
     dbo.TIMESUMMARYDAY tsd con (nolock)
    donde 
     tsd.EMPLOYEECODE = @w_EmployeeCode y
     (tsd.ADMINISTRATIONDATE = @r_PrevWorkDay o tsd.ADMINISTRATIONDATE = @r_NextWorkDay) y
     tsd.STANDARDMINSINDAILYPATTERN > 0 y
     tsd.STANDARDMINUTESACHIEVED = 0
   ) = 2
   comenzar
    insertar en #tmp9001 (EmployeeID, NPDDay, PrevWorkDayAbs, NextWorkDayAbs)
     valores (@w_EmployeeID, @w_NPDDay, @r_PrevWorkDay, @r_NextWorkDay)
   extremo 
     
    
  traer después de emp_cur en el @w_EmployeeID, @w_EmployeeCode, @w_NPDDay
  
 extremo -- lazo del cursor


-- resultset de vuelta
selecto 
 t1.*,
 eiv. Apellido,
 eiv. Nombres,
 eiv. Centro,
 eiv. Equipo
 de 
  T1 #tmp9001
   interno ensamblar el eiv de dbo.xPLT_EmpInfo_Vw
    en t1.EmployeeID = eiv.EmployeeID COMPAGINAN Latin1_General_CI_AS
 orden cerca 
  t1.EmployeeID,
  t1.NPDDay

end_ret:
emp_cur cercano
desasignar el emp_cur
caer la tabla #tmp9001
volver el @w_RetCode


IR
nombre de fichero " vacío " >

(207 octetos) Javascript del href= " de los " attachmentDetails del class= " de (tipo de archivo detalles) >view de la descripción el " del class= de
del >
class= del

Respuesta : El código del SQL necesita cambiar u optimizar - usar el cursor actualmente

mooriginal

Después de mirar una su situación, está claro que puesto que usted no tiene ninguna manera de archivar más vieja (histórico)
los datos, su funcionamiento sufrirán como se enciende el tiempo y se agregan más expedientes.

Funcioné con este código con 5 millones de expedientes de TIMESUMMARYDAY y 15 mil expedientes del EMPLEADO
(Generado aleatoriamente) en un viejo sistema 2005 del SQL y un 11k vuelto da lugar menos al sec de 50.

Tener todavía hacer cualquier optimización, o attemped para librarse del cursor.  La idea es crear 2
la tabla del temp y los utiliza para crear el sistema del resultado.  Está después crear estas tablas en la base de datos
(todavía no tener ninguna índices) y truncar, llenar, y poner en un índice los datos y después funcionar con la pregunta.
Esto debe mejorar el funcionamiento.    
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:
--NUEVOS RESULTADOS DEL CURSOR

declarar
 @w_RetCode	        internacional,
 @w_RetStatus		internacional,

 @w_RetMsg          varchar (255),
 fecha y hora     @r_PrevWorkDay,
 fecha y hora     @r_NextWorkDay,
 carbón de leña		del @w_EmployeeID (6),
 @w_EmployeeCode	internacional,
 fecha y hora			@w_NPDDay,

 fecha y hora        del @p_BeginDate,
 fecha y hora          del @p_EndDate



seleccionar el @w_RetCode = 0
seleccionar el @p_BeginDate = “08/01/10”
seleccionar el @p_EndDate = “08/10/10”



DECLARAR
	 fecha y hora        del @TMP_BeginDate,
	 fecha y hora          del @TMP_EndDate

FIJAR el @TMP_BeginDate = DATEADD (semana, -3, el @p_BeginDate)
FIJAR el @TMP_EndDate = DATEADD (semana, +3, el @p_EndDate)

DECLARAR LA TABLA del @TSD (CNT [la internacional] NO NULO,
	[EMPLOYEECODE] [internacional] NO ANULAR,
	[ADMINISTRATIONDATE] [fecha y hora] FALTA DE INFORMACIÓN,
	[DAILYPATTERNCODE] [internacional] FALTA DE INFORMACIÓN,
	[STANDARDMINSINDAILYPATTERN] [smallint] FALTA DE INFORMACIÓN,
	[STANDARDMINUTESACHIEVED] [smallint] NO FALTA DE INFORMACIÓN)

INSERTAR EN @TSD
	SELECCIONAR	CNT
			, EMPLOYEECODE
			, ADMINISTRATIONDATE
			, DAILYPATTERNCODE
			, STANDARDMINSINDAILYPATTERN
			, STANDARDMINUTESACHIEVED
	De dbo.TIMESUMMARYDAY
	DONDE DAILYPATTERNCODE = 68206 Y
    ADMINISTRATIONDATE 	ENTRE EL @TMP_BEGINDATE Y EL @TMP_ENDDATE

CANCELACIÓN  DEL @TSD 
DONDE (STANDARDMINSINDAILYPATTERN = 0 Y STANDARDMINUTESACHIEVED <> 0)


DECLARAR LA TABLA DEL @EMP (
	[EmployeeId] [varchar] (15) NO ANULAR,
	[EmployeeCode] [internacional] FALTA DE INFORMACIÓN,
	[Apellido] [varchar] (40) ANULAN,
	[Nombres] [varchar] (40) ANULAN,
	[Equipo] [varchar] (16) ANULAN,
	[Centro] [varchar] (5) FALTA DE INFORMACIÓN)


PARTE MOVIBLE EN @EMP
	SELECCIONAR	EmployeeId
			, EmployeeCode
			, Apellido
			, Nombres
			, Centro
			, Equipo
	De dbo.xPLT_EmpInfo 
	DONDE active > 0

DECLARAR EL CURSOR del emp_cur para
	
 SELECCIONAR
  eiv.EmployeeID,
  tsd.EMPLOYEECODE,
  tsd.ADMINISTRATIONDATE
  De eiv del @EMP 
  interno ensamblar el @TSD tsd
  en eiv.EmployeeCode = tsd.EmployeeCode
  DONDE
   tsd.ADMINISTRATIONDATE entre el @p_BeginDate y el @p_EndDate y
   tsd.STANDARDMINSINDAILYPATTERN = 0



CREAR LA TABLA #TMP9001
(
 Carbón de leña			de EmployeeID (6),
 Fecha y hora				de NPDDay,
 Fecha y hora		de PrevWorkDayAbs,
 Fecha y hora		de NextWorkDayAbs
)

abrir el emp_cur
traer después de emp_cur en el @w_EmployeeID, @w_EmployeeCode, @w_NPDDay

si @@fetch_status <> 0
 end_ret indicado -- ningunos datos de calificación al proceso

mientras que @@fetch_status = 0
 comenzar -- lazo del cursor

  -- determinar los días anteriores y próximos del trabajo

  @w_RetStatus del exec = @w_EmployeeId de dbo.xPLT_PrevNextWorkDay, @w_NPDDay, 0, salida @r_PrevWorkDay, salida @r_NextWorkDay
  si @w_RetStatus <> 0
   comenzar
    seleccionar el @w_RetMsg = “xPLT_WTAAbsenceSpanNPD: llamar a fall xPLT_PrevNextWorkDay con el código de retorno: ” + convertido (carbón de leña (1), @w_RetStatus)
    raiserror (“%s”, 18.1, @w_RetMsg)
    seleccionar el @w_RetCode = 1
    end_ret indicado
   extremo

  -- probar para la ausencia de los días enteros en los días anteriores y próximos del trabajo
  si 
   (
    selecto 
     cuenta (*)
    de 
     @TSD tsd
    donde 
     tsd.EMPLOYEECODE = @w_EmployeeCode y
     (tsd.ADMINISTRATIONDATE = @r_PrevWorkDay o tsd.ADMINISTRATIONDATE = @r_NextWorkDay) y
     tsd.STANDARDMINSINDAILYPATTERN > 0 y
     tsd.STANDARDMINUTESACHIEVED = 0
   ) = 2
   comenzar
    insertar en #tmp9001 (EmployeeID, NPDDay, PrevWorkDayAbs, NextWorkDayAbs)
     valores (@w_EmployeeID, @w_NPDDay, @r_PrevWorkDay, @r_NextWorkDay)
   extremo 

  traer después de emp_cur en el @w_EmployeeID, @w_EmployeeCode, @w_NPDDay

 extremo -- lazo del cursor


-- resultset de vuelta

selecto 
 t1.*,
 eiv. Apellido,
 eiv. Nombres,
 eiv. Centro,
 eiv. Equipo
 de 
  T1 #tmp9001
   interno ensamblar el eiv de dbo.xPLT_EmpInfo_Vw
    en t1.EmployeeID = eiv.EmployeeID COMPAGINAN Latin1_General_CI_AS
 orden cerca 
  t1.EmployeeID,
  t1.NPDDay


--seleccionar *  de T1 #tmp9001

end_ret:


emp_cur cercano
desasignar el emp_cur
caer la tabla #tmp9001

--volver el @w_RetCode
seleccionar el @w_RetCode

IR
Otras soluciones  
 
programming4us programming4us