使用此查询:
SELECT
A.CACHE_BUFFER_TOTAL,
B.CACHE_BUFFER_USED,
A.CACHE_BUFFER_TOTAL - B.CACHE_BUFFER_USED AS CACHE_BUFFER_FREE
FROM
(SELECT BYTES / 1024 / 1024 AS CACHE_BUFFER_TOTAL FROM V$SGAINFO WHERE NAME = 'Buffer Cache Size') A,
(SELECT (SELECT COUNT(*) FROM V$BH) * (SELECT BLOCK_SIZE FROM V$BUFFER_POOL) / 1024 / 1024 AS CACHE_BUFFER_USED FROM DUAL) B;
...我可以确定缓冲区高速缓存的总大小和已使用的总大小;但是,我想知道每个用户的查询占用了多少缓冲区缓存。
在 Oracle 21C 中是否有一种简单的方法可以实现这一点?
你有一个有趣的问题。然而,根据我对 Oracle 以及 SGA 和 PGA 中存在的各种缓存的理解,没有真正的方法来确定每个用户的缓存使用情况,因为这会违背(高效)缓存的概念。
缓存(或 Oracle 的内存架构)背后的总体思想是将信息存储在 RAM 中,以便为每个查询 Oracle 实例的用户高效检索和重用数据、语句、查询计划等。
Oracle 实例中内存管理的基础记录如下:
(强调我的)
这分为:
(强调我的)
参考: 内存架构(Oracle | 文档)
上面的文档中有一张非常好的图片,它显示了 Oracle 内存架构的不同组件:
数据库缓冲区高速缓存
数据库缓冲区高速缓存将包含已从磁盘检索的数据,并且 Oracle 数据库内存管理器认为值得将这些数据保留在内存中,以供查询同一 Oracle 实例的任何人将来检索。为每个用户保存这些数据是没有意义的,因为它会占用太多的 RAM 空间。
因此您将无法确定数据属于哪个用户。
共享SQL区
这对于共享 SQL 区也同样有效。如果只存储(相同)查询的一个版本,然后为想要执行相同查询的任何人运行该查询会更有效,为什么还要存储多个相同的查询呢?
私有SQL区
现在,作为汇总每个用户的缓存的区域,这可能看起来很有希望。然而,这个区域存储的信息看起来并不是很有趣:
(重点是我的)
回答你的问题
由于缓冲区高速缓存的概念和性质,您将无法确定用户的查询占用缓冲区高速缓存。
从某种意义上说,用户执行的所有操作都是“非规范化”的,因此每个人都可以从数据/语句/查询执行计划的有效检索中受益。
我希望这些信息为您提供一个良好的起点。
顺便说一下,一些著名的 DBMS 会根据类似的原理来管理内存。(Microsoft SQL Server、MySQL、PostgreSQL,...)它们不会都具有相同的内存架构,但足够相似,足以让您了解 DMBS(数据库管理系统)中如何管理内存。
祝你好运。