Oracle查询大表的全部数据

发布于:2025-04-16 ⋅ 阅读:(19) ⋅ 点赞:(0)

2000w的大表 

 表结构如下,其中id是索引

查询处理慢的写法

List<String> queryLoidForPage(Integer startNum,Integer endNum){
        try {
            Connection oracleConnection = initBean.oracleConnection;
            Statement stmt = oracleConnection.createStatement();
            // 4.执行查询 
            long l = System.currentTimeMillis();
            ResultSet rs = stmt.executeQuery("SELECT username FROM LOID_TABLE_ID where id BETWEEN  "+startNum+" and "+endNum);
            System.out.println("查询耗时:"+(System.currentTimeMillis()-l));
            List<String> loids = new ArrayList<>();
            // 5.处理结果集 
            System.out.println("开始处理结果集");
            long l1 = System.currentTimeMillis();
            while(rs.next()){
                loids.add(rs.getString("username"));
            }
            System.out.println("处理结果集耗时:"+(System.currentTimeMillis()-l1));
            return loids;
        }catch (Exception e){
            e.printStackTrace();
            return new ArrayList<>();
        }
    }
开始查询0到10000条数据
查询耗时:79
开始处理结果集
处理结果集耗时:35988
结束查询0到10000条数据,耗时:36101
开始查询10000到20000条数据
查询耗时:36
开始处理结果集
处理结果集耗时:35910
结束查询10000到20000条数据,耗时:35946

10000条记录查询出来到处理好要35秒左右

查询处理快的写法

List<String> queryLoidForPage(Integer startNum,Integer endNum){
        try {
            Connection oracleConnection = initBean.oracleConnection;
            PreparedStatement pstmt = oracleConnection.prepareStatement("SELECT username FROM LOID_TABLE_ID WHERE id BETWEEN ? AND ?");
            // 设置查询参数
            pstmt.setInt(1, startNum);
            pstmt.setInt(2, endNum);
            // 设置 fetch size 以提高查询效率 根据实际情况调整 fetch size
            pstmt.setFetchSize(1000);
            // 4.执行查询 
            long l = System.currentTimeMillis();
            ResultSet rs = pstmt.executeQuery();
            System.out.println("查询耗时:"+(System.currentTimeMillis()-l));
            List<String> loids = new ArrayList<>();
            // 5.处理结果集 
            System.out.println("开始处理结果集");
            long l1 = System.currentTimeMillis();
            while(rs.next()){
                loids.add(rs.getString("username"));
            }
            System.out.println("处理结果集耗时:"+(System.currentTimeMillis()-l1));
            return loids;
        }catch (Exception e){
            e.printStackTrace();
            return new ArrayList<>();
        }
    }
开始查询0到10000条数据
查询耗时:85
开始处理结果集
处理结果集耗时:370
结束查询0到10000条数据,耗时:498
开始查询10000到20000条数据
查询耗时:37
开始处理结果集
处理结果集耗时:370
结束查询10000到20000条数据,耗时:407
开始查询20000到30000条数据
查询耗时:36
开始处理结果集
处理结果集耗时:365
结束查询20000到30000条数据,耗时:403

10000条记录查询加处理400毫秒

总结:尽量使用预处理查询,设置fetch size,即pstmt.setFetchSize(1000)