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

一次只能选择一组特定的行

  •  2
  • rouble  · 技术社区  · 16 年前

    我需要从一个表中选择数据并将其插入到另一个表中。当前SQL看起来如下所示:

       INSERT INTO A (x, y, z)
       SELECT x, y, z
       FROM B b
       WHERE ...
    

    但是,SELECT是巨大的,导致超过200万行,我们认为它占用了太多内存。Informix,即本例中的db,在运行查询时耗尽了虚拟内存。

    如何选择和插入一组行(比如说2000行)?考虑到我不认为有任何行ID等。

    3 回复  |  直到 16 年前
        1
  •  3
  •   northpole    16 年前

    您可以从表中选择第一个n*。其中n是所需的行数,例如2000行。此外,在Where子句中执行一个嵌入式select,该select检查要插入的表中已有的行。以便下次运行语句时,它不会包含已插入的数据。

        2
  •  0
  •   Randy Simon    16 年前

    我假设你有执行这个的脚本?只要对嵌套select返回的值进行排序,就可以循环和限制。下面是一些伪代码。

    total = SELECT COUNT(x) FROM B WHERE ...
    while (total > 0) 
      INSERT INTO A (x, y, z) SELECT x, y, z FROM B b WHERE ... ORDER BY x LIMIT 2000
      total = total - 2000
    end
    
        3
  •  0
  •   Jonathan Leffler    16 年前

    我几乎可以肯定,IDS只允许您使用第一个子句,将数据返回给客户机 1.

    你说你得到了一个内存不足的错误(而不是一个长事务中止的错误)?您是否查看了服务器的配置以确保其具有合理的内存量?

    AND seqnum >= 0 AND seqnum < 1000000' and then 和seqnum>=1000000和seqnum<2000000'等,最好使用能够通过变量替代范围的语言。

    这有点麻烦,而且您希望在范围大小方面犯保守的错误(使用更小的分区,而不是更少的更大的分区,以减少内存不足的风险)。


    稍微简化一下。例如,存储过程必须算作“客户机”,并且存储过程中的通信成本(很多)要比转到真正的客户机的成本低。