Обновление большого количества строк стоит дорого. Первым делом проверьте, обновляете ли вы каждую строку только один раз:
select s.item_ID, count(*)
from suppTB s
group by s.item_ID
having count(*) > 1
order by count(*) desc;
Если при этом возвращаются какие-либо строки, у вас есть несколько обновлений для одной и той же строки. И это удар по производительности. Вы должны исправить бизнес-логику c. Но вы можете поместить произвольное совпадающее значение в каждую строку:
UPDATE o
SET suppID = s.suppID
FROM ordersTB o CROSS APPLY
(SELECT TOP (1) s.*
FROM suppTB s
WHERE o.itemID = s.itemID
)
WHERE o.suppID is null;
Если это не решит проблему, вам, вероятно, потребуется перезагрузить таблицу. Логика c выглядит примерно так:
select . . . , -- all columns except suppId
s.suppId
into temp_ordersTb
from ordersTb o left join
suppTb s
on o.itemID = s.itemID;
truncate table ordersTb;
insert into ordersTb (. . .)
select . . .
from temp_ordersTb;
Конечно, прежде чем делать это, обязательно сделайте резервную копию своих таблиц!