Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 一次只选择一组特定的行_Sql_Database_Select_Informix - Fatal编程技术网

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

Sql 一次只选择一组特定的行,sql,database,select,informix,Sql,Database,Select,Informix,我需要从一个表中选择数据并将其插入到另一个表中。目前,SQL的外观如下所示: INSERT INTO A (x, y, z) SELECT x, y, z FROM B b WHERE ... 但是,SELECT非常庞大,导致超过200万行,我们认为它占用了太多内存。Informix(本例中的db)在运行查询时会耗尽虚拟内存 如何选择和插入一组行(比如2000行)?考虑到我不认为有任何行ID等。您可以从表中选择FIRST n*。其中n是所需的行数,例如2000。此外,在

我需要从一个表中选择数据并将其插入到另一个表中。目前,SQL的外观如下所示:

   INSERT INTO A (x, y, z)
   SELECT x, y, z
   FROM B b
   WHERE ...
但是,SELECT非常庞大,导致超过200万行,我们认为它占用了太多内存。Informix(本例中的db)在运行查询时会耗尽虚拟内存


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

您可以从表中选择FIRST n*。其中n是所需的行数,例如2000。此外,在WHERE子句中,执行一个嵌入式select,检查要插入的表中是否存在行。因此,下次运行该语句时,它将不包括已插入的数据。

我假设您有一些脚本,可以从中执行该语句吗?只要对嵌套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

我几乎可以肯定,IDS只允许您使用第一个子句将数据返回到client1,如果可能的话,这是您希望避免的

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

这部分取决于您的数据集有多大,以及约束是什么——为什么要跨表加载。但我通常的目标是确定一种将数据划分为可加载子集的方法,并在循环中按顺序运行这些子集。例如,如果序列号介于1和10000000之间,我可能会运行循环十次,条件是序列号
和seqnum>=0和seqnum<1000000',然后
和seqnum>=1000000和seqnum<2000000',最好使用能够通过变量替换范围的语言

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



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

请尝试
首先
LIMIT
是一个受支持的同义词10+:yep,将其与
skip
结合使用,可以在循环中迭代整个集合。。(如果您知道行的总数)如果表B发生更改,您是否有跳过尚未复制的行的风险?我知道我没有提到表B可以更改,在我的情况下可能不会,但我只是在这里大声思考。这听起来不错。如何编写循环直到select不返回任何行的select循环?请使用NOT EXISTS函数确保插入的行在新表中不存在。