Vraag : SQL of behoeften die van de Code - Curseur momenteel met behulp van veranderen de optimaliseren die

Hi

I heeft de volgende code bij een nieuwe die rol geërftd - door een ontwikkelaar wordt geschreven zijn vele manen ago.
Issues met het dat het een hoop van tijd vergt terug te keren en heel wat middelen op de stroom server.
The- gegevensbestand is op 2k verenigbaarheidswijze op SQL 2005 server.

I zouden waarderen een blik bij de code underspecced en van de code herschrijf om het te optimaliseren
of zelfs een betere manier om het te doen differently.
Im bezig inzake andere kwesties zo geen tijd heeft om dit proces zelf te doen vandaar waarom im die een volledig antwoord zoeken dat ik enkel run.
Id ook in welke mensen kan geinteresseerd zijn denken verkeerd is met dit… bieden/>Please


I aan kunnen een andere informatie needed.
i aanbieden hebben vastgemaakt een dossier met de code - die de inhoud van de mening toont die in sproc.

Thank u

Mo
1 wordt geroepen:
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:
CREATE procedure [dbo]. [xPLT_WTAAbsenceSpanNPD]
(
    @p_BeginDate datetime,
    @p_EndDate datetime	
)
zoals

/*

	Deze Versie - 1.0
	
	Ver 1.0 - per U0158 tot steun van Op jaarbasis berekende Uren wordt gecre�ërd dat
	23/06/2009
		
*/

verklaar
 @w_RetCode int.,
 @w_RetStatus int.,
 @w_RetMsg varchar (255),
 @r_PrevWorkDay datetime,
 @r_NextWorkDay datetime,
 @w_EmployeeID klusje (6),
 @w_EmployeeCode int.,
 @w_NPDDay datetime

selecteer 
 @w_RetCode = 0

verklaar emp_cur CURSEUR voor
 selecteer
  eiv.EmployeeID,
  tsd.EMPLOYEECODE,
  tsd.ADMINISTRATIONDATE
  van 
   dbo.xPLT_EmpInfo_Vw eiv met (nolock)
    binnen sluit me aan bij dbo.TIMESUMMARYDAY tsd met (nolock)
     op eiv.EmployeeCode = tsd.EmployeeCode
  waar
   tsd.ADMINISTRATIONDATE tussen @p_BeginDate en @p_EndDate en
   tsd.DAILYPATTERNCODE = 68206 en -- niet-productie 
   tsd.STANDARDMINSINDAILYPATTERN = 0
   en bestaat (uitgezocht
                * 
                van 
                 dbo.TIMESUMMARYDAY met (nolock) 
                waar EmployeeCode = tsd.EmployeeCode en 
                AdministrationDate tussen dateadd (week, -3, @p_BeginDate) en dateadd (week, +3, @p_EndDate) en 
                STANDARDMINSINDAILYPATTERN > 0 en 
                STANDARDMINUTESACHIEVED = 0) -- controleer slechts als misschien relevante volledige dagafwezigheid binnen het „venster“
  orde langs
   eiv.EmployeeID,
   tsd.ADMINISTRATIONDATE
 voor slechts gelezen

cre�ër lijst #tmp9001
(
 Het klusje van EmployeeID (6),
 Datetime van NPDDay,
 Datetime van PrevWorkDayAbs,
 Datetime van NextWorkDayAbs
)

open emp_cur
haal daarna van emp_cur in @w_NPDDay @w_EmployeeID, @w_EmployeeCode,

als @@fetch_status <> 0
 goto end_ret -- geen kwalificerende gegevens aan proces

