温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Cursor游标如何批量读取

发布时间:2026-10-30 20:51:56 来源:亿速云 阅读:93 作者:小樊 栏目:数据库

你指的 Cursor(游标)批量读取,常见场景有几种,下面分别说明,你可以对号入座。


一、数据库游标批量读取(最常见)

1️⃣ JDBC(Java)

不要一次 fetchAll,用 Fetch Size 批量读:

Statement stmt = conn.createStatement();
stmt.setFetchSize(1000); // 每次从数据库拉 1000 条

ResultSet rs = stmt.executeQuery("SELECT * FROM user");
while (rs.next()) {
    // 处理一行
}

✅ 本质:
数据库游标在服务端保持,客户端按批次取数据


2️⃣ Python(psycopg2 / MySQLdb)

cur.execute("SELECT * FROM user")
while True:
    rows = cur.fetchmany(1000)  # 批量读取
    if not rows:
        break
    for row in rows:
        pass

✅ 推荐用 fetchmany,而不是 fetchall


3️⃣ Oracle 游标(PL/SQL)

DECLARE
  CURSOR c IS SELECT * FROM user;
  TYPE t_arr IS TABLE OF user%ROWTYPE;
  v_arr t_arr;
BEGIN
  OPEN c;
  LOOP
    FETCH c BULK COLLECT INTO v_arr LIMIT 1000;
    EXIT WHEN v_arr.COUNT = 0;
    -- 批量处理
  END LOOP;
  CLOSE c;
END;

✅ BULK COLLECT LIMIT 是 Oracle 批量读取标准写法


二、Elasticsearch / MongoDB 游标

Elasticsearch(scroll / search_after)

{
  "size": 1000,
  "query": { "match_all": {} }
}

配合 scroll_id 或 search_after 分批拉


MongoDB

const cursor = db.collection.find().batchSize(1000);
while (await cursor.hasNext()) {
  const doc = await cursor.next();
}

三、编程语言层面的“游标式迭代”

如 Python 生成器:

def batch_iter(data, size=1000):
    for i in range(0, len(data), size):
        yield data[i:i+size]

四、核心原则总结

✅ 不要一次性加载全量
✅ 控制批次大小(1000–5000 常见)
✅ 服务端游标 + 客户端分批
✅ 处理完一批再取一批


如果你能告诉我:

  • 用的是哪种数据库(MySQL / Oracle / PG)
  • 什么语言
  • 是否服务端游标

我可以直接给你可运行示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手