2011-04-21 256 views
0

以下查詢運行緩慢。對於memberid中的一個值,memberid0,memberid1 ........ memberid9中有多個條目。因此,每條語句都會影響多行更新。 Ofcourse表大小以MB爲單位TSql(sql server 2005)查詢運行緩慢

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 
+0

步驟來改善:(1)擺脫光標的 - 這是** **總是會成爲sloooooooow - (2)檢查執行計劃可能幫助的潛在索引(在WHERE或ORDER BY子句中顯示的列) – 2011-04-21 09:20:50

回答

0

我加倍marc_s說,但如果你不想這樣做, 嘗試創建一個牽你的更新語句,然後一表一批次的最低10執行它們每個查詢更新。

嘗試創建兩個表來存儲兩種不同類型的更新,因此在批處理中,只能更新至少10行。我想在一個查詢中儘可能多地更新。在單個SQL查詢

多次更新速度更快,請參閱: Why are batch inserts/updates faster? How do batch updates work?