Вопрос : Кодему SQL нужно изменить или оптимизировать - using стрелка в настоящее время

Hi

I наследовало следующий Кодего на новой роли - написанной проявителем много лун ago.
Issues с им что оно принимает большое количество времени возвратить и много ресурсы на базе данных течения woefully underspecced server.
The находятся в режиме совместимости 2k на SQL 2005 server.

I оценили взгляд на Кодем и re-write Кодего для того чтобы оптимизировать его
Or даже более лучшая дорога сделать ее differently.
Im многодельное на других делах поэтому не имеют время сделать этот процесс себя следовательно почему im ища вполне ответ что я могу как раз run.
Id также быть заинтересован в что люди думают неправильно с этим…

Please не предлагает часть solution.

I может предложить любую другую информацию needed.
i прикрепляло архив с Кодим - показывает содержание взгляда вызван в sproc.

Thank вы class= " lineNumbers " >
1 >

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: процедура по >CREATE " prettyprint " " class= id= " codeSnippet910884 >
 0 и 
                STANDARDMINUTESACHIEVED = 0) -- только проверите если по возможности уместные отсутствия целого дня внутри «окно», то
  заказ мимо
   eiv.EmployeeID,
   tsd.ADMINISTRATIONDATE
 для прочитано только

создайте таблицу #tmp9001
(
 Чарс EmployeeID (6),
 Datetime NPDDay,
 Datetime PrevWorkDayAbs,
 Datetime NextWorkDayAbs
)

раскройте emp_cur
fetch затем от emp_cur в @w_EmployeeID, @w_EmployeeCode, @w_NPDDay

если <> 0 @@fetch_status
 переход end_ret -- отсутствие квалифицируя данных к процессу

