我开始了一些我认为直截了当的事情:顺序(逐行)读取,计算一些值并更新同一行,然后再继续整个表的下一行。
上下文:一个平面表,2600 万条记录,复合 PK(4 个数值)。 物理表大小 1.3 GB。处理记录的顺序无关紧要。这只会在可预见的未来进行一次。计算太复杂,无法在 SQL 中完成(至少对我来说 :-)
推荐的有效方法是什么?
我尝试了什么:使用datareader
in ADO.NET
(它不再有旧的 VB6 结果集,这本来会简单得多)。将它与每个reader.Read()
循环中的更新语句 (statement.ExecuteNonQuery) 结合起来很棘手,因为 ADO.NET 不喜欢在同一个连接上这样做。所以我不得不打开2个连接。(更新查询在 WHERE 子句中使用复合 PK,这可能会很快,但仍然让我觉得效率低下,因为光标已经在我要更新的记录上。)
这种方法有点工作,但不适用于基于SELECT * FROM MyTable
查询的阅读器。我不得不LIMIT
一次读取几千行的块以避免超时错误。根据早期的实验,我估计2600 万条记录的处理过程需要9 个小时。我将它设置为通宵运行,当我回来时,它在整个过程中再次超时三分之一。重新启动后,我发现SELECT
一旦偏移量变大,LIMIT 子句就会减慢查询速度。我对剩余 65% 的新估计超过了另外 20 小时,随着 LIMIT 偏移量的增加,可能会更长。
一定会有更好的办法!?
(我还尝试了优雅但当然超时的 EF :-)