我需要帮助,请在下面优化SQL While循环。这是呼吁那些有经验的人请求帮助。目前,我的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
答案 0 :(得分:2)
我认为优化不需要在循环中使用mplace。我建议检查存储过程中发生的情况。 第一个答案是正确的,说你应该把你的声明移到循环之外。但我不相信这会节省大量时间。
附录:尝试使用游标并且不得不循环执行此操作是值得的。
答案 1 :(得分:0)
不知道t-sql我立即看到了两件事。
为什么要使用While计数循环? 使用for循环(在plsql中我们有 游标循环专门用于 迭代游标)
为什么要声明/初始化 你的vars在循环中?也许 有一个声明他们在外面和 重新初始化它们(如果需要) 在循环中。