代码之家  ›  专栏  ›  技术社区  ›  rouble

哪个SQL占用更少的内存?

  •  1
  • rouble  · 技术社区  · 15 年前

    昨天我问了一个 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。

    更新:

    结果发现还有其他原因导致ID消耗了大量的内存。上面的代码导致内存超过了分配的阈值。在这一点上,我不认为使用一种方法胜过另一种方法。

    2 回复  |  直到 12 年前
        1
  •  0
  •   Jonathan Leffler    15 年前

    由于大多数SQL都是伪代码(对于存储过程),而不是工作代码(您需要数字2、3和4的values子句才有效),所以它们可能是正常的。4号需要仔细注意才能正确完成任务-我开始写“4号错了”,但后来意识到其他的都是不工作的SQL。

    除了遇到内存问题,1号最好。考虑到您遇到内存问题,那么数字2可能是工作的最佳基础。如果数据库被记录,我会考虑使用光标“for hold”放入子事务。如果数据库被卸载,那么就不需要担心事务大小;每个插入都是原子的。

    我在回答您的另一个问题时注意到,您可能需要查看您的服务器配置,以了解它为什么会耗尽内存。(考虑订阅 IIUG - International Informix Users Group (免费)并询问邮件列表“ids at iiug dot org”上的配置。

        2
  •  1
  •   gbn    15 年前

    瓶颈将是事务日志磁盘空间(或等效空间),以便在需要时进行回滚。

    我从来没有考虑过任何单个语句或操作的内存。曾经。