Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Как можно ускорить ? (число прочтений - 1547 )
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Как можно ускорить ?
05. Апреля 2007 :: 10:59
Печать  
Есть конструкция вида
Код
Выбрать все
Процедура Сформировать()

....

	ТекстЗапроса2 = "
	|SELECT
	|	SUM(S.Summa) as Сумма,
	|	S.ВидПлатежа [ВидПлатежа $Перечисление.ВидыПлатежей]
	|FROM (
	|		SELECT
	|	    	$Рег.Сумма as Summa,
	|			$Рег.ВидПлатежа as ВидПлатежа
	|		FROM
	|		    $Регистр.Реклама as Рег (nolock)
	|		INNER JOIN _1sjourn as J (nolock) ON
	|				(Рег.IDDOC = J.IDDOC)
	|				AND (J.Date_Time_IDDoc > :ДатаКонца)
	|				AND (J.Date_Time_IDDoc <= :ПраваяДатаДляПоискаОплат)
	|				AND (J.$ФлагРегистра.Реклама=1)
	|		WHERE
	|		   	($Рег.Издание = :Издание) AND ($Рег.Рубрика = :Рубрика) AND
	|			($Рег.Контрагент = :Контрагент) AND ($Рег.Менеджер = :Менеджер) AND (Рег.DEBKRED = 0) AND ($Рег.Сумма <> 0)
	|			AND	 (($Рег.ВидПлатежа = '" + MDWork.ЗначениеВСтрокуБД(Перечисление.ВидыПлатежей.БН) + "')
	|			OR	 ($Рег.ВидПлатежа = '" + MDWork.ЗначениеВСтрокуБД(Перечисление.ВидыПлатежей.Н) + "')
	|			OR	 ($Рег.ВидПлатежа = '" + MDWork.ЗначениеВСтрокуБД(Перечисление.ВидыПлатежей.Н1) + "'))
	|
	|	) as S
	|GROUP BY
	|	S.Summa,
	|	S.ВидПлатежа";

   Для сч = 1 По ТЗ.КоличествоСтрок() Цикл // сама ТЗ является результатом выполнения другого прямого запроса
....
				Если ОплаченоПоВыпуск < ПечСумма Тогда
					//Поищем-ка в будущих периодах оплату..
					RS1.УстановитьТекстовыйПараметр("Издание", ВыбИздание);
					RS1.УстановитьТекстовыйПараметр("Менеджер", ТЗ.Менеджер);
					RS1.УстановитьТекстовыйПараметр("Рубрика",ТЗ.Рубрика);
					RS1.УстановитьТекстовыйПараметр("Контрагент", ТЗ.Контрагент);
					RS1.УстановитьТекстовыйПараметр("ДатаКонца", ДатаКон); //ДатаКон
					RS1.УстановитьТекстовыйПараметр("ПраваяДатаДляПоискаОплат", ПраваяДатаДляПоискаОплат+1);
					//RS1.Debug(1);
					В = _GetPerformanceCounter();
					ТЗ2=RS1.ВыполнитьИнструкцию(ТекстЗапроса2);
					ВсегоНаПоискОплатВремени = ВсегоНаПоискОплатВремени + (_GetPerformanceCounter() - В)/1000;
					//ТЗ2.ВыбратьСтроку(,,);
					Если ТипЗначения(ТЗ2) <> 0 Тогда
						Если ТЗ2.КоличествоСтрок() > 0 Тогда
							СуммаПлатежаБудущихВыпусков = ТЗ2.Итог(1); //будущая оплата одной суммой по всем видам платежей
						КонецЕсли;
					КонецЕсли;
				КонецЕсли;              
......
 КонецЦикла;

....

КонецПроцедуры 


Получается, что каждый раз по мере выполнения условия происходит компиляция запроса на скуле,  а потом его выполнение, что замедляет в общем выполнение цикла. Поможет ли тут по скорости параметризованный запрос, или может оформить хранимой процедурой ?
Если да, то подскажите как оформить. Можно примерчик.
  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: Как можно ускорить ?
Ответ #1 - 05. Апреля 2007 :: 12:15
Печать  
Попробуй использовать ВыполнитьSQL_ИзТЗ()
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как можно ускорить ?
Ответ #2 - 05. Апреля 2007 :: 13:32
Печать  
Поможет:
1)включение у ODBCRecordset режима RPC;
2)параметризированный запрос;
3)вычислять эти данные сразу в первом запросе (результат которого ТЗ) - поможет максимально эффективно.
  
Наверх
ICQ  
IP записан
 
Igor-bts
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 103
Зарегистрирован: 14. Июля 2006
Re: Как можно ускорить ?
Ответ #3 - 05. Апреля 2007 :: 18:44
Печать  
Создать временную таблицу с вариантами значений параметров и сделать inner Join
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать