Мне нужна помощь, пожалуйста, оптимизируя SQL While Loop ниже. Это призыв к тем, кто испытал это, чтобы помочь. В настоящее время мой код T-SQL работает более 25 минут, и я хотел бы сократить это время как можно больше. Я смог идентифицировать этот цикл как серьезную проблемную область и был бы признателен за любую помощь, чтобы сделать это.
DECLARE @rownumber int
DECLARE @power_show BIT
DECLARE @AD_show BIT
set @rownumber = 0
--FOR EACH ROW CONTAINED IN MY TEMPTABLE
WHILE @rownumber < @rowcounter
BEGIN
set @rownumber = @rownumber + 1
-- THE VARIABLES
DECLARE @record_no as BIGINT
DECLARE @phone_name VARCHAR(30)
DECLARE @messagepriority as INTEGER
DECLARE @phone_number VARCHAR(30)
DECLARE @phone_id BIGINT
DECLARE @questionMessage BIGINT
SELECT
@phone_name = n.phone_name, @phone_number =n.phone_number, @messagepriority =n.messagepriority, @phone_id=n.phone_id ,
@AD_show=n.AD_show, @power_show=n.power_show
FROM
#temporary_phonetable n WITH(NOLOCK)
WHERE n.rownumber = @rownumber
--EXECUTE STOREDPROC ADDMESSAGETOQUEUE WHICH RETURNS THE ROWID OF THE NEWLY CREATED ROW, IF ANY
SELECT @record_no = sp_queryExecute AddMessageToQueue(@phone_number, @responsemessages, @dateresponsessent, @savednames, @userid, un.messagepriority, @responsetype, un.AD_show, un.power_show, @service_provider, @PhoneType)
If(@questionid > 0)
BEGIN
-- EXECUTE STOREDPROC ADDQUESTIONMESSAGE WHICH RETURNS THE ROWID OF NEWLY CREATED ROW, IF ANY
SET @questionMessage = sp_queryExecute AddQuestionMessage(@questionid,@phone_id, @record_no, DATEADD(d, 30, GETDATE()) )
END
-- ADD THE NEW ROWID TO THE TEMP TABLE
UPDATE #temporary_phonetable SET record_no = @record_no, questionMessage=@questionMessage
WHERE phone_number = @phone_number AND rownumber = @rownumber
END
Я не думаю, что оптимизация должна принимать mplace в вашем цикле. Я рекомендую проверить, что происходит в хранимых процедурах. Первый ответ был прав, говоря, что вы должны переместить свои объявления за пределы цикла. Но я не верю, что это сэкономит значительное количество времени.
Добавление: стоит попробовать и сделать это без использования курсора и прокрутки.
не зная t-sql, я вижу сразу две вещи.
Зачем использовать While для подсчитанного цикла? Используйте цикл for (в plsql у нас есть петли курсора специально для итерация курсора)
Почему вы объявляете/инициализируете ваши вары внутри петли? Может быть есть Декларация их снаружи и повторно инициализировать их (если необходимо) внутри цикла.