【问题标题】:Which SQL consumes less memory?哪个 SQL 消耗的内存少?
【发布时间】:2012-10-09 07:44:02
【问题描述】:

昨天我向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 消耗了大量内存。上面的代码导致内存超过分配的阈值。在这一点上,我没有看到使用一种方法优于另一种方法的意义。

【问题讨论】:

  • 你试过测量每一个吗?
  • 这是微优化大赛吗?请原谅这个幽默,但这似乎是一个奇怪的问题......我也这样做,“移动”数百万行,虚拟内存管理细节在我的优化问题中并不经常出现。

标签: sql database syntax informix


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    由于大多数 SQL 是伪代码(用于存储过程)而不是工作代码(数字 2、3 和 4 需要 VALUES 子句才能有效),所以它们可能没问题。数字 4 需要特别注意才能正确完成工作 - 我开始写“数字 4 是错误的”,但后来意识到其他的 SQL 也都无法正常工作。

    除非您遇到内存问题,否则最好使用 1 号。鉴于您遇到了内存问题,那么数字 2 可能是最好的工作基础。如果记录了数据库,我会考虑使用游标“FOR HOLD”放入子事务。如果数据库未记录,则无需担心事务大小;每个 INSERT 都是原子的。

    我在回答您的其他问题时指出,您可能需要查看服务器配置以了解内存不足的原因。 (考虑订阅IIUG - International Informix Users Group(免费)并在邮件列表“iiug dot org 的ids”上询问您的配置。

    【讨论】:

    • 我正在运行 IDS 11.5,如果我在这件事上喘不过气来,它似乎内存不足。无论如何,从一些简短的实验来看,你所说的都是正确的。 2 号似乎让系统运行时间更长。此外,我必须在事务之外不记录此操作。关于如何分析一种方法相对于另一种方法的内存使用情况的任何提示?
    • @prmatta:您是如何调整系统配置的?我强烈怀疑您设置了一些功能不足的默认值,您需要增加它们。但是,这不是进行该讨论的最佳场所 - ids@iiug.org 邮件列表或 comp.databases.informix 新闻组更接近正确。邮件列表已“关闭”;只有会员可以发送给它。但是订阅 IIUG 是免费且非侵入性的(每月几封电子邮件 - 可能是两到四封 - 除了您注册的邮件列表)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 2013-06-13
    • 1970-01-01
    • 2010-09-06
    • 2023-03-18
    相关资源
    最近更新 更多