sql-server - 当使用游标迭代结果集时,是否将所有结果集加载到内存中

标签 sql-server oracle

如果结果集很大,使用游标会节省内存吗?

最佳答案

从技术上讲,当您发出数据库查询时总是涉及游标。您可能正在考虑隐式游标和显式游标之间的区别?

就内存使用而言,重要的不是发出查询的方法,而是获取结果的方式 - 您可以选择批量获取结果(这会使用更多内存,但性能更好、更高效)或单独获取每一行(使用较少的内存,但性能较差且效率较低)。

然而,权衡并不那么简单。如果您有大量并发连接,并且所有查询同时运行,则效率可能比内存使用更重要 - 查询越早完成,数据库就越快可以空闲来服务其他请求。

如果我尝试优化 PL/SQL 的性能和内存使用情况,我喜欢使用 BULK COLLECT,并在循环内设置 LIMIT,例如:

DECLARE
  BATCHSIZE CONSTANT INTEGER := 1000;
  CURSOR mycursor IS SELECT ...;
  TYPE mytabletype IS TABLE OF mycursor%ROWTYPE INDEX BY PLS_INTEGER;
  myarray mytabletype;
BEGIN
  OPEN mycursor;
  LOOP
    FETCH mycursor INTO myarray LIMIT BATCHSIZE;
    EXIT WHEN myarray.COUNT = 0;
    FOR i IN 1..myarray.COUNT LOOP
      -- do the processing on myarray(i)
    END LOOP;
  END LOOP;
  CLOSE mycursor;
END;

上面的代码可以轻松调整批量大小以最大化吞吐量,而无需在每个 session 中使用太多内存。

关于sql-server - 当使用游标迭代结果集时,是否将所有结果集加载到内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5602835/

相关文章:

SQL插入性能和表大小

Oracle lag 函数,它可以接受列别名吗?

mysql - MS Access Requery 不适用于 MySQL->Oracle 迁移

c# - Oracle 日期格式 — 数据读取器无法识别 to_char 函数

SQL如何查找多个表中未使用的键

sql-server - 如何将 SQL Server 2008 数据库图表导出到另一个数据库?

sql - 插入时,输出未插入但在连接表中的列

sql - 最多允许 10 个具有相同 GUID 的项目

database - Oracle(通常是 RDB?)是否拍摄受 DML 影响的表的快照?

java - ORA-28040 : No matching authentication protocol Oracle