游标非常慢 SQL 服务器
Very slow cursor SQL Server
我不知道为什么这么慢
DECLARE kursor CURSOR FOR
SELECT mediatime, ShortDate, MediaDateID, TimeID
FROM DateTimeMCross
DECLARE @mediatime INT, @ShortDate DATE, @MediaDateID INT, @TimeID INT, @tmpDate DATE
SET @mediatime = 0;
OPEN kursor
FETCH NEXT FROM kursor INTO @mediatime, @ShortDate, @MediaDateID, @TimeID
WHILE @@FETCH_STATUS = 0
BEGIN
/*SET @tmpDate = (select DATEADD(day,-1,@shortDate))*/
IF @mediatime >= 2400
BEGIN
UPDATE DateTimeMCross
SET DateTimeMCross.newMediaDateID = 2/*(SELECT YEAR(@tmpDate) * 10000 + MONTH(@tmpDate) * 100 + DAY(@tmpDate))*/
WHERE DateTimeMCross.MediaDateID = @MediaDateID
AND DateTimeMCross.TimeID = @TimeID
END
ELSE IF @mediatime < 2400 AND @mediatime >= 0
BEGIN
UPDATE DateTimeMCross
SET DateTimeMCross.newMediaDateID = @MediaDateID
WHERE DateTimeMCross.MediaDateID = @MediaDateID
AND DateTimeMCross.TimeID = @TimeID
END
FETCH NEXT FROM kursor INTO @mediatime, @ShortDate, @MediaDateID, @TimeID
END
CLOSE kursor
DEALLOCATE kursor
我之前用游标做了一个语句,它很快,这个真的很慢。
一开始以为是DATEADD()
等函数引起的,不是。注释掉后和以前一样慢
这个真的不需要是游标。好像你想要一个简单的 UPDATE
:
UPDATE DateTimeMCross
SET newMediaDateID = CASE
WHEN mediatime >= 2400 THEN 2
ELSE MediaDateID
END
;
您只需要一个 UPDATE
,而不是光标:
UPDATE d
SET d.newMediaDateID = CASE
WHEN mediatime>=2400 THEN 2
WHEN mediatime <2400 AND mediatime >=0 THEN MediaDateID
END
FROM DateTimeMCross d
我不知道为什么这么慢
DECLARE kursor CURSOR FOR
SELECT mediatime, ShortDate, MediaDateID, TimeID
FROM DateTimeMCross
DECLARE @mediatime INT, @ShortDate DATE, @MediaDateID INT, @TimeID INT, @tmpDate DATE
SET @mediatime = 0;
OPEN kursor
FETCH NEXT FROM kursor INTO @mediatime, @ShortDate, @MediaDateID, @TimeID
WHILE @@FETCH_STATUS = 0
BEGIN
/*SET @tmpDate = (select DATEADD(day,-1,@shortDate))*/
IF @mediatime >= 2400
BEGIN
UPDATE DateTimeMCross
SET DateTimeMCross.newMediaDateID = 2/*(SELECT YEAR(@tmpDate) * 10000 + MONTH(@tmpDate) * 100 + DAY(@tmpDate))*/
WHERE DateTimeMCross.MediaDateID = @MediaDateID
AND DateTimeMCross.TimeID = @TimeID
END
ELSE IF @mediatime < 2400 AND @mediatime >= 0
BEGIN
UPDATE DateTimeMCross
SET DateTimeMCross.newMediaDateID = @MediaDateID
WHERE DateTimeMCross.MediaDateID = @MediaDateID
AND DateTimeMCross.TimeID = @TimeID
END
FETCH NEXT FROM kursor INTO @mediatime, @ShortDate, @MediaDateID, @TimeID
END
CLOSE kursor
DEALLOCATE kursor
我之前用游标做了一个语句,它很快,这个真的很慢。
一开始以为是DATEADD()
等函数引起的,不是。注释掉后和以前一样慢
这个真的不需要是游标。好像你想要一个简单的 UPDATE
:
UPDATE DateTimeMCross
SET newMediaDateID = CASE
WHEN mediatime >= 2400 THEN 2
ELSE MediaDateID
END
;
您只需要一个 UPDATE
,而不是光标:
UPDATE d
SET d.newMediaDateID = CASE
WHEN mediatime>=2400 THEN 2
WHEN mediatime <2400 AND mediatime >=0 THEN MediaDateID
END
FROM DateTimeMCross d