为什么此查询使用临时表来显示ID列表,然后更快地运行后续更新
DECLARE @temp TABLE
(
id int
);
INSERT INTO
@temp
select a.Id from aa a
inner join bb b on b.id = a.source_id
inner join cc c on c.document_id = a.id
update aa set updated_at = GETDATE()
where id in (select * from @temp)
与使用子查询选择需要更长时间的ID列表的UPDATE
查询相比。
update aa set updated_at = GETDATE()
where id in (select a.Id from aa a
inner join bb b on b.id = a.source_id
inner join cc c on c.document_id = a.id)
答案 0 :(得分:1)
为什么要重复子查询中的aa
表?这会做同样的事吗?
update aa
set updated_at = GETDATE()
where a.source_id in (select b.Id
from b.id join
cc c
on c.document_id = a.id
);
可能存在不一样的情况,但我猜这是逻辑。
此外,您可以在没有子查询的情况下编写此内容:
update a
set updated_at = GETDATE()
from aa a inner join
bb b
on b.id = a.source_id inner join
cc c
on c.document_id = a.id;
我希望它具有良好的性能 - 除非连接导致aa
中给定行的许多重复记录。