terwijl @@fetch_status = 0
 begin -- curseur lijn

  -- bepaal vorige & volgende het werkdagen
  exec @w_RetStatus = dbo.xPLT_PrevNextWorkDay @w_EmployeeId, @w_NPDDay, 0, @r_PrevWorkDay output, @r_NextWorkDay output
  als @w_RetStatus <> 0
   begin
    selecteer @w_RetMsg = „xPLT_WTAAbsenceSpanNPD: vraag aan xPLT_PrevNextWorkDay ontbroken met terugkeercode: “ + bekeerling (klusje (1), @w_RetStatus)
    raiserror („%s“, 18.1, @w_RetMsg)
    selecteer @w_RetCode = 1
    goto end_ret
   eind

  -- test voor volledige dagenafwezigheid op vorige & volgende het werkdagen
  als 
   (
    selecteer 
     telling (*)
    van 
     dbo.TIMESUMMARYDAY tsd met (nolock)
    waar 
     tsd.EMPLOYEECODE = @w_EmployeeCode en
     (tsd.ADMINISTRATIONDATE = @r_PrevWorkDay of tsd.ADMINISTRATIONDATE = @r_NextWorkDay) en
     tsd.STANDARDMINSINDAILYPATTERN > 0 en
     tsd.STANDARDMINUTESACHIEVED = 0
   ) = 2
   begin
    tussenvoegsel in #tmp9001 (EmployeeID, NPDDay, PrevWorkDayAbs, NextWorkDayAbs)
     waarden (@w_EmployeeID, @w_NPDDay, @r_PrevWorkDay, @r_NextWorkDay)
   eind 
     
    
  haal daarna van emp_cur in @w_NPDDay @w_EmployeeID, @w_EmployeeCode,
  
 eind -- curseur lijn


-- terugkeer resultset
selecteer 
 t1.*,
 eiv. Achternaam,
 eiv. Voornamen,
 eiv. Centrum,
 eiv. Team
 van 
  #tmp9001 t1
   binnen sluit me aan bij dbo.xPLT_EmpInfo_Vw eiv
    op t1.EmployeeID = BRENGEN eiv.EmployeeID Latin1_General_CI_AS bij elkaar
 orde langs 
  t1.EmployeeID,
  t1.NPDDay

end_ret:
dichte emp_cur
deallocate emp_cur
laat vallen lijst #tmp9001
keer @w_RetCode terug


GA
van 

Antwoord : SQL of behoeften die van de Code - Curseur momenteel met behulp van veranderen de optimaliseren die

mooriginal

Na het kijken een uw situatie, is het duidelijk dat aangezien u geen oudere manier te archiveren hebt om (historisch)
de gegevens, zullen uw prestaties lijden aangezien de tijd voorbijgaat en meer verslagen worden toegevoegd.

Ik stelde deze code met 5 Miljoen Timesummaryday- verslagen en 15 Duizend verslagen van de WERKNEMER in werking
(Willekeurig Geproduceerd) op een oud SQL 2005 systeem en teruggekeerde 11k resultaten in minder dan 50 seconden.

Heb om om het even welke optimalisering nog te doen, of attemped om de curseur van de hand te doen.  Het idee is 2 te creëren
de temperaturen lijst en gebruikt hen om tot de resultaatreeks te leiden.  Daarna is deze lijsten aangaande het gegevensbestand te creëren
(hebben nog niet om het even welke indexen) en beknot, vul, en indexeer de gegevens en stel dan de vraag in werking.
Dit zou de prestaties moeten verbeteren.    
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:
--DE NIEUWE RESULTATEN VAN DE CURSEUR

verklaar
 @w_RetCode	        int.,
 @w_RetStatus		int.,

 @w_RetMsg          varchar (255),
 @r_PrevWorkDay     datetime,
 @r_NextWorkDay     datetime,
 @w_EmployeeID		klusje (6),
 @w_EmployeeCode	int.,
 @w_NPDDay			datetime,

 @p_BeginDate        datetime,
 @p_EndDate          datetime



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



VERKLAAR
	 @TMP_BeginDate        datetime,
	 @TMP_EndDate          datetime

REEKS @TMP_BeginDate = DATEADD (week, -3, @p_BeginDate)
REEKS @TMP_EndDate = DATEADD (week, +3, @p_EndDate)

VERKLAAR @TSD- LIJST (CNT [INT.] NIETIG VERKLAREN NIET,
	[EMPLOYEECODE] [INT.] OM NIETIG TE VERKLAREN NIET,
	[ADMINISTRATIONDATE] [datetime] VERKLAAR nietig,
	[DAILYPATTERNCODE] [int.] VERKLAAR nietig,
	[STANDARDMINSINDAILYPATTERN] [smallint] VERKLAAR nietig,
	[STANDARDMINUTESACHIEVED] [SMALLINT] OM NIETIG TE VERKLAREN NIET)

TUSSENVOEGSEL IN @TSD
	SELECTEER	CNT
			, EMPLOYEECODE
			, ADMINISTRATIONDATE
			, DAILYPATTERNCODE
			, STANDARDMINSINDAILYPATTERN
			, STANDARDMINUTESACHIEVED
	VAN dbo.TIMESUMMARYDAY
	WAAR DAILYPATTERNCODE = 68206 EN
    ADMINISTRATIONDATE 	TUSSEN @TMP_BEGINDATE EN @TMP_ENDDATE

