【问题标题】:Result set takes long to process big data from Oracle结果集需要很长时间来处理来自 Oracle 的大数据
【发布时间】:2021-05-22 11:00:08
【问题描述】:

在 Oracle 数据库中,我有一个查询 select * from tablehistory

  1. 查询可以快速运行并返回 500,000 条记录。这不是问题。
  2. 挑战在于结果集需要很长时间才能循环。
  3. 如何解决需要很长时间循环的结果集?
  4. 结果集数据,我打算保存成hash map/做处理。
  5. 下面的代码,启动1、2、3打印快,启动4打印时间长;很慢

如何加快我的代码速度?

String mayquery="select * from tablehistory";   
try {
        System.out.println("# start 0");
        PreparedStatement preparedStatement = con.prepareStatement(mayquery);
        System.out.println("# start 1");
        ResultSet resultSet = preparedStatement.executeQuery();
        System.out.println("# start 2");
        int count =0;
        System.out.println("# start 3");
        while (resultSet.next()) {
            System.out.println("start 4 count:"+count);
            count++;
        }
        System.out.println("# end a");
        System.out.println("count:"+count);
    } catch(Exception e) {
        
    }

【问题讨论】:

  • 如果 tablehistory 只是一个表(不是视图),那么问题不在于 oracle,而在于您的网络:可能需要很长时间才能将数据发送给您。在这里,我假设您正在通过网络连接到数据库。当您说“查询可以快速运行”时,它返回 500k 行,那么快速是什么意思?您是否尝试过查询 soemwhere 并让它取回 500K 行并且速度很快?
  • 听说过'row by row = slow by slow'这句话吗?当然,“循环遍历行”将花费更多时间。您在每一行停下来并与该行一起工作。一个简单的 SELECT 将所有行作为一个集合收集,并将它们作为一个集合返回给客户端,客户端只需将它们写入输出设备。
  • 您说“start 4 需要很长时间才能打印”,但“start 4”应该打印 500,000 次。你是说打印第一个“start 4”需要很长时间吗?还是第 500,000 个? “长时间”对你意味着什么?从数据库获取半百万行到客户端应用程序很少是构建流程的理想方式。但是,如果您要这样做,您几乎肯定希望将setFetchSize 设置为更大的值。通常在 100 - 1000 范围内,但您可以测试什么在您的环境中最有效。

标签: java oracle jdbc oracle11g resultset


【解决方案1】:
  1. 尝试将 resultSet.setFetchSize(int) 设置为更高的值。默认情况下,设置为 10。此参数控制从服务器到 DB 的网络调用次数,在最佳使用时可以提高性能。
  2. 检查网络延迟。
  3. System.out.println() 是一个繁重的操作。与其每次都打印,不如尝试在一段时间内打印一行。

【讨论】: