问题描述
你好,团队,
我注意到内存区域有静态池,为它们分配了固定数量的内存。
下面是一个例子:
这意味着inmemory_size参数的20% 分配给了64KB池,该池在该数据库中几乎是免费的。结果,根本没有使用6GB的内存区域。
不利的一面是,我实际上在alert.log中收到了 “内存不足,无法将表填充到内存区域” 消息,而v $ inmemory_area/v $ inmemory_segments中没有任何证据,这可能是由于错误18549042-内存不足状态未显示在视图V $ IM_SEGMENTS (Doc ID 18549042.8) 中,因为我仍在该数据库中使用DBBP 12.1.0.2.161018,2017年1月DBBP即将安装。
我想知道这样的内存分配的原因是什么。我的意思是,将64KB池设置为内存中总面积的20% 看起来像是在这种环境中完全浪费内存。我了解,也许在某些不同条件下的某些环境中,它是适当的,但是当Oracle根据数据库活动根据需要动态调整池时,它也可能以这种方式完成。
我注意到内存区域有静态池,为它们分配了固定数量的内存。
下面是一个例子:
SQL> select * from v$inmemory_area; POOL ALLOC_BYTES USED_BYTES POPULATE_STA CON_ID -------------------------- ------------ ------------ ------------ ------------ 1MB POOL 25477251072 25445793792 POPULATING 0 64KB POOL 6422724608 43122688 POPULATING 0
这意味着inmemory_size参数的20% 分配给了64KB池,该池在该数据库中几乎是免费的。结果,根本没有使用6GB的内存区域。
不利的一面是,我实际上在alert.log中收到了 “内存不足,无法将表填充到内存区域” 消息,而v $ inmemory_area/v $ inmemory_segments中没有任何证据,这可能是由于错误18549042-内存不足状态未显示在视图V $ IM_SEGMENTS (Doc ID 18549042.8) 中,因为我仍在该数据库中使用DBBP 12.1.0.2.161018,2017年1月DBBP即将安装。
我想知道这样的内存分配的原因是什么。我的意思是,将64KB池设置为内存中总面积的20% 看起来像是在这种环境中完全浪费内存。我了解,也许在某些不同条件下的某些环境中,它是适当的,但是当Oracle根据数据库活动根据需要动态调整池时,它也可能以这种方式完成。
专家解答
要将表填充到内存中的列存储中,我们需要两件事:
a) 来自表本身存储在1MB池中的列压缩数据
b) 关于存储在64KB池中的表及其压缩数据的元数据
我们还将64KB池中的空间反转,以帮助使IM列存储与行存储和其他内部操作保持同步。64KB池的大小是基于启发式方法计算的,该启发式方法考虑了许多因素,包括内存中列存储的总大小。
这里有一篇很棒的博客文章,更详细地描述了这一点
https://blogs.oracle.com/In-Memory/entry/what_is_an_in_memory
a) 来自表本身存储在1MB池中的列压缩数据
b) 关于存储在64KB池中的表及其压缩数据的元数据
我们还将64KB池中的空间反转,以帮助使IM列存储与行存储和其他内部操作保持同步。64KB池的大小是基于启发式方法计算的,该启发式方法考虑了许多因素,包括内存中列存储的总大小。
这里有一篇很棒的博客文章,更详细地描述了这一点
https://blogs.oracle.com/In-Memory/entry/what_is_an_in_memory
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




