【问题标题】:limit to insert rows into a table (Oracle)限制向表中插入行(Oracle)
【发布时间】:2017-03-20 20:06:29
【问题描述】:

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

insert into tableA
select * from tableB;

是否会因为行数而失败? 或者在没有更多记录的情况下是否有更好的方法来插入值。

提前致谢

【问题讨论】:

  • 一个使用关系数据库,这样您就不必通过将数据规范化到单独的表中来重复数据,并根据需要使用过滤器将它们连接起来。创建产品表与此理念背道而驰。如果您想混淆连接,请使用 VIEW 而不是创建另一个表。
  • 这是一个生产系统吗?如果以后发生介质故障,是否需要从以前的备份中恢复数据?你有足够的磁盘空间吗?
  • @David:是的,它是一个生产系统。我们的记录最多是十万,而不是百万。

标签: sql oracle


【解决方案1】:

好吧,机器内部的一切都是有限的,所以如果该选择返回太多行,它肯定不会工作(虽然必须有 maaany 行,数量取决于您的存储和内存大小,您的操作系统,也许还有其他事情)。

如果您认为您的查询可以超过限制,则分批进行插入,并在每批之后提交。当然,您需要注意,如果在 50% 的插入中您决定需要取消该过程(因为 rollback 在这里没有用处),您必须做一些事情。

【讨论】:

  • 我们可以使用批量收集选项吗?
  • 对于 BULK,您需要首先将所有内容放入一个变量中,因此,如果您有太多行,如果您尝试在一次调用中执行此操作,则会遇到问题。我建议你检查一下你是否真的有大量的行,也许你低估了你的系统(因为在某些机器设置中,即使是数百万行对于 Oracle 来说也是一项简单的任务)。如果您没有低估它,那么请确定:通过提交每 X 行来进行批量插入。
  • 我看不出结果集的最大大小是如何依赖于操作系统的……也许是内存,当然还有可用的磁盘空间。
  • @DavidAldridge 我在考虑进程可以维护的最大内存数据。但也许我错了,因为这个问题有解决方法,这更像是一个猜测。
【解决方案2】:

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

  1. 我建议检查您的回滚段(RBS 段)的大小,并可能为此类事务在线设置一个更大的专用段。
  2. 对于插入,您可以说“回滚消耗”=“插入的数据量”。您可以从数据库统计信息中了解典型的行宽(参见analyze table tableB compute statistics for table for all columns for all indexes 之后的 user_tables)。
  3. 确定每次迭代可以插入多少行。
  4. 在大插入中插入此数量的数据并提交。
  5. 重复。
  6. 锁定通常不是插入的问题,因为尚不存在的内容无法锁定:-)

在分区表上运行时,您可能需要考虑允许(子)分区一起分配工作的不同场景。通过从文本文件加载使用 SQL*Loader 时,您也可以使用不同的方法,例如直接路径,它在没有 SQL 引擎的情况下将预格式化的数据块添加到数据库,而不是让 RDBMS 处理 SQL。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 2016-07-07
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多