使用左连接更新表时,最小化时间

时间:2013-06-22 18:11:55

标签: sql-server performance sql-update

我有2个表,如:

-table1: id_1, id_2, id_3, ref_id (id_1, id_2 is pk)
-table2: ref_id, id_4

我希望id_3字段应该等于table2的id_4(ref_id是主键) table1有大约600万条记录,table2有大约2700条记录。

我写了一个像:

的sql
update table1
set id_3 = b.id_3
from table1 
left join table2 b on id_1= b.ref_id

通过使用SQL Server,查询花费了大约16小时的时间,但仍然没有响应。如何缩短查询时间?

3 个答案:

答案 0 :(得分:1)

听起来确实花了很长时间,但缺乏指数可能是其原因。如果没有索引,数据库基本上必须遍历6M记录表中每条记录的2700条记录。

首先在ref_id上添加索引(假设主键不是索引),并在id_1上添加索引。

为了使事情更易于监控(就进度而言),只需循环浏览表2中的2700条记录并对每条记录进行更新(或每10,100等等),这样您就可以更新部分并查看如何它得到了。

另外,为了确保您没有做任何无用的事情,我建议您添加and table1.id_3 <> table2.id_3

答案 1 :(得分:0)

无论如何,更新600万行表中的每一行都可能会很慢。

获得每行更新最大速度的基准测试的一种方法是查询时间:

update table1
set id_3 = 100

另外,您是否需要更新table1中table2中没有匹配行的行?在这种情况下,将左外连接切换到内连接将大大提高性能。

答案 2 :(得分:0)

要回答这个问题,我们真的需要知道两个表上的聚簇索引是什么。我可以建议聚簇索引使这个特定查询快速,但是,在选择聚簇索引时应该考虑其他因素。

考虑到这一点,看看这些索引是否有帮助:

table1:UNIQUE CLUSTERED INDEX on(id_1,id_2) table2:UNIQUE CLUSTERED INDEX on(ref_id)

基本上,如果PK已经聚集,则将它们聚集在一起。

另一个重要的事情是,在您运行此更新时,表是否会看到其他流量。如果是这样,长运行时可能是由于阻塞。在这种情况下,您应该考虑批处理,即一次仅更新一小部分而不是单个语句中的所有部分。