1

我有一个大约 30,000,000 行的表,我需要对其进行迭代,单独操作每一行的数据,然后将行中的数据保存到本地驱动器上的文件中。

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

编辑澄清:

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

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

4

5 回答 5

2

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

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

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

于 2009-10-17T03:14:48.513 回答
1

您可以尝试使用 rownum 查询来抓取块,直到您抓取不存在的块为止。

这是一篇关于 rownum 查询的好文章: http ://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html

如果您不想阅读,请直接跳至末尾的“使用 ROWNUM 分页”部分以获取示例查询。

于 2009-10-17T00:47:26.327 回答
1

我最初的解决方案是做这样的事情,因为我可以访问一个 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.

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

于 2009-10-17T01:10:32.607 回答
0

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

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

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

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

于 2009-10-17T00:52:45.087 回答
0

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

于 2009-10-17T01:23:46.720 回答