Большой оператор обновления в SQL Server - PullRequest
0 голосов
/ 24 июня 2019

Я должен сделать заявление об обновлении таблицы с большим количеством записей в течение 3 лет, каждый месяц имеет миллион записей.

Я пытался использовать пакетный скрипт, но это занимает много времени, и я отменяю его до конца.

Не могли бы вы предложить наиболее эффективный способ решения этой задачи?

Заранее спасибо.

С уважением,

Основной код лечения:

UPDATE [XXXX_DWH].[Dwh].[Invoice]
SET OrderingCustomerCode = SUBSTRING(orderingcustomercode, 2, 7)
WHERE InvoicingYear = '2019' AND InvoicingMonth = '01'

1 Ответ

1 голос
/ 24 июня 2019

Есть несколько возможностей.Если вам нужно изменить всю таблицу, возможно, будет быстрее создать копию вашей таблицы с вашим изменением, а затем переименовать таблицу (воссоздать все индексы и т. Д., Чтобы сделать объекты одинаковыми).Если необходимо изменить только часть таблицы, вы можете вставить строки, которые вы хотите изменить, в другую таблицу, удалить эти строки из счета-фактуры и затем вставить их обратно в счет-фактуру из временной таблицы.

select col1, col2, SUBSTRING(orderingcustomercode, 2, 7) as orderingcustomercode ... the rest of columns
into [XXXX_DWH].[Dwh].[Invoice_temp]
from [XXXX_DWH].[Dwh].[Invoice]

Только обновлениескажем, 100 000 за один раз также должно быть хорошим вариантом, но если у вас есть миллионы строк в индексе columnstore, первый подход, на мой взгляд, лучше.Пакеты уменьшают журналы транзакций, генерируемые обновлением.Также было бы хорошо разрешить серверу sql выполнять поиск в этом where InvoicingYear='2019' and InvoicingMonth='01', т.е. иметь разделение на InvoiceDate.

DECLARE @output INT = 1

while @output > 0
begin
with cte as 
    (select top 100000 *
    from [XXXX_DWH].[Dwh].[Invoice]
    where InvoicingYear='2019' and InvoicingMonth='01')
update cte
set OrderingCustomerCode=SUBSTRING(orderingcustomercode,2,7)

SET @output = @@ROWCOUNT

end
...