如何循环的所有行在一个Oracle的表吗?
题
我有一个表约30,000,000份行,我需要循环,处理数据,为每个行单独地,则保存的数据自行到文件上的一个地方驱动器。
什么是最有效的方式,通过循环中的所有行表使用SQL Oracle?我已经google搜索但可以看到没有直接的方式这样做。请帮助。请记住我不知道准确数量的排,只有一个估计。
编辑用的澄清:
我们正在使用Oracle10g我相信。行数据包含blob数据(压缩文本文件和xml文件),将读入存储器,并载入一个自定义的目的,它将更新/转换使用。净DOM访问班,rezipped,并储存到一个地方驱动器。
我没有太多的数据库的经验何-我计划使用直SQL声明ADO.Net +OracleCommands.没有性的限制,真的。这是为内部使用。我只是想做到这一可能的最佳方式。
解决方案
你需要读时30分钟的行Oracle数据库和编写出30米的文件,从Blob(一个压缩XML/文本文件中的一个BLOB列每一行?) 在每一行文件系统在当地的计算机?
显而易见的解决方案是打开一个ADO.NET 据读取器上 SELECT * FROM tbl WHERE <range>
所以你可以做的批。读BLOB从读到您API,做你的东西,并编写出的文件。我可能会尝试写的程序,以便它可以从许多计算机、每一做他们自己的范围-你的瓶颈是最有可能会被解压操纵和rezipping,由于许多消费者可能流数据,表从服务器没有明显的效果,对服务器的性能。
我怀疑你就可以做这个套基于操作的内部到Oracle数据库,并且我也将是思考文件系统和如何你都要组织这么多的文件(以及是否有空还记得大小采取了通过一个文件在文件系统始终是一甚至多个文件系统块的大小)。
其他提示
我最初的解决办法是做这样的事情,因为我已经接到一个识别号码(伪):
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.
但我觉得这可能不是最有效的或最好的方式做到这一点...
您可以尝试使用ROWNUM查询抢块,直到你抢不存在块。
这是对查询的rownum一个很好的文章: http://www.oracle.com/ technetwork /发行存档/ 2006/06-SEP / o56asktom-086197.html
如果你不喜欢读书,直接在最后一个示例查询跳转到“分页与ROWNUM”节。
它总是优选使用基于数据集的操作与大量的行工作时。
您会再享受一个性能优势。处理完数据后,你应该能够从表中的数据转储到一个文件中一气呵成。
这样做的可行性取决于需要在这些行进行处理,尽管它是在大多数情况下,能够避免使用一个循环。是否有一些具体的要求,它阻止你一次处理所有行?
如果通过行迭代是不可避免的,使用批量绑定可以是有益的:FORALL批量操作或BULK收集“选择进入”查询
这听起来像你需要整个数据集的之前您可以做任何数据操作,因为它是一个BLOB>。我只想用一个DataAdapter.Fill方法,然后通过手中的数据集中到自定义对象进行迭代,做到这一点的操作,然后写入到磁盘结束对象,然后压缩。