0

我们有 2 个名为TableToUpdateDates的表。我们需要通过查看其他表Dates来更新TableToUpdate的 EndTimeKey 列。我们在下面运行 sql 来执行此操作,但需要很长时间才能完成。

TableToUpdate有 6M 条记录。表日期有 5000 条记录。

我们如何优化它?

感谢您的回复!

update TableToUpdate set
EndTimeKey = DATE_NO
from Dates where EndTime = DATE
4

4 回答 4

2

您可能正在更新 600 万条记录,无论如何这都不会非常快。但是,请查看您的执行计划,看看它是否使用索引。

也可以批量运行,在更新大量记录时通常更快。在数据库负载很小的下班时间进行更新,这将减少潜在的锁定问题。确保两个表之间的数据类型相同,这样您就不必进行任何隐式转换。

看看你正在更新的表,上面有没有触发器?根据触发器的编写方式,这可能会严重减慢许多记录的更新速度(特别是如果不太聪明的人决定在触发器中放置游标或循环而不是编写基于集合的代码)。

这里还有一些我要添加的东西(我也改变了它显示明确显示加入)

update t
set EndTimeKey = DATE_NO
from TableToUpdate t
Join Dates D on t.EndTime = d.DATE
where EndTimeKey <> DATE_NO

更新已经匹配的记录没有意义。

于 2009-02-06T16:13:51.843 回答
1

有了这么多数据,您最好创建一个 SELECT 查询,该查询会生成一个包含更新值的结果集,因为您希望看到新表。接下来,通过创建表并使用 INSERT INTO 或通过更改 SELECT 添加 INTO 来创建新表,将这些选择到新表中(可能是 'NewTableToUpdate')。

Next use sp_rename to rename 'TableToUpdate' to 'OLDTableToUpdate' and 'NEWTableToUpdate' to 'TableToUpdate' and then create the indexes as you had them on the original table.

In my experience I've found this to be the quickest means of acheiving big changes like this. HTH.

Extra thought... if you have a clustered index on your table then add an ORDER BY to your SELECT statement to ensure it is inserted into your new table in the same sequence as the clustered index. That'll speed up the index creation in a significant way.

于 2009-02-06T18:33:07.647 回答
0

您可以在相关字段上设置一些索引(按相关顺序),即:endtimekey 和 endtime。不要期望太多。您可以检查的另一件事是您是否有其他限制来限制查询结果。

您还可以创建一个视图,为每个 tabletoupdate.endtimekey 返回正确的 date_no。

如果您的 dbms 确实支持这些东西,也许您可​​以编写一个存储过程 - 因为这确实会加速更新。

于 2009-02-06T09:43:40.990 回答
0

我在这里注意到几件事,EndTimeKey 真的是关键吗?如果是这样,它可能有一个索引,如果是这样,速度(或缺乏)将更新索引,同时也进行数据的实际更新,解决方案删除索引,运行更新重新应用索引。

另一个问题可能是 Sql 的事务性质 - 当您执行此更新时,它将记录每个更改,以便在发生故障时回滚。此更新看起来非常简单,因此您可以分批应用它,即

update TableToUpdate setEndTimeKey = DATE_NOfrom Dates where EndTime = DATE
where TableToUpdateId between 1 and 100000

这会将您的更新分成可管理的大小块 - 至少您会知道每个块需要多长时间。

另一种选择是在 EndTime 列上放置一个索引,可能它必须进行全表扫描。

真正的答案是查看正在生成的查询计划。正如您所看到的,查询可能运行缓慢的原因有很多——这些只是一些需要快速检查的原因。

于 2009-02-06T09:43:54.187 回答