Frage : Sql-Code muss - using Cursor zurzeit ändern oder optimieren

Hi

I haben den folgenden Code an einer neuen Rolle übernommen -, die durch einen Entwickler sind viele geschrieben wird, Monde ago.
Issues mit ihm, dass er eine große Zeitmenge zurückzugehen nimmt und viele Betriebsmittel auf der underspecced server.
The Datenbank des Stroms erbärmlich im Modus der Kompatibilität 2k auf einem SQL 2005 server.

I würden schätzen einen Blick am Code und eine Neufassung des Codes, um ihn zu optimieren
oder sogar eine bessere Weise, sie zu tun differently.
Im, das auf anderen Angelegenheiten also beschäftigt ist, haben nicht Zeit, diesen Prozess selbst folglich zu tun, warum im nach einer kompletten Antwort suchend, dass ich gerade run.
Id an, welchen Leuten interessiert auch sein kann denken, falsch ist mit diesem… bieten

Please ein Teillösung.

I kann keine anderen Informationen needed.
i haben angebracht eine Akte mit dem Code an - der den Inhalt der Ansicht zeigt, die im sproc.

Thank Sie

Mo
1 benannt wird:
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:
6:
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:
CREATE Verfahren [dbo]. [xPLT_WTAAbsenceSpanNPD]
(
    @p_BeginDate Datum/Uhrzeit,
    @p_EndDate Datum/Uhrzeit	
)
wie

/*

	Diese Version - 1.0
	
	Ver 1.0 - Verursacht pro U0158 zur Unterstützung der auf ein Jahr bezogenen Stunden
	23/06/2009
		
*

erklären
 @w_RetCode int,
 @w_RetStatus int,
 @w_RetMsg varchar (255),
 @r_PrevWorkDay Datum/Uhrzeit,
 @r_NextWorkDay Datum/Uhrzeit,
 @w_EmployeeID Putzfrau (6),
 @w_EmployeeCode int,
 @w_NPDDay Datum/Uhrzeit

auserwählt 
 @w_RetCode = 0

emp_cur CURSOR für erklären
 vorwählen
  eiv.EmployeeID,
  tsd.EMPLOYEECODE,
  tsd.ADMINISTRATIONDATE
  von 
   dbo.xPLT_EmpInfo_Vw eiv mit (nolock)
    inner dbo.TIMESUMMARYDAY tsd mit verbinden (nolock)
     auf eiv.EmployeeCode = tsd.EmployeeCode
  wo
   tsd.ADMINISTRATIONDATE zwischen @p_BeginDate und @p_EndDate und
   tsd.DAILYPATTERNCODE = 68206 und -- Nichtvorlegung 
   tsd.STANDARDMINSINDAILYPATTERN = 0
   und existiert (auserwählt
                * 
                von 
                 dbo.TIMESUMMARYDAY mit (nolock) 
                wo EmployeeCode = tsd.EmployeeCode und 
                AdministrationDate zwischen dateadd (wk, -3, @p_BeginDate) und dateadd (wk, +3, @p_EndDate) und 
                STANDARDMINSINDAILYPATTERN > 0 und 
                STANDARDMINUTESACHIEVED = 0) -- nur überprüfen, ob vielleicht relevante Tagabwesenheiten innerhalb des „Fensters“
  Auftrag vorbei
   eiv.EmployeeID,
   tsd.ADMINISTRATIONDATE
 für nur gelesen

Tabelle #tmp9001 herstellen
(
 EmployeeID Putzfrau (6),
 NPDDay Datum/Uhrzeit,
 PrevWorkDayAbs Datum/Uhrzeit,
 NextWorkDayAbs Datum/Uhrzeit
)

emp_cur öffnen
zunächst vom emp_cur in @w_EmployeeID, das @w_EmployeeCode holen, @w_NPDDay

wenn @@fetch_status <> 0
 Goto- end_ret -- keine qualifizierenden Daten zum Prozess

während @@fetch_status = 0
 anfangen -- Cursor-Schleife

  -- die vorhergehenden u. folgenden Arbeitstage feststellen
  exec @w_RetStatus = dbo.xPLT_PrevNextWorkDay @w_EmployeeId, @w_NPDDay, 0, @r_PrevWorkDay Ausgang, @r_NextWorkDay Ausgang
  wenn @w_RetStatus <> 0
   anfangen
    @w_RetMsg vorwählen = „xPLT_WTAAbsenceSpanNPD: zu xPLT_PrevNextWorkDay ausfallen mit Return-Code benennen: “ + Bekehrter (Putzfrau (1), @w_RetStatus)
    raiserror („%s“, 18.1, @w_RetMsg)
    @w_RetCode vorwählen = 1
    Goto- end_ret
   Ende

  -- auf Tagabwesenheit an den vorhergehenden u. folgenden Arbeitstagen prüfen
  wenn 
   (
    auserwählt 
     Zählimpuls (*)
    von 
     dbo.TIMESUMMARYDAY tsd mit (nolock)
    wo 
     tsd.EMPLOYEECODE = @w_EmployeeCode und
     (tsd.ADMINISTRATIONDATE = @r_PrevWorkDay oder tsd.ADMINISTRATIONDATE = @r_NextWorkDay) und
     tsd.STANDARDMINSINDAILYPATTERN > 0 und
     tsd.STANDARDMINUTESACHIEVED = 0
   ) = 2
   anfangen
    in #tmp9001 (EmployeeID, NPDDay, PrevWorkDayAbs, NextWorkDayAbs) einsetzen
     Werte (@w_EmployeeID, @w_NPDDay, @r_PrevWorkDay, @r_NextWorkDay)
   Ende 
     
    
  zunächst vom emp_cur in @w_EmployeeID, das @w_EmployeeCode holen, @w_NPDDay
  
 Ende -- Cursor-Schleife


-- Rückholresultset
auserwählt 
 t1.*,
 eiv. Familienname,
 eiv. Vornamen,
 eiv. Mitte,
 eiv. Mannschaft
 von 
  T1 #tmp9001
   inner dbo.xPLT_EmpInfo_Vw eiv sich anschließen
    auf SORTIEREN t1.EmployeeID = eiv.EmployeeID Latin1_General_CI_AS
 Auftrag vorbei 
  t1.EmployeeID,
  t1.NPDDay

end_ret:
nahes emp_cur
emp_cur freigeben
Tabelle #tmp9001 fallenlassen
@w_RetCode zurückbringen


GEHEN

Antwort : Sql-Code muss - using Cursor zurzeit ändern oder optimieren

mooriginal

Nachdem man eine Ihre Situation geschaut hat, ist es frei, dass, da Sie keine Weise der Archivierung älter haben (historisch)
Daten, Ihre Leistung leiden, wie Zeit weitergeht und mehr Aufzeichnungen addiert werden.

Ich ließ diesen Code mit 5 Million TIMESUMMARYDAY Aufzeichnungen und 15 tausend ANGESTELLT-Aufzeichnungen laufen
(Nach dem Zufall erzeugt) auf einem alten SQL-System 2005 und einem zurückgebrachten 11k ergibt weniger sek als 50.

Haben, jede mögliche Optimierung schon zu tun, oder attemped, um den Cursor loszuwerden.  Die Idee ist, 2 zu verursachen
Temptabelle und benutzen sie, um den Resultatssatz zu verursachen.  Ist zunächst, diese Tabellen auf der Datenbank herzustellen
(keine Indizes noch haben) und die Daten beschneiden, füllen und registrieren und die Frage dann laufen lassen.
Dieses sollte die Leistung verbessern.    
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:
6:
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:
--NEUE CURSOR-RESULTATE

erklären
 @w_RetCode	        int,
 @w_RetStatus		int,

 @w_RetMsg          varchar (255),
 @r_PrevWorkDay     Datum/Uhrzeit,
 @r_NextWorkDay     Datum/Uhrzeit,
 @w_EmployeeID		Putzfrau (6),
 @w_EmployeeCode	int,
 @w_NPDDay			Datum/Uhrzeit,

 @p_BeginDate        Datum/Uhrzeit,
 @p_EndDate          Datum/Uhrzeit



@w_RetCode vorwählen = 0
@p_BeginDate vorwählen = „08/01/10“
@p_EndDate vorwählen = „08/10/10“



ERKLÄREN
	 @TMP_BeginDate        Datum/Uhrzeit,
	 @TMP_EndDate          Datum/Uhrzeit

@TMP_BeginDate = DATEADD (wk, -3, @p_BeginDate) EINSTELLEN
@TMP_EndDate = DATEADD (wk, +3, @p_EndDate) EINSTELLEN

@TSD TABELLE (CNT [int] ERKLÄREN NICHT UNGÜLTIG,
	[EMPLOYEECODE] [int] NICHT NULL,
	[ADMINISTRATIONDATE] [Datum/Uhrzeit] NULL,
	[DAILYPATTERNCODE] [int] NULL,
	[STANDARDMINSINDAILYPATTERN] [smallint] NULL,
	[STANDARDMINUTESACHIEVED] [smallint] NICHT NULL)

IN @TSD EINSETZEN
	CNT	VORWÄHLEN
			, EMPLOYEECODE
			, ADMINISTRATIONDATE
			, DAILYPATTERNCODE
			, STANDARDMINSINDAILYPATTERN
			, STANDARDMINUTESACHIEVED
	VON dbo.TIMESUMMARYDAY
	WO DAILYPATTERNCODE = 68206 UND
    ADMINISTRATIONDATE 	ZWISCHEN @TMP_BEGINDATE UND @TMP_ENDDATE

LÖSCHUNG  VOM @TSD 
WO (STANDARDMINSINDAILYPATTERN = 0 UND STANDARDMINUTESACHIEVED <> 0)


@EMP TABELLE ERKLÄREN (
	[EmployeeId] [varchar] (15) NICHT NULL,
	[EmployeeCode] [int] NULL,
	[Familienname] [varchar] (40) NULL,
	[Vornamen] [varchar] (40) NULL,
	[Mannschaft] [varchar] (16) NULL,
	[Mitte] [varchar] (5) NULL)


EINSATZ IN @EMP
	EmployeeId	VORWÄHLEN
			, EmployeeCode
			, Familienname
			, Vornamen
			, Mitte
			, Mannschaft
	VON dbo.xPLT_EmpInfo 
	WO Active > 0

Emp_cur CURSOR für ERKLÄREN
	
 VORWÄHLEN
  eiv.EmployeeID,
  tsd.EMPLOYEECODE,
  tsd.ADMINISTRATIONDATE
  Vom @EMP eiv 
  inner @TSD tsd sich anschließen
  auf eiv.EmployeeCode = tsd.EmployeeCode
  WO
   tsd.ADMINISTRATIONDATE zwischen @p_BeginDate und @p_EndDate und
   tsd.STANDARDMINSINDAILYPATTERN = 0



TABELLE #TMP9001 HERSTELLEN
(
 EmployeeID			Putzfrau (6),
 NPDDay				Datum/Uhrzeit,
 PrevWorkDayAbs		Datum/Uhrzeit,
 NextWorkDayAbs		Datum/Uhrzeit
)

emp_cur öffnen
zunächst vom emp_cur in @w_EmployeeID, das @w_EmployeeCode holen, @w_NPDDay

wenn @@fetch_status <> 0
 Goto- end_ret -- keine qualifizierenden Daten zum Prozess

während @@fetch_status = 0
 anfangen -- Cursor-Schleife

  -- die vorhergehenden u. folgenden Arbeitstage feststellen

  exec @w_RetStatus = dbo.xPLT_PrevNextWorkDay @w_EmployeeId, @w_NPDDay, 0, @r_PrevWorkDay Ausgang, @r_NextWorkDay Ausgang
  wenn @w_RetStatus <> 0
   anfangen
    @w_RetMsg vorwählen = „xPLT_WTAAbsenceSpanNPD: zu xPLT_PrevNextWorkDay ausfallen mit Return-Code benennen: “ + Bekehrter (Putzfrau (1), @w_RetStatus)
    raiserror („%s“, 18.1, @w_RetMsg)
    @w_RetCode vorwählen = 1
    Goto- end_ret
   Ende

  -- auf Tagabwesenheit an den vorhergehenden u. folgenden Arbeitstagen prüfen
  wenn 
   (
    auserwählt 
     Zählimpuls (*)
    von 
     @TSD tsd
    wo 
     tsd.EMPLOYEECODE = @w_EmployeeCode und
     (tsd.ADMINISTRATIONDATE = @r_PrevWorkDay oder tsd.ADMINISTRATIONDATE = @r_NextWorkDay) und
     tsd.STANDARDMINSINDAILYPATTERN > 0 und
     tsd.STANDARDMINUTESACHIEVED = 0
   ) = 2
   anfangen
    in #tmp9001 (EmployeeID, NPDDay, PrevWorkDayAbs, NextWorkDayAbs) einsetzen
     Werte (@w_EmployeeID, @w_NPDDay, @r_PrevWorkDay, @r_NextWorkDay)
   Ende 

  zunächst vom emp_cur in @w_EmployeeID, das @w_EmployeeCode holen, @w_NPDDay

 Ende -- Cursor-Schleife


-- Rückholresultset

auserwählt 
 t1.*,
 eiv. Familienname,
 eiv. Vornamen,
 eiv. Mitte,
 eiv. Mannschaft
 von 
  T1 #tmp9001
   inner dbo.xPLT_EmpInfo_Vw eiv sich anschließen
    auf SORTIEREN t1.EmployeeID = eiv.EmployeeID Latin1_General_CI_AS
 Auftrag vorbei 
  t1.EmployeeID,
  t1.NPDDay


--* von T1  #tmp9001 vorwählen

end_ret:


nahes emp_cur
emp_cur freigeben
Tabelle #tmp9001 fallenlassen

--@w_RetCode zurückbringen
@w_RetCode vorwählen

GEHEN
Weitere Lösungen  
 
programming4us programming4us