Search code examples
sqlsql-serverperformancewhile-loopcursor

Very slow cursor SQL Server


I don't know why this is so slow

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

I make before one statement with cursor and it was fast and this is really really slow.

I thought at the beginning it was caused by DATEADD() and other function but no. After comment out it is as slow as before


Solution

  • This reaaaaaally doesn't need to be a cursor at all. Seems like you want a simple UPDATE:

    UPDATE DateTimeMCross
    SET newMediaDateID = CASE 
                            WHEN mediatime >= 2400 THEN 2
                            ELSE MediaDateID
                         END
    ;