我知道游标不是一个好主意,但我对游标的内部结构有一些疑问。
游标的第一步是确定游标遍历的结果集。那么,游标是否执行了 SELECT 查询并将结果放在某个临时表中,或者它的实现方式有所不同?
SQL 将在内存中从磁盘中获取数据页,第一次需要数据页。因此,假设我手动执行了简单的 SELECT 查询,并且 SQL 将数据页拉入内存。还假设 SELECT 查询在 FOR 子句中有相同的查询。当游标关闭并释放时,游标末尾发生了什么?游标是否从已用数据页中释放内存,或者数据页保留在内存中?
我知道游标不是一个好主意,但我对游标的内部结构有一些疑问。
游标的第一步是确定游标遍历的结果集。那么,游标是否执行了 SELECT 查询并将结果放在某个临时表中,或者它的实现方式有所不同?
SQL 将在内存中从磁盘中获取数据页,第一次需要数据页。因此,假设我手动执行了简单的 SELECT 查询,并且 SQL 将数据页拉入内存。还假设 SELECT 查询在 FOR 子句中有相同的查询。当游标关闭并释放时,游标末尾发生了什么?游标是否从已用数据页中释放内存,或者数据页保留在内存中?
取决于游标类型,如中所述
Concepts: Cursors
:至于内存使用,所有数据访问都通过缓冲池,请参阅内存管理器架构。没有发生“关闭”或“解除分配”。数据根据需要进入内存,它可能被多个查询引用,并且仅在需要更多可用内存时才被逐出。