| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			
			Хранимые процедуры и производительность
			 
			
			Здравствуйте! 
		
		
		
		
		
		
		
	Функция «Развертывание» в сводном плане выполняется порядка 28 минут для большого изделия (несколько тысяч составляющих, более 10 уровней вложенности спецификации). Время неприемлемое, разумеется. В алгоритме класса, осуществляющего развертывание (ReqTransExplode) коренных улучшений добиться не удалось; были выбраны требуемые поля в запросах вместо записи целиком, поэкспериментировали с индексами. Основная проблема в том, что суть алгоритма – рекурсивный спуск (или подъем при развертывании вверх) по дереву. А рекурсия никогда особой шустростью не отличалась... В результате для сложного изделия имеем много погружений в рекурсию и множество мелких запросов к БД (таблицы ReqTrans, ReqCalc). Как один из вариантов улучшения ситуации был рассмотрен перенос алгоритма развертывания на SQL-server (написание Stored Procedure). Однако в таком случае алоритм отрабатывает еще медленнее, 4 минуты против 12 секунд в стандартном варианте. С чем это может быть связано? Алгоритм перенесен практически 1:1. Единственное отличие – погружение по дереву реализовано не вширину, а вглубину (соответственно чаще вызывает сама себя ф-ция). Имеются сильные подозрения, что именно в этом дело.:-( Но только ли в этом? Был у кого-нибудь опыт переведения части кода в хранимые процедуры? Насколько хорошо MS SQL server 2000 справляется с рекурсией? Может, возможно повысить скорость отработки хранимой процедуры использованием каких-то ключевых слов, инструкций, параметров и т.д.? Ни за что не стали бы так возиться с развертыванием, однако данный класс используется в очень критичном для клиента алгоритме.  | 
| 
	
 |