Если я устранении неполадок это, это то, что я бы в поисках:
- Если практичны, убедитесь никто не монополизирует таблицу (то есть, запирая его)
- Убедитесь столбцы объединения индексируются (т.е.,
ms.user_B
, amc.user_B
)
- Обновление столбцов в пакетах с использованием
UPDATE TOP (100) ms SET ...
Пункт 3 на самом деле очень важно при создании больших вставки/обновления/удаления. SQL Server генерирует журнал, чтобы отменить эту операцию, если она не работает частично, и это становится все дороже. Если вам нужно обновить ряды шириной 1 м, это может быть намного быстрее для работы по 20 рядов по 50 тыс. Строк. Я видел советы, утверждающие, что это имеет существенное различие (и это AFAICT). Кроме того, это предотвращает очередность запросов к таблице.
Но есть два оговорки: 1. Вы будете выполнять каждую партию отдельно, поэтому вы хотите убедиться, что ваша операция может терпеть «частично сделано». (Я предполагаю, что это можно просто перезапустить.) 2. Вам нужно указать, какие столбцы обновлены.
Таким образом, в вашем случае, может быть:
declare @update_date datetime;
set @update_date = getdate();
while 1 = 1
begin
update top(10000) ms set
user_B_total_duration = amc.total_duration,
last_updated = @update_date
from
monthly_statistics ms
inner join aggregate_monthly_conversations amc
on ms.user_B = amc.user_B
where
ms.last_updated < @update_date;
if @@rowcount = 0 break;
end
Вы также можете бросить в печати, чтобы сказать вам, как далеко вы находитесь.
Можете ли вы показать нам структуры таблиц и рассказать нам, какие индексы у вас уже есть? –
Также был бы полезен план выполнения. – Donnie
Я бы, но вы не принимаете ответы. – smirkingman