пока @@fetch_status = 0
 начните -- петля стрелки

  -- обусловьте ранее & следующие дни работы
  @w_RetStatus exec = @w_EmployeeId dbo.xPLT_PrevNextWorkDay, @w_NPDDay, 0, @r_PrevWorkDay выход, @r_NextWorkDay выход
  если <> 0 @w_RetStatus
   начните
    выберите @w_RetMsg = «xPLT_WTAAbsenceSpanNPD: вызовите к xPLT_PrevNextWorkDay неудачный с возвратным кодом: » + новообращенный (чарс (1), @w_RetStatus)
    raiserror ("%s», 18.1, @w_RetMsg)
    выберите @w_RetCode = 1
    переход end_ret
   конец

  -- испытайте для отсутствия целых дней на ранее & следующие дни работы
  если 
   (
    отборно 
     отсчет (*)
    от 
     dbo.TIMESUMMARYDAY tsd с (nolock)
    где 
     tsd.EMPLOYEECODE = @w_EmployeeCode и
     (tsd.ADMINISTRATIONDATE = @r_PrevWorkDay или tsd.ADMINISTRATIONDATE = @r_NextWorkDay) и
     tsd.STANDARDMINSINDAILYPATTERN > 0 и
     tsd.STANDARDMINUTESACHIEVED = 0
   ) = 2
   начните
    введите в #tmp9001 (EmployeeID, NPDDay, PrevWorkDayAbs, NextWorkDayAbs)
     значения (@w_EmployeeID, @w_NPDDay, @r_PrevWorkDay, @r_NextWorkDay)
   конец 
     
    
  fetch затем от emp_cur в @w_EmployeeID, @w_EmployeeCode, @w_NPDDay
  
 конец -- петля стрелки


-- возвращенное resultset
отборно 
 t1.*,
 eiv. Фамилия,
 eiv. Forenames,
 eiv. Центр,
 eiv. Команда
 от 
  t1 #tmp9001
   внутренне соедините eiv dbo.xPLT_EmpInfo_Vw
    на t1.EmployeeID = eiv.EmployeeID COLLATE Latin1_General_CI_AS
 заказ мимо 
  t1.EmployeeID,
  t1.NPDDay

end_ret:
близкое emp_cur
deallocate emp_cur
упадите таблица #tmp9001
возвратите @w_RetCode


ИДИТЕ
filename " class= >

view-called-from-sproc.txt (207 байт) яваскрипт " href= " " attachmentDetails class= (тип архива детали) >view " описания " class=
>
class=

Ответ : Кодему SQL нужно изменить или оптимизировать - using стрелка в настоящее время

mooriginal

После смотреть вашу ситуацию, ясно что в виду того что вы не имеете никакую дорогу помещать в архив более старую (историческо)
данные, ваше представление вытерпят по мере того как время идет дальше и больше показателей добавлены.

Я побежал это Кодий с 5 миллионов показателями TIMESUMMARYDAY и 15 тысяч показателями РАБОТНИКА
(Случайно произведено) на старой системе 2005 SQL и возвращенном 11k приводит к в меньш sec чем 50.

Имейте пока сделать любое оптимизирование, или attemped для того чтобы получить освобожданным стрелки.  Идеей будет создать 2
таблица temp и использует их для того чтобы создать комплект результата.  Затем создать эти таблицы на базе данных
(пока не имейте никакие индексы) и усеките, заполните, и индексируйте данные и после этого побегите вопрос.
Это должно улучшить представление.    
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:
--НОВЫЕ РЕЗУЛЬТАТЫ СТРЕЛКИ

объявите
 @w_RetCode	        int,
 @w_RetStatus		int,

 @w_RetMsg          varchar (255),
 @r_PrevWorkDay     datetime,
 @r_NextWorkDay     datetime,
 чарс		@w_EmployeeID (6),
 @w_EmployeeCode	int,
 @w_NPDDay			datetime,

 datetime        @p_BeginDate,
 datetime          @p_EndDate



выберите @w_RetCode = 0
выберите @p_BeginDate = «08/01/10»
выберите @p_EndDate = «08/10/10»



ОБЪЯВИТЕ
	 datetime        @TMP_BeginDate,
	 datetime          @TMP_EndDate

УСТАНОВИТЕ @TMP_BeginDate = DATEADD (wk, -3, @p_BeginDate)
УСТАНОВИТЕ @TMP_EndDate = DATEADD (wk, +3, @p_EndDate)

ОБЪЯВИТЕ ТАБЛИЦУ @TSD (CNT [int] НУЛЕВОЕ,
	[EMPLOYEECODE] [int] НЕ АННУЛИРУЙТЕ,
	[ADMINISTRATIONDATE] [datetime] NULL,
	[DAILYPATTERNCODE] [int] NULL,
	[STANDARDMINSINDAILYPATTERN] [smallint] NULL,
	[STANDARDMINUTESACHIEVED] [smallint] НЕ NULL)

ВВЕДИТЕ В @TSD
	ВЫБЕРИТЕ	CNT
			, EMPLOYEECODE
			, ADMINISTRATIONDATE
			, DAILYPATTERNCODE
			, STANDARDMINSINDAILYPATTERN
			, STANDARDMINUTESACHIEVED
	ОТ dbo.TIMESUMMARYDAY
	ГДЕ DAILYPATTERNCODE = 68206 И
    ADMINISTRATIONDATE 	МЕЖДУ @TMP_BEGINDATE И @TMP_ENDDATE

DELETE ОТ  @TSD 
ГДЕ (STANDARDMINSINDAILYPATTERN = 0 И STANDARDMINUTESACHIEVED <> 0)


ОБЪЯВИТЕ ТАБЛИЦУ @EMP (
	[EmployeeId] [varchar] (15) НЕ NULL,
	[EmployeeCode] [int] NULL,
	[Фамилия] [varchar] (40) АННУЛИРУЙТЕ,
	[Forenames] [varchar] (40) АННУЛИРУЙТЕ,
	[Команда] [varchar] (16) NULL,
	[Центр] [varchar] (5) NULL)


ВСТАВКА В @EMP
	ВЫБЕРИТЕ	EmployeeId
			, EmployeeCode
			, Фамилия
			, Forenames
			, Центр
			, Команда
	ОТ dbo.xPLT_EmpInfo 
	ГДЕ active > 0

ОБЪЯВИТЕ СТРЕЛКУ emp_cur для
	
 ВЫБЕРИТЕ
  eiv.EmployeeID,
  tsd.EMPLOYEECODE,
  tsd.ADMINISTRATIONDATE
  ОТ eiv @EMP 
  внутренне соедините @TSD tsd
  на eiv.EmployeeCode = tsd.EmployeeCode
  ГДЕ
   tsd.ADMINISTRATIONDATE между @p_BeginDate и @p_EndDate и
   tsd.STANDARDMINSINDAILYPATTERN = 0



СОЗДАЙТЕ ТАБЛИЦУ #TMP9001
(
 Чарс			EmployeeID (6),
 Datetime				NPDDay,
 Datetime		PrevWorkDayAbs,
 Datetime		NextWorkDayAbs
)

раскройте emp_cur
fetch затем от emp_cur в @w_EmployeeID, @w_EmployeeCode, @w_NPDDay

если @@fetch_status <> 0
 переход end_ret -- отсутствие квалифицируя данных к процессу

пока @@fetch_status = 0
 начните -- петля стрелки

  -- обусловьте ранее & следующие дни работы

  @w_RetStatus exec = @w_EmployeeId dbo.xPLT_PrevNextWorkDay, @w_NPDDay, 0, @r_PrevWorkDay выход, @r_NextWorkDay выход
  если @w_RetStatus <> 0
   начните
    выберите @w_RetMsg = «xPLT_WTAAbsenceSpanNPD: вызовите к xPLT_PrevNextWorkDay неудачный с возвратным кодом: » + новообращенный (чарс (1), @w_RetStatus)
    raiserror ("%s», 18.1, @w_RetMsg)
    выберите @w_RetCode = 1
    переход end_ret
   конец

  -- испытайте для отсутствия целых дней на ранее & следующие дни работы
  если 
   (
    отборно 
     отсчет (*)
    от 
     @TSD tsd
    где 
     tsd.EMPLOYEECODE = @w_EmployeeCode и
     (tsd.ADMINISTRATIONDATE = @r_PrevWorkDay или tsd.ADMINISTRATIONDATE = @r_NextWorkDay) и
     tsd.STANDARDMINSINDAILYPATTERN > 0 и
     tsd.STANDARDMINUTESACHIEVED = 0
   ) = 2
   начните
    введите в #tmp9001 (EmployeeID, NPDDay, PrevWorkDayAbs, NextWorkDayAbs)
     значения (@w_EmployeeID, @w_NPDDay, @r_PrevWorkDay, @r_NextWorkDay)
   конец 

  fetch затем от emp_cur в @w_EmployeeID, @w_EmployeeCode, @w_NPDDay

 конец -- петля стрелки


-- возвращенное resultset

отборно 
 t1.*,
 eiv. Фамилия,
 eiv. Forenames,
 eiv. Центр,
 eiv. Команда
 от 
  t1 #tmp9001
   внутренне соедините eiv dbo.xPLT_EmpInfo_Vw
    на t1.EmployeeID = eiv.EmployeeID COLLATE Latin1_General_CI_AS
 заказ мимо 
  t1.EmployeeID,
  t1.NPDDay


--выберите * от  t1 #tmp9001

end_ret:


близкое emp_cur
deallocate emp_cur
упадите таблица #tmp9001

--возвратите @w_RetCode
выберите @w_RetCode

ИДИТЕ
Другие решения  
  •  Как я добавляю кнопки на форме PDF для того чтобы добавить/извлекаю рядки данных?
  •  Шнур ошибки в блоке задвижки?
  •  сколько вариант сервера SQL на одной машине
  •  Внешний вид 2007 не может архивный файл открытой сети сохраненный
  •  Активно директория DNS записывает вопрос
  •  Отчет о доступа 2010 экспорта к CSV с коллекторами?
  •  Прокладчик OCE 9400 не начинает
  •  как добавить десятичное место в формуле в отчете о кристалла seagate
  •  Windows XP и Мичрософт Оутлоок и проблемы установителя Windows
  •  VB6 к VS2010 - консультации тренировки?
  •  
    programming4us programming4us