“快速遍历结果集”要看具体场景(数据库、编程语言、数据规模、是否可并行等)。下面按最常见的情况给你结论 + 示例。
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM big_table");
while (rs.next()) {
...
}
Statement stmt = conn.createStatement(
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY
);
stmt.setFetchSize(Integer.MIN_VALUE); // 流式读取
ResultSet rs = stmt.executeQuery("SELECT id, name FROM big_table");
while (rs.next()) {
// 逐行处理
}
✅ 适合:千万级数据 ❌ 不适合:需要随机访问
BEGIN;
DECLARE cur CURSOR FOR SELECT id, name FROM big_table;
FETCH 1000 FROM cur;
COMMIT;
stmt.setFetchSize(1000);
Oracle 默认缓存行,调大 fetchSize 可显著提升速度。
SELECT id, name
FROM big_table
WHERE id > :last_id
ORDER BY id
LIMIT 1000;
循环直到结果为空。
✅ 优点:
for row in cursor.fetchall(): # ❌ 慢
...
# ✅ 推荐
for row in cursor:
...
或使用服务器端游标(如 psycopg2):
with conn.cursor(name='server_cursor') as cur:
cur.itersize = 2000
cur.execute("SELECT * FROM big_table")
for row in cur:
...
list.stream().forEach(...)
大数据量时:
✅ 使用 Iterator
✅ 避免 collect()
WHERE id % 4 = 0
WHERE id % 4 = 1
...
多个线程/进程同时遍历。
⚠️ 注意:
| 方式 | 速度 | 内存 | 适用 |
|---|---|---|---|
| 全量加载 | 快 | 高 | 小数据 |
| 流式读取 | 中 | 低 | 大数据 |
| 分页遍历 | 稳定 | 低 | 通用 |
| 并行 | 快 | 中 | 可并行 |
永远不要为了“快”而把整个结果集装进内存。
如果你愿意,可以直接告诉我:
我可以给你最优的具体实现方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。