Я не выполнял такого рода обработку в SQL Server, поэтому не уверен, что совет полностью применим. Но я достаточно уверен, чтобы предложить вам попробовать.
Что я обычно делаю в Oracle, так это полностью избегаю обновлений при обработке ВСЕХ строк в ситуации, подобной той, которую вы описываете (однопользовательский, пакетное событие).
Либо я перенесу логику из оператора обновления обратно в оператор, который вставил строки. Или, если это невозможно, я создаю новую таблицу и помещаю логику обновления в список выбора. Например, вместо того, чтобы делать
UPDATE [dbo].[stage_table]
SET [column2] = SUBSTRING([column1], 1, CHARINDEX('.', [column1])-1);
Я бы сделал:
create table stage_table2 as
select column1
,substring(column1, 1, charindex('.', column1)-1) as column2
,column3
,column4
from stage_table;
drop table stage_table;
alter table stage_table2 rename to stage_table;
-- re-create indexes and constraints, optionally gather statistics
Я мог бы также сделать это с параллельным запросом и опцией nologging, чтобы генерировать очень мало повторов и вообще не отменять, что превзошло бы оператор обновления с таким большим запасом, что это даже не смешно :) Конечно, это из-за внутренних компонентов Oracle , но я думаю, что можно было бы реплицировать его и с SQL Server.
В вашем описании есть что-то, что может сделать этот подход менее эффективным. У вас было несколько действительно больших текстовых столбцов, которые вам нужно было бы «перетащить» в операторе CTAS.
Кроме того, вам необходимо изучить настройку вашего оборудования, поскольку оно не подходит для работы с объемом данных, которые вы на него выбросили. Либо что-то не так с конфигурацией, либо у вас много других действий:
Я вижу, что есть постоянное чтение
скорость 5 МБ / с и скорость записи 10 МБ / с
в файл .mdf.
Я могу победить это на двухлетнем ноутбуке моей подруги. При скорости чтения 5 МБ / с и таблице в 150 ГБ сканирование одной таблицы займет 8,5 часов. Предполагается, что база данных добавляет 0% накладных расходов, что составляет , а не .