我有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条记录。
我写了一个像:
的sqlupdate table1
set id_3 = b.id_3
from table1
left join table2 b on id_1= b.ref_id
通过使用SQL Server,查询花费了大约16小时的时间,但仍然没有响应。如何缩短查询时间?
答案 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已经聚集,则将它们聚集在一起。
另一个重要的事情是,在您运行此更新时,表是否会看到其他流量。如果是这样,长运行时可能是由于阻塞。在这种情况下,您应该考虑批处理,即一次仅更新一小部分而不是单个语句中的所有部分。