将行插入表中的限制(Oracle)

时间:2013-11-28 15:53:49

标签: sql oracle

在Oracle pl / sql中,我连接了几个表并插入到另一个表中,这将导致数千/ Lakhs或者可能是数百万。可以插入

insert into tableA
select * from tableB;

是否因为行数而有失败的可能性? 或者,如果没有更多记录,是否有更好的方法来插入值。

先谢谢

3 个答案:

答案 0 :(得分:2)

嗯,机器内部的一切都是有限的,所以如果那个选择返回太多行,那肯定是行不通的(尽管必须有maaany行,这个数字取决于你的存储和内存大小,你的操作系统,也许还有其他事情。)

如果您认为您的查询可以超过限制,则批量插入,并在每批后提交。当然,您需要知道,如果您决定需要取消该过程的50%的插入内容必须执行某些操作(因为rollback在此处没有用处)。

答案 1 :(得分:1)

我建议的步骤有所不同,因为当您使用SQL或PL / SQL在一个SQL语句中加载更多数据时,性能通常会提高:

  1. 我建议您检查回滚段(RBS段)的大小,并可能为此类交易带来更大的专用段。
  2. 对于插入,您可以说“回滚消耗”=“插入的数据量”。您知道数据库统计信息的典型行宽(请参阅analyze table tableB compute statistics for table for all columns for all indexes之后的user_tables)。
  3. 确定每次迭代可插入的行数。
  4. 在big insert and commit中插入此数据量。
  5. 重复。
  6. 正常锁定不是插入的问题,因为不存在的内容无法锁定: - )
  7. 在分区表上运行时,您可能需要考虑允许(子)分区将工作分布在一起的不同方案。通过从文本文件加载来使用SQL * Loader时,您可能也使用不同的方法,例如直接路径将预格式化的数据块添加到数据库而不使用SQL引擎,而不是让RDBMS处理SQL。

答案 2 :(得分:0)

要创建有限数量的行,您可以使用ROW_NUM这是一个伪列。

例如,从另一个表中创建10,000行的表,可以使用50,000行。

insert into new_table_name select * from old_table_name where row_num<10000;