昨天我问question如何重写SQL以批量进行选择和插入。我需要这样做以尝试消耗更少的虚拟内存,因为我需要在这里移动数百万行。
对象是将表B中的行移动到表A中。以下是我可以想到的方法:
SQL#1)
INSERT INTO A (x, y, z)
SELECT x, y, z
FROM B b
WHERE ...
SQL#2)
FOREACH SELECT x,y,z INTO _x, _y, _z
FROM B b
WHERE ...
INSERT INTO A(_x,_y,_z);
END FOREACH;
以上是否有任何错误? 该数据库是Informix 11.5。
更新
原来还有其他因素导致IDS消耗了大量的内存。上面的代码导致内存超过分配的阈值。在这一点上,我没有看到使用一种方法而不是另一种方法。
答案 0 :(得分:1)
瓶颈将是事务日志磁盘空间(或等效磁盘空间),以便在需要时进行回滚。
我从来没有想过任何单一陈述或操作的内存。如初。
答案 1 :(得分:0)
由于大多数SQL都是伪代码(对于存储过程而不是工作代码)(数字2,3和4需要VALUES子句才有效),因此它们可能没问题。 4号需要仔细注意才能正确完成工作 - 我开始写'4号错了'但后来意识到其他的都是非工作的SQL。
除了遇到内存问题之外,第1号是最好的。鉴于您遇到内存问题,那么Number 2可能是最好的工作基础。如果记录了数据库,我会考虑使用游标“FOR HOLD”放入子事务。如果数据库未记录,则无需担心事务大小;每个INSERT都是原子的。
我在回答您的其他问题时指出,您可能需要查看服务器配置,以了解内存耗尽的原因。 (考虑订阅IIUG - International Informix Users Group(免费),并在iiug dot org'的邮件列表'ids上询问您的配置。