TSql (SQL Server 2005) запрос выполняется медленно - PullRequest
0 голосов
/ 21 апреля 2011

Следующий запрос выполняется медленно.для одного значения в memberid есть несколько записей в memberid0, memberid1 ........ memberid9.Поэтому каждый оператор влияет на несколько обновлений строк.Конечно размер таблицы в МБ

Declare @memberName nvarchar(250)
Declare @memberID bigint
Declare @dimId int
Declare @levelId int
Declare @newName nvarchar(250)
Declare @updateSQL1 nvarchar(500)
Declare @updateSQL2 nvarchar(500)
Declare @cursorStmt nvarchar(300)
Declare @custCounter bigint
Declare @prodCounter bigint
Declare @regCounter bigint
Declare @memberCounter int

SET @custCounter = 1
SET @prodCounter = 1
SET @regCounter = 1
SET @memberCounter = 0

BEGIN TRANSACTION

While @memberCounter < 3
Begin

    Set @cursorStmt = 'Declare memberCursor CURSOR
        FOR Select name, memberid, dimensionId, levelNumber from member' + CAST(@memberCounter as NVARCHAR(1)) + ' where memberID <> 0 order by memberid'
    print @cursorStmt

    exec sp_executesql @cursorStmt  

    OPEN memberCursor
    FETCH NEXT FROM memberCursor INTO @memberName, @memberId, @dimId, @levelId

    WHILE @@FETCH_STATUS = 0
    BEGIN
        IF @dimId = 0
            BEGIN
                SET @newName = 'Customer_' + CAST(@custCounter AS NVARCHAR(10)) + '_LEVEL_' + CAST(@levelId AS NVARCHAR(10))
                SET @custCounter = @custCounter + 1 
            END
        else if @dimId = 1
            BEGIN
                SET @newName = 'Product_' + CAST(@prodCounter AS NVARCHAR(10)) + '_LEVEL_' + CAST(@levelId AS NVARCHAR(10))
                SET @prodCounter = @prodCounter + 1 
            END
        else if @dimId = 2
            BEGIN
                SET @newName = 'Region_' + CAST(@regCounter AS NVARCHAR(10)) + '_LEVEL_' + CAST(@levelId AS NVARCHAR(10))
                SET @regCounter = @regCounter + 1   
            END

        SET @updateSQL1 = 'Update Member' + CAST(@dimId AS NVARCHAR(5)) + ' set name = ''' + @newName + ''' where memberId = ' + CAST(@memberId AS NVARCHAR(10))
        SET @updateSQL2 = 'Update Member' + CAST(@dimId AS NVARCHAR(5)) + ' set memberName' + CAST(@levelId-1 AS NVARCHAR(5)) + ' = ''' + @newName + ''' where memberId' + CAST(@levelId-1 AS NVARCHAR(5)) + ' = ' + CAST(@memberId AS NVARCHAR(10))

        --print @updateSQL1
        --print @updateSQL2

        exec sp_executesql @updateSQL1  
        exec sp_executesql @updateSQL2

        FETCH NEXT FROM memberCursor INTO @memberName, @memberId, @dimId, @levelId

    END

    CLOSE memberCursor  
    DEALLOCATE memberCursor

    Set @memberCounter = @memberCounter + 1

END

1 Ответ

0 голосов
/ 21 апреля 2011

Я дважды говорю marc_s, но если вы не хотите этого делать, попробуйте создать таблицу, в которой будут содержаться ваши операторы Update, а затем выполнить их в пакете не менее 10 обновлений на запрос.

Попробуйте создать две таблицы для хранения двух разных видов обновлений, поэтому в пакете вы можете иметь только один вид обновлений минимум в 10 строках.Я хочу обновить столько, сколько смогу в одном запросе.

Множественные обновления в одном запросе SQL выполняются быстрее, см .: Почему пакетные вставки / обновления быстрее?Как работают пакетные обновления?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...