【博客文章2022】In-Memory Column Store系列2 Author: Bo Tang 1. 查询中的In-Memory加载过程 默认,当Oracle首次查询访问具有in-memory定义的表时,就会加载它进入in-memory column store。这个过程是通过后台进程异步地完成的。加载进入IMCU中,每个列就是一个cu: 如果对象有被加载进内存中的in-memory column store,它会被显示在V$IM_SEGMENTS和V$IM_USER_SEGMENTS;如果它没有被加载就不会被显示。V$IM_USER_SEGMENTS和V$IM_SEGMENTS的区别是,它只显示当前登录数据库的用户的对象:
我们来查询sales2表,目的是让该表被自动加载到in-memory column store:
同时,优先级也决定了表加载的顺序:如果要发生加载,那么高优先级的表如果没有加载完毕,低优先级的表不会加载: SH执行以下的查询语句触发inmemory的加载: 从上面的结果可以看出:每一轮加载过程中,如果优先级高的没有完成加载(FINISH_POP),那么优先级低的就不会开始下一轮加载(START_POP)。 在inmemory加载过程中伴随着压缩,inmemory压缩用得好不仅节省内存空间而且还可以通过减少IO以提高性能,下面来讨论压缩算法。默认的压缩选项是MEMCOMPRESS FOR QUERY LOW,该选项由于在查询时不需要解压缩数据,所以提供了最快的读取数据的速度。其他的选项添加了额外的压缩层,读取数据的时候需要解压缩。
我们可以使用Oracle Compression Advisor来预判压缩比率,进而来预先知道inmemory_size要设置多大。Oracle Compression Advisor不仅可以建议硬盘上表的Basic压缩和row store advanced压缩的压缩率,还可以建议inmemeory的压缩算法: 下面使用算法dbms_compression.comp_inmemory_capacity_high建议: 下面使用算法dbms_compression.comp_inmemory_query_low建议:
In-memory Columnar压缩与硬盘上的表的Hybrid Columnar Compression密切相关。它们内部都采用了Intel CPU的SIMD向量处理指令集(包括Intel AVX256比特向量寄存器)。把表逆时针旋转90度后,一个向量指令可以处理许多原来的行,导致每秒可以访问10亿原来的行(现在的列)。而不采用向量处理指令,每秒最多只能访问100万行。In-memory columnar压缩与硬盘上的表的Hybrid Columnar Compression最大的不同是:前者对内存进行向量处理,而后者对硬盘进行向量处理。 |
GMT+8, 2022-4-25 09:32 , Processed in 0.058094 second(s), 21 queries .