【发布时间】:2015-06-21 04:28:26
【问题描述】:
我有一个类似下面的 SQL 表:
id | text | other_columns...
----------------------------
0 | a | ...
1 | b | ...
2 | c | ...
我需要对text 列中的值应用一些复杂的操作,然后用新值更新这些字段。
// Get all the current values.
entries = SELECT id,text FROM foo_table;
// Apply some complex operation to the text values (this part is Python, not SQL).
foreach entry in entries
entry.text = f(entry.text)
// Update the text fields (1 UPDATE per entry).
foreach entry in entries
UPDATE foo_table SET text=entry.text WHERE id=entry.id;
这会产生一个像这样的表格,其中包含更新的文本值:
id | text | other_columns...
----------------------------
0 | x | ...
1 | y | ...
2 | z | ...
每次更新大约需要 1 毫秒,我有大约 500 万个条目,这会导致大约 8 分钟的执行时间。我正在批处理 SQL 命令(一次 1000 个),但这似乎仍然很慢/效率低。
有没有更好(更快)的方法来做到这一点?谢谢。
【问题讨论】:
-
复杂的操作是什么(如果你能告诉我们)?也许它可以在 SQL 中完成,这肯定会加快速度。
-
你能提供显示索引的数据创建stmt
-
@PabloGonzálezAlba “复杂操作”正在执行一系列自定义字符串标记化/替换和引用外部数据源。不幸的是,它不能在 SQL 中完成(即使可以完成,在 SQL 中重新实现也非常昂贵)。
-
@DrewPierce 不确定我是否理解您的要求。你是说数据类型吗?
id是int/primary key,text是varchar。表中有许多具有不同数据类型的附加列。 -
@smg 好的。您应该确保
id字段有一个索引,您可以查看this answer 以一次性发送所有语句,看看它是否有帮助。我想不出任何其他改进。