2009-10-17 122 views
0

我有一个约30,000,000行的表,我需要迭代,单独处理每行的数据,然后将行中的数据保存到本地驱动器上的文件。如何遍历Oracle表中的所有行?

什么是使用SQL for Oracle循环遍历表中所有行的最有效方法?我一直在谷歌搜索,但可以看到没有直接的方式做到这一点。请帮忙。请记住,我不知道确切的行数,只是估计。

编辑澄清:

我相信我们正在使用Oracle 10g。行数据包含blob数据(压缩文本文件和xml文件),将读入内存并加载到自定义对象中,然后使用.Net DOM访问类更新/转换,重新压缩并存储到本地驱动器。

我没有太多的数据库经验 - 我计划在ADO.Net + OracleCommands中使用直接的SQL语句。没有性能限制。这是供内部使用的。我只是想以最好的方式做到这一点。

+1

你需要对数据做什么样的操作?很可能你可以在某种查询中做到这一点,但你应该提供更多信息。 – twolfe18 2009-10-17 00:48:25

+0

您需要提供更多信息。你打算使用PL/SQL,Pro * C还是OCI?或者你的操作很简单,你可以在查询中完成,然后将结果导出到文件中?更多信息将产生更好的答案。 – EvilTeach 2009-10-17 00:54:49

+0

另外,有没有性能限制?你使用的是什么版本的oracle?输出文件需要什么格式?之后会对文件做些什么? – EvilTeach 2009-10-17 00:56:26

回答

2

您需要从Oracle数据库读取30m行,并将每行中的BLOBs(每行一个BLOB列中的一个压缩XML /文本文件?)中的30m文件写入本地计算机上的文件系统?

显而易见的解决方案是在SELECT * FROM tbl WHERE <range>上打开一个ADO.NET DataReader,以便您可以执行批处理。从阅读器读取BLOB到你的API中,做你的东西并写出文件。我可能会尝试编写这个程序,以便它可以从多台计算机上运行,​​每台计算机都有自己的范围 - 您的瓶颈很可能是解压缩,操纵和重新分区,因为许多消费者可能会从该表中传输数据该服务器对服务器性能没有明显影响。

我怀疑你能用Oracle数据库内部的基于集合的操作来做到这一点,我也会考虑文件系统以及你将如何组织如此多的文件(以及你是否拥有空间 - 请记住文件系统上文件占用的大小始终是文件系统块大小的偶数倍)。

+0

这就是我最初想到的,我只是想先与更多的经验进行核对。谢谢! – JimDaniel 2009-10-17 04:06:29

0

处理大量行时总是最好使用基于集合的操作。

您将享受性能优势。处理完数据后,您应该能够一次性将表中的数据转储到文件中。

这种可行性取决于您需要在行上执行的处理,尽管在大多数情况下可以避免使用循环。是否有一些特定要求阻止您一次处理所有行?

如果迭代遍历行是不可避免的,那么使用批量绑定可能是有益的:FORALL批量操作或BULK COLLECT用于“select into”查询。

0

我最初的解决办法是做这样的事情,因为我有机会获得一个ID号(伪):

  int num_rows = 100; 
      int base = 0; 
      int ceiling = num_rows; 

      select * from MY_TABLE where id >= base and id < ceiling; 
      iterate through retrieved rows, do work, 
      base = ceiling; 
      ceiling += num_rows; 
      select * from MY_TABLE where id >= base and id < ceiling; 
      iterate through retrieved rows, do work, 
      ...etc. 

但我觉得这可能不是最有效的还是做它最好的方法...

0

这听起来像你需要整个数据集之前你可以做任何数据操作,因为它是一个BLOB>。我只需使用DataAdapter.Fill,然后将数据集交给自定义对象进行迭代,然后进行操作,然后将最终对象写入磁盘,然后将其压缩。

+0

每行的blob是一个独立的zip文件,需要读入内存,更新,然后重新压缩并保存到本地驱动器。如果是这种情况,您是否仍然推荐DataAdapter.Fill? – JimDaniel 2009-10-17 01:29:39

+0

不,然后我会使用一个DataReader,读取每一行,处理该行,然后移动到下一行。 – mcauthorn 2009-10-18 02:26:52