低速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查询的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询语句

使用sql语句查询日期的方法

怎么用sql语句查询?

MYSQL如何进行sql like (sql查询结果)的查询

sql查询语句大全

sql查询,求解