如何快速将数据更新到临时表

时间:2018-02-22 11:28:29

标签: sql sql-server sql-server-2012

我正在处理存储过程,其中我有一个带

的临时表
DECLARE @DM_BR_ABC TABLE (PK,Column1,Column2,...Column40)

在第一次qry中,我在此之后插入了20万条记录。

之后我还有另一张桌子

DECLARE  @DM_BR_XYZ (PK,Column1,Column2)

此表由另一个Query填充 有20万条记录 至此,没有与性能相关的问题..................... 在此之后我正在更新表@DM_BR_ABC像这样

 Update A  set A.Column2 =B.Column2 from @DM_BR_ABC A ,@DM_BR_XYZ B
 where A.Column1 =B.Column1

我在这里遇到了这个问题。这个sql语句花了太多时间2-3小时来更新....我在商店程序的开始尝试了许多解决方案,例如SET NOCOUNT ON,但它不起作用 我正在使用Ms SQL Server 2012 所以需要帮助.....

2 个答案:

答案 0 :(得分:1)

首先,我建议使用显式join编写查询:

Update A
    set A.Column2 = B.Column2
    from @DM_BR_ABC A join
         @DM_BR_XYZ B
         on A.Column1 = B.Column1;

现在,column1不是B中的主键,因此可能会有很多匹配。你可以试试:

Update a
    set Column2 = b.Column2
    from @DM_BR_ABC a join
         (select column1, max(column2) as column2
          from @DM_BR_XYZ b
          group by column1
         ) b
         on a.Column1 = b.Column1;

或者,您可以在column1上添加索引。显然,唯一索引不会,但您可以在(column1, pk)上定义唯一索引。

您可以通过执行以下操作查看正在处理的行数:

select sum(cnt)
from @DM_BR_ABC a join
     (select column1, max(column2) as column2, count(*) as cnt
      from @DM_BR_XYZ b
      group by column1
     ) b
    on a.Column1 = b.Column1;

这可能会让您真正了解正在完成的工作量。

答案 1 :(得分:1)

您可以在表变量的column1上声明主键和/或唯一约束,SQL Server 可能会使用它来通过利用基础索引来提高性能,以实现更高效的数据访问由于基数已知,因此可以产生更好的计划。

但是,表变量索引没有统计信息,因此SQL Server在编译期间估计单行。对于像这样的大量行,使用临时表而不是表变量可能会获得更好的性能,尤其是如果在连接列上有聚簇索引(如果可能,则为唯一)。请注意,如果column1不是唯一的,您可能无法获得预期的结果。