【问题标题】:perl bulk select DBI IN Oracleperl 批量选择 DBI IN Oracle
【发布时间】:2013-07-29 02:10:13
【问题描述】:

需要从一个表中检索 200000 条记录,并对每条记录进行处理。数据库是oracle。目前使用 fetch_rowarrayref 方法并对每条记录进行处理。对于大量记录,设置 5000 条记录和循环的获取限制是否有效。 Mysql 有一个 LIMIT 关键字,但 oracle 没有它。不知道如何在 dbi 中做到这一点。

将 5000 条记录提取到一个数组中 从数组中进行处理 再次抓取,直到达到 100000 条记录

【问题讨论】:

  • 不过,Oracle SQL 确实有 ROWNUM
  • 确实,Oracle 有 ROWNUM 和 ROWID 用于从特定范围内的数据库中获取特定行。
  • Oracle 的常用方法是使用带有 LIMIT 子句的 BULK COLLECT。有关示例,请参阅stackoverflow.com/questions/3865295/oracle-bulk-collect-issue。不过,我不确定这在 Perl 中是否可行。
  • 非常感谢您的链接。将尝试我是否可以从 perl 访问它

标签: sql database oracle perl


【解决方案1】:

使用分页不会比你正在做的更有效。分页的目的是避免内存不足,但如果不是(并且 Oracle 不应该使用 DBD::Oracle),那么就没有任何好处。

如果这个操作太慢,那么你有几个基本的选择。

  1. 转储更靠近数据库(延迟更少)。
  2. 选择更少的数据。
  3. 有多个进程并行查询。
  4. 使用专用的批量导出工具。
  5. 重新设定期望,这样您就可以接受它。

【讨论】:

  • 非常感谢您提供的信息。我更感兴趣的是了解 PERL DBI 中的任何特定方法,我可以使用这些方法每次获取 10000 行,而不是每次获取返回 1 行。
  • @Arav 透明地内置在幕后。请参阅search.cpan.org/~timb/DBI-1.616/DBI.pm#RowCacheSize 了解如何设置一次提取的数量。 (并非所有数据库都支持,但 Oracle 肯定支持。)
  • 非常感谢您提供的信息。将使用行缓存大小
【解决方案2】:

您的任务在获取数据并对其进行处理时看起来像分页,以编写分页类型查询

select *
 from (
select /*+ first_rows(25) */
  your_columns,
  row_number() 
  over (order by something unique)rn
 from your_tables )
where rn between :n and :m 
order by rn;

:n = 起始行 :m = 结束行 rn = 执行排序的列

更多信息可以参考link #1link #2

【讨论】:

  • 这不能回答所提出的问题。甚至没有关闭。
  • @btilly 再次阅读这个问题,他说(Mysql 有一个 LIMIT 关键字,但 oracle 没有它。不知道如何在 dbi 中做到这一点。)所以我解释一下,他如何执行首先分页并处理数据并移动到进一步的数据集....
  • 是的,我做到了。提出的问题是,分页是否更快(如果是,如何做到这一点)。答案是 NO(使这无关紧要)。
  • 非常感谢您提供的信息。我更感兴趣的是了解 PERL DBI 中的任何特定方法,我可以使用这些方法每次获取 10000 行,而不是每次获取返回 1 行。
猜你喜欢
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
相关资源
最近更新 更多