游标是不是将 SELECT 结果记录集存储在内存中?

Posted

技术标签:

【中文标题】游标是不是将 SELECT 结果记录集存储在内存中?【英文标题】:Does a cursor store a SELECT result record-set in memory?游标是否将 SELECT 结果记录集存储在内存中? 【发布时间】:2012-08-26 15:07:57 【问题描述】:

我读过一本书

每当您执行 SQL 语句时,Oracle 都会打开一个区域 解析和执行命令的内存。这个区域是 称为游标。

它适用于显式和隐式游标。但我对另一件事感到好奇——游标是否可以被视为 Oracle 返回最终记录集并将其用作获取记录的源的中间位置(在内存中)?

【问题讨论】:

【参考方案1】:

游标是指向从查询返回的中间数据集的指针。它包含用于生成和访问结果的状态信息。来自Concepts Doc:

游标是特定私有 SQL 区域的名称或句柄。如图所示 在图 14-5 中,您可以将游标视为客户端上的指针 端并作为服务器端的状态。

查询的结果是result set,并由光标指向。它存储在临时位置,无论是在内存中还是在磁盘上。来自concepts doc:

临时表空间仅在持续时间内包含模式对象 的一个会话。本地管理的临时表空间有临时的 文件(临时文件),它们是设计用于存储数据的特殊文件 哈希、排序和其他操作。临时文件还存储结果集 内存空间不足时的数据。

【讨论】:

与为结果集命名 PL/SQL 工作区的显式游标不同,游标变量是对该工作区的引用。【参考方案2】:

Oracle 将从磁盘检索到的记录存储在一个称为 DB 缓冲区高速缓存的已分配内存区域中。但这些是的记录,然后被过滤以准备最终结果集。同一张表上的任何其他查询都可以使用这些缓存记录,而不是进入磁盘。概念指南中有更多关于 Oracle 内存体系结构的内容。 Read it here.

现在你所说的略有不同。 Oracle +can+ 缓存单个结果集。至少它可以从 11g 开始,并且仅在企业版中。显然,只有为频繁运行且结果不会很快过时的查询缓存集才有意义。数据库无法弄清楚这一点,这就是为什么我们必须告诉它要缓存哪些结果集。 Find out more。

【讨论】:

:当一些人在一个会话中打开一个游标而没有更新子句而另一个会话中的某个人更新记录时会发生什么。这会影响游标的获取吗? :我将通过步骤 1 解释我的问题)在一个会话中为 select * from emp where location='INDIA' 打开一个光标。 2) 在从游标获取之前,更新 emp set sal=sal+1000 where location='INDIA' ;commit;in 2nd session 3) 从游标获取更新 emp set sal=sal-200 ;犯罪;现在的问题是哪个会话将更新记录? @GauravSoni - 这是一个完全不同的问题。事务管理与内存架构完全无关。 我读到的问题是询问整个结果集是具体化并存储在内存还是磁盘中。当前接受的答案似乎错误地说答案是“是”。您能否扩展您的答案以表明结果集通常不需要在服务器上实现?

以上是关于游标是不是将 SELECT 结果记录集存储在内存中?的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 编程游标存储过程函数

数据库,游标,cursor

MySQL 存储过程,获取使用游标查询的结果集

db2 你可以在同一个存储过程中更改游标结果集吗?

oracle基础之游标的理解与使用

游标的使用