问题描述
你好,团队,
SGA是为每个sql语句分配单独的缓冲池,还是为sql语句集分配缓冲池?
如果一个会话覆盖池,它如何影响其他会话查询同一个表或不同表?
SGA是为每个sql语句分配单独的缓冲池,还是为sql语句集分配缓冲池?
如果一个会话覆盖池,它如何影响其他会话查询同一个表或不同表?
专家解答
SGA有很多部分。
缓冲区缓存就是其中之一。这是许多会话可以访问的共享区域。这样做的目的是将频繁读取的数据保留在内存中,并避免物理 (磁盘) 读取。
会话第一次从表中读取行时,数据库会从磁盘读取行并将其复制到缓冲区缓存中 (使用全表扫描时会出现异常-这些会绕过缓冲区缓存)。因此,当一个会话读取行时,读取相同块的其他会话可以受益,因为它们可以直接从内存中读取数据,从而避免了磁盘访问。
如果每个会话读取不同的数据,则所有会话都必须转到磁盘,因为数据未缓存。当每个会话读取新数据时,它会将现有缓冲区从缓存中推出 (假设它已满)。数据库具有内部算法,用于确定将哪些缓冲区保留在缓存中。
您可以将缓冲区缓存拆分为多个池 (默认,保留,回收),以帮助管理这种情况。您在对象的基础上执行此操作 (例如,read_always_tab进入保留池,read_rarely_tab进入回收池)。在大多数情况下,这是一项以最小的利益进行的大量工作。
有关更多详细信息,请阅读 “概念指南” 中的SGA概述:
https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/memory-architecture.html#GUID-24EDB8CD-8279-4CED-82AF-642FC01A4A73
这些交互式体系结构图还可以帮助您了解内存区域如何组合在一起:
https://www.oracle.com/webfolder/technetwork/tutorials/architecture-diagrams/18/technical-architecture/database-technical-architecture.html
缓冲区缓存就是其中之一。这是许多会话可以访问的共享区域。这样做的目的是将频繁读取的数据保留在内存中,并避免物理 (磁盘) 读取。
会话第一次从表中读取行时,数据库会从磁盘读取行并将其复制到缓冲区缓存中 (使用全表扫描时会出现异常-这些会绕过缓冲区缓存)。因此,当一个会话读取行时,读取相同块的其他会话可以受益,因为它们可以直接从内存中读取数据,从而避免了磁盘访问。
如果每个会话读取不同的数据,则所有会话都必须转到磁盘,因为数据未缓存。当每个会话读取新数据时,它会将现有缓冲区从缓存中推出 (假设它已满)。数据库具有内部算法,用于确定将哪些缓冲区保留在缓存中。
您可以将缓冲区缓存拆分为多个池 (默认,保留,回收),以帮助管理这种情况。您在对象的基础上执行此操作 (例如,read_always_tab进入保留池,read_rarely_tab进入回收池)。在大多数情况下,这是一项以最小的利益进行的大量工作。
有关更多详细信息,请阅读 “概念指南” 中的SGA概述:
https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/memory-architecture.html#GUID-24EDB8CD-8279-4CED-82AF-642FC01A4A73
这些交互式体系结构图还可以帮助您了解内存区域如何组合在一起:
https://www.oracle.com/webfolder/technetwork/tutorials/architecture-diagrams/18/technical-architecture/database-technical-architecture.html
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




