1

我有 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 小时的时间,但仍然没有响应。如何减少查询时间?

4

3 回答 3

1

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

因此,首先添加一个索引(假设主键不是索引),ref_id然后在id_1.

为了使事情更容易监控(就进度而言),只需循环遍历表 2 中的 2700 条记录,并对每条记录(或每 10、100 条等)进行更新,以便您可以部分更新并查看它有多远.

另外,为了确保你不会做任何无用的事情,我建议添加一个and table1.id_3 <> table2.id_3

于 2013-06-22T18:23:38.010 回答
0

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

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

表 1:(id_1,id_2)上的唯一 CLUSTERED INDEX 表 2:(ref_id)上的唯一 CLUSTERED INDEX

如果它们还没有的话,基本上让你的 PK 成簇。

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

于 2013-06-23T00:07:05.003 回答
0

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

获得更新每一行的最大速度的基准的一种方法是对查询进行计时:

update table1
set id_3 = 100

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

于 2013-06-22T18:17:52.600 回答