【发布时间】:2020-07-07 20:43:41
【问题描述】:
有两个表,Costs 和 Logs。 Costs表中的数据可以是百万行,Logs表中可以是数十亿行。
我需要在生产环境中的服务任务中更新Costs 表中的CostBy 列,每次运行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表中的表扫描或者如何优化更新语句?
提前致谢。
【问题讨论】:
-
您显示的 T-SQL 无法编译,请发布正确的代码。此外,几行样本数据会很好。
-
只更新前 100 行的原因是什么?这是功能要求,还是您这样做是为了一次更新几个结果/进行多次调用?
-
这是一次性任务,还是会定期使用此代码(即是否需要每 10 分钟/每次有人执行某些操作/等时更新成本表,或者这只是纠正临时任务中的一些无效数据吗?
标签: sql-server database-performance query-performance full-table-scan