0

我正在尝试更新具有约 90,000 行的表中的列。是否有任何优化的方式来更新表?

我添加了必要的索引.. 这样就不会发生表扫描/查找。但是仍然需要很长时间才能运行(1小时)。

我的场景:

DECLARE @ParentID   NVARCHAR(100),
        @Con_ERID   INT

DECLARE @MaxCount   INT, 
        @MinCount   INT, 
        @Id         INT

SELECT @MaxCount = MAX(Id) from [dbo].[ParentIDStaging] where Type='grid'

SET @MinCount = 1

WHILE @MinCount <= @MaxCount 
BEGIN

SELECT @Id = ConID FROM [dbo].[ParentIDStaging] WHERE Id = @MinCount  and Type = 'grid'

IF @Id IS NOT NULL
BEGIN

SELECT  @Con_ERID   =   ErId    FROM Context (NOLOCK) Where ConId = @Id
SELECT  @ParentID   =   Identifier FROM Recording (NOLOCK) where ErId = @Con_ERID

    BEGIN TRAN

        UPDATE  [ParentIDStaging]       WITH (ROWLOCK)
        SET [ParentID]   = @ParentID
        WHERE   ContentType = 'grid'
        AND ConID   = @Id

    COMMIT
END

SET @MinCount = @MinCount + 1
END
4

3 回答 3

2

循环很慢。尝试在一次更新中使用连接包含相关的其他表。您的查询可能可以这样编写(不知道您的实际架构):

UPDATE PS
SET PS.ParentID = Recording.Identifier
FROM ParetnIDStaging PS
JOIN Context on (Context.ConId = PS.ConId)
JOIN Recording on (Recording.ErId = Context.ErId)
WHERE ...
于 2013-11-08T20:32:28.447 回答
0

这是因为您一次循环和更新一条记录并使用显式锁定/事务。

在不知道您的基础结构的情况下 - 我敢打赌您可以通过选择更新来做您正在尝试的事情。

于 2013-11-08T20:23:00.647 回答
0
UPDATE ParentIDStaging    
SET parentIdStaging.ParentID=recording.Identifier
from ParentIDStaging   
join Context on context.ConId = ParentIDStaging.ConId
join recording on contect.erid=recording.erId
WHERE   parentIdStaging.ContentType = 'grid'
AND parentidStaging.Type='grid'
于 2013-11-08T20:31:52.457 回答