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