SCHRAP VAN  @TSD 
WAAR (STANDARDMINSINDAILYPATTERN = 0 EN STANDARDMINUTESACHIEVED <> 0)


VERKLAAR @EMP- LIJST (
	[[Varchar] EmployeeId] (15) NIETIG VERKLAREN niet,
	[EmployeeCode] [int.] VERKLAAR nietig,
	[[Varchar] Achternaam] (40) VERKLAAR nietig,
	[[Varchar] Voornamen] (40) VERKLAAR nietig,
	[[Varchar] Team] (16) VERKLAAR nietig,
	[Centrum] [varchar] (5) VERKLAART nietig)


TUSSENVOEGSEL IN @EMP
	SELECTEER	EmployeeId
			, EmployeeCode
			, Achternaam
			, Voornamen
			, Centrum
			, Team
	VAN dbo.xPLT_EmpInfo 
	WAAR actieve > 0

VERKLAAR emp_cur CURSEUR voor
	
 SELECTEER
  eiv.EmployeeID,
  tsd.EMPLOYEECODE,
  tsd.ADMINISTRATIONDATE
  VAN @EMP eiv 
  binnen sluit me aan bij @TSD tsd
  op eiv.EmployeeCode = tsd.EmployeeCode
  WAAR
   tsd.ADMINISTRATIONDATE tussen @p_BeginDate en @p_EndDate en
   tsd.STANDARDMINSINDAILYPATTERN = 0



CRE�ëR LIJST #TMP9001
(
 Het klusje			van EmployeeID (6),
 Datetime				van NPDDay,
 Datetime		van PrevWorkDayAbs,
 Datetime		van NextWorkDayAbs
)

open emp_cur
haal daarna van emp_cur in @w_NPDDay @w_EmployeeID, @w_EmployeeCode,

als @@fetch_status <> 0
 goto end_ret -- geen kwalificerende gegevens aan proces

terwijl @@fetch_status = 0
 begin -- curseur lijn

  -- bepaal vorige & volgende het werkdagen

  exec @w_RetStatus = dbo.xPLT_PrevNextWorkDay @w_EmployeeId, @w_NPDDay, 0, @r_PrevWorkDay output, @r_NextWorkDay output
  als @w_RetStatus <> 0
   begin
    selecteer @w_RetMsg = „xPLT_WTAAbsenceSpanNPD: vraag aan xPLT_PrevNextWorkDay ontbroken met terugkeercode: “ + bekeerling (klusje (1), @w_RetStatus)
    raiserror („%s“, 18.1, @w_RetMsg)
    selecteer @w_RetCode = 1
    goto end_ret
   eind

  -- test voor volledige dagenafwezigheid op vorige & volgende het werkdagen
  als 
   (
    selecteer 
     telling (*)
    van 
     @TSD tsd
    waar 
     tsd.EMPLOYEECODE = @w_EmployeeCode en
     (tsd.ADMINISTRATIONDATE = @r_PrevWorkDay of tsd.ADMINISTRATIONDATE = @r_NextWorkDay) en
     tsd.STANDARDMINSINDAILYPATTERN > 0 en
     tsd.STANDARDMINUTESACHIEVED = 0
   ) = 2
   begin
    tussenvoegsel in #tmp9001 (EmployeeID, NPDDay, PrevWorkDayAbs, NextWorkDayAbs)
     waarden (@w_EmployeeID, @w_NPDDay, @r_PrevWorkDay, @r_NextWorkDay)
   eind 

  haal daarna van emp_cur in @w_NPDDay @w_EmployeeID, @w_EmployeeCode,

 eind -- curseur lijn


-- terugkeer resultset

selecteer 
 t1.*,
 eiv. Achternaam,
 eiv. Voornamen,
 eiv. Centrum,
 eiv. Team
 van 
  #tmp9001 t1
   binnen sluit me aan bij dbo.xPLT_EmpInfo_Vw eiv
    op t1.EmployeeID = BRENGEN eiv.EmployeeID Latin1_General_CI_AS bij elkaar
 orde langs 
  t1.EmployeeID,
  t1.NPDDay


--selecteer * uit  #tmp9001- t1

end_ret:


dichte emp_cur
deallocate emp_cur
laat vallen lijst #tmp9001

--keer @w_RetCode terug
selecteer @w_RetCode

GA
Andere oplossingen  
 
programming4us programming4us