我正在处理存储过程,其中我有一个带
的临时表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
所以需要帮助.....
答案 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不是唯一的,您可能无法获得预期的结果。