Я пытаюсь обновить столбец в таблице с ~ 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
Это потому, что вы обновляете одну запись за раз и используете явные блокировки/транзакции. – randmatt
Как говорили другие (и я собираюсь повторить) цикл, отдельные транзакции и т. Д. Все замедлят вас. Мне также интересно, если ParentIDStaging.ParentID задействован где угодно в ключе кластерного индекса. Если это так, каждое обновление (почти наверняка) вызывает каскады обновлений в ParentIDStaging, поскольку строки в таблице (даже если это только один листовой узел за раз) переупорядочены. Если это так, вам лучше сбросить и воссоздать «кластерный индекс» до/после вашего цикла. – dav1dsm1th
Опять же - я не знаю ваших данных/схемы/процесса - но мне также интересно, если ParentIDStaging.ParentID всегда ошибается (и нуждается в обновлении). Я видел такие петли раньше, когда они обновляли все записи в таблице, когда только небольшое количество новых строк имело «неправильное» значение - и просто добавляя «и ParentID <> @ ParentID» в 'where' глубокое влияние на производительность. – dav1dsm1th