低速SQL查询
Posted
技术标签:
【中文标题】低速SQL查询【英文标题】:Low speed SQL query 【发布时间】:2014-08-09 13:53:58 【问题描述】:我在 SQL Server 中有 16000 行,我想将文档编号物理分配给记录并使用以下代码,当我的记录为 8000 时它工作正常但很懒,但当记录增加到 16000 时它给我一个超时错误,请帮我提高查询的性能???
declare @NewDoc int;
set @NewDoc=0
declare t1_cursor cursor dynamic for select documentheaderid,documentnumber from Accounting.DocumentHeader where FinancialPeriodFK=@FinancialPeriodFK and Date>=@FromDate and Date<=@ToDate order by Date
open t1_cursor
fetch next from t1_cursor
while(@@fetch_status=0)
begin
set @NewDoc=@NewDoc+1;
update Accounting.DocumentHeader set DocumentNumber=@NewDoc where current of t1_cursor
fetch next from t1_cursor
end
close t1_cursor
deallocate t1_cursor
【问题讨论】:
@marc_s 你所说的基于集合的操作是什么意思? 基于集合的意思是避免 RBAR(逐行痛苦)处理——比如使用游标或while循环。你告诉 SQL Server 你想要什么 - 但没有详细说明如何去做,让 SQL Server 决定如何为你解决问题 【参考方案1】:尝试这样的事情 - 避免任何逐行痛苦处理,如游标或 while 循环:
-- creates a temporary "inline" view of the data you're interested in and
-- assigns each row a consecutive number
;WITH DataToUpdate AS
(
SELECT
DocumentHeaderId,
DocumentNumber,
NewDocNum = ROW_NUMBER() OVER(ORDER BY [Date])
FROM
Accounting.DocumentHeader
WHERE
FinancialPeriodFK = @FinancialPeriodFK
AND Date >= @FromDate
AND Date <= @ToDate
)
-- update the base table to make use of that new document number
UPDATE dh
SET dh.DocumentNumber = dtu.NewDocNum
FROM Accounting.DocumentHeader dh
INNER JOIN DataToUpdate dtu ON dh.DocumentHeaderId = dtu.DocumentHeaderId
这应该显着加快您的处理时间!
【讨论】:
感谢亲爱的@marc_s,它将速度从 80 秒提高到 2 秒,令人难以置信。以上是关于低速SQL查询的主要内容,如果未能解决你的问题,请参考以下文章