具有子查询性能的SQL Server更新

时间:2017-08-17 15:14:57

标签: sql sql-server

为什么此查询使用临时表来显示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)

1 个答案:

答案 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中给定行的许多重复记录。