分页查询与游标查询

2024-11-07  本文已影响0人  flystarts

PG数据库的一个表有几亿条数据,现在需要读取该表所有数据进行处理,直接一把查肯定是不行的

首先考虑的是分页查询。
实测发现查询的很慢,因为查询虽然有分页,每次只查一批数据,但是数据库仍然需要从全部数据中去找指定page的数据,即使有索引也还是慢

这种情况可以使用游标查询,游标也是分批查,和分页查的区别是,游标查询时,数据库会在服务端记录一个指针,指向当前读取的进度,所以客户端不需要自己记录进度,只需要过来读就行
数据库每次直接从指针处继续往后读,不需要去找位置,因此性能比分片查更高。

对客户端而言,不需要客户端记录page;对服务端,不需要找位置,可以大幅降低服务端性能消耗,提高查询速度。
游标查也有缺点,因为服务端会把表锁定,此时是无法写数据的,直到客户端关闭游标。(不同数据库有差异)

       @Cleanup Connection conn = dataSource.getConnection();
        @Cleanup Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
        stmt.setFetchSize(500);
        @Cleanup ResultSet rs = stmt.executeQuery("SELECT * FROM XXX");
        loopResultSet(rs);
上一篇 下一篇

猜你喜欢

热点阅读