2013-11-08 5 views
0

Я пытаюсь обновить столбец в таблице с ~ 90 000 строк. Есть ли оптимизированный способ обновления таблицы?Обновление Большое количество строк в sql-сервере

Я добавил необходимые индексы .. так что никаких сканирований/поиска таблицы не происходит. Но все же требуется много времени для запуска (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 
+1

Это потому, что вы обновляете одну запись за раз и используете явные блокировки/транзакции. – randmatt

+0

Как говорили другие (и я собираюсь повторить) цикл, отдельные транзакции и т. Д. Все замедлят вас. Мне также интересно, если ParentIDStaging.ParentID задействован где угодно в ключе кластерного индекса. Если это так, каждое обновление (почти наверняка) вызывает каскады обновлений в ParentIDStaging, поскольку строки в таблице (даже если это только один листовой узел за раз) переупорядочены. Если это так, вам лучше сбросить и воссоздать «кластерный индекс» до/после вашего цикла. – dav1dsm1th

+0

Опять же - я не знаю ваших данных/схемы/процесса - но мне также интересно, если ParentIDStaging.ParentID всегда ошибается (и нуждается в обновлении). Я видел такие петли раньше, когда они обновляли все записи в таблице, когда только небольшое количество новых строк имело «неправильное» значение - и просто добавляя «и ParentID <> @ ParentID» в 'where' глубокое влияние на производительность. – dav1dsm1th

ответ

0

Это потому, что вы перекручивание и обновление одной записи в то время, и используя явные замки/транзакции.

Не зная вашей базовой структуры - я бы поспорил, что вы можете делать то, что вы пытаетесь сделать с помощью обновления.

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' 
2

Looping is slow. Попробуйте сделать это в одном обновлении, включив соответствующие другие таблицы, используя объединения. Ваш запрос может быть написан таким образом (не знаю вашу фактическую схему):

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 ... 
Смежные вопросы