Есть две таблицы, Costs
и Logs
. Данные в таблице Costs
могут содержать миллионы строк, а в таблице Logs
— миллиарды строк.
Мне нужно обновить столбец CostBy
в таблице Costs
в сервисной задаче в производственной среде в пределах 100 записей при каждом запуске.
CREATE TABLE Cost
(
C_PK uniqueidentifier primary key not null,
C_CostBy varchar(3) not null
)
CREATE TABLE Logs
(
L_PK uniqueidentifier primary key not null,
L_ParentTable varchar(255) not null, -- Table Cost and other table's name
L_ParentID uniqueidentifier not null, -- Cost's pk and other table's pk
L_Event varchar(3) not null, -- Part are 'ADD' and other event types
L_User varchar(3) not null
)
CREATE NONCLUSTERED INDEX [L_ParentID]
ON [dbo].[Costs] ([L_ParentID] ASC)
Вот исходное заявление об обновлении:
UPDATE TOP(100) Costs
SET CostBy = ISNULL(L_User, '~UK')
FROM Costs
LEFT JOIN Logs ON L_ParentID = C_PK AND L_Event = 'ADD'
WHERE CostBy = ''
Однако заявление, представляющее серьезную проблему с производительностью, высокую стоимость сканирования таблицы в таблице Costs
.
Мой вопрос: как избежать сканирования таблицы в таблице Costs
или как оптимизировать оператор обновления?
Заранее спасибо.