假设一个表有上千万条数据,我现在需要取出表中所有记录,然后对每条记录进行处理。直接SELECT * FROM TABLE 就内存溢出了。
请问有什么比较高效的办法来解决?我对数据库几乎一窍不通,还请各位大哥讲解的越详细越好。谢谢!数据库是 ORACLE 10g

解决方案 »

  1.   

    你看创建一个索引查询一次。。 select *from table 查询速度最慢 全部扫描!!如果,使用java的话可以批量查询..如果,你有sql查询的话?
    可以使用
    cast ....when.....then....end就可以啦!
      

  2.   

    你在java程序中把所有的结果都查询出来了?
      

  3.   


    用分页,把比较大的数据放到内存里,当然是要防止可能出现OutofMemory的问题哟。
      

  4.   

    你咋不用批量update呢,没有共同规律可总结,没这可能
      

  5.   

    主要是想把数据库中的内容放到LUCENE里做索引,大体过程如下:
    用JDBC 跑SQL 获得ResultSet,遍历ResultSet建立Document对象并用IndexWriter写入文件目录。
    其中数据库中的一条记录对应Lucene中一个Document。
    数据库表中都有唯一字段ID
      

  6.   

    那你也就是通过 Java 代码对数据进行处理,而不是在数据库里做了
    使用 select * from table 会造成你的内存溢出,那你可以一次获取一部分就 ok 了
    我想这张表里的数据不至于是杂乱无章的吧,某个字段的值应该有一个取值范围的
    你可以根据这个字段进行 where 查询,分批次的将数据获取出来,再进行单独处理
      

  7.   

    是不是内存不够大,增大内存试试
    用这个命令,指定最小内存和最大内存可用量
    java  Test -Xms  512 -Xmx 1024
      

  8.   

    select t.* from (select *, rownum as rid from table order by col1) t
     where t.rid between 1 and 10000;这样每次就能取一万条数据
      

  9.   

    可以更简单些,SELECT * FROM TABLE rownum between 1 and 10000;
    在程序里把那两个数字弄成变量即可:
    i=0;
    进入循环,SELECT * FROM TABLE rownum between i and i+10000;
      

  10.   

    ...上面的不可行
    1. rownum是不支持直接between的,只能小于
    2. 每次查询的数据如不经排序都是随机的
    可以用13楼的方法,但数据大时排序都是很大一成本。可以试试用ROWID排序
      

  11.   


    鄙视一下,between 是可以用的,我针对的是已经成列的 rid 又不是针对 rownum 
      

  12.   

    不知道这样能不能帮你.select /**+ALL_ROWS*/ * from TABLE ;
    个人认为一查就内存溢出,最终解决的方式还是硬件,如果硬没有达到要求就是现在这条语
    查出来不错,我想速度也不会快到哪去。。