oracle IMO
[font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica][size=13px]下图是IMO特性的原理图,通过在内存中开辟一块独立的区域,Oracle将指定的表或者分区以列式内存存储,但是在存储上,仍然以一份行式存储,这就需要额外的内存空间。
[font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica][size=13px][img=520,367]http://www.eygle.com/blog/images/inmemorycolumn.png[/img]
[p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica][size=13px]IMO的缺省的参数有:[indent][p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica]SQL> select name from v$parameter where name like '%inmemory%';[p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica]NAME[p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica]------------------------------[p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica]inmemory_size[p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica]inmemory_clause_default[p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica]inmemory_force[p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica]inmemory_query[p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica]inmemory_max_populate_servers[/indent][p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica][size=13px]在数据库启动时,可以看到SGA中分配的Inmemory Area区域:[indent][p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica]SQL> show sga[p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica]Total System Global Area 2147483648 bytes[p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica]Fixed Size 2917936 bytes[p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica]Variable Size 402655696 bytes[p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica]Database Buffers 1191182336 bytes[p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica]Redo Buffers 13856768 bytes[p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica]In-Memory Area 536870912 bytes[/indent][p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica][size=13px]启用IMO特性,需要设置inmemory_size参数,指定可以作为内存列存的内存区域,该参数为静态参数,以下语句将该内存指定为800M,重启数据库使得该参数失效:[indent][p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica]SQL> alter system set inmemory_size=800M scope=spfile;[p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica]System altered.[/indent][p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica][size=13px]除此之外,另外一个关键参数是:inmemory_max_populate_servers 。该参数设置用于将数据加载到内存的后台进程数量。以下将该参数设置为2 :[indent][p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica]SQL> alter system set inmemory_max_populate_servers=2;[p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica]System altered.[/indent][p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica][size=13px]此后可以通过在表或者分区级别设置INMEMORY选项,将该表数据设置存储在内存中:[indent][p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica]SQL> alter table accbill inmemory;[p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica]Table altered.[/indent][p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica][size=13px]以下通过测试来演示一下IN-Memory表的查询性能,以下执行计划中的INMEMORY意味着这是一个IMO查询,逻辑读仅为7,较常规表大大缩减:[p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica][size=13px][img=594,483]http://www.eygle.com/blog/images/inmemory.png[/img][p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica][size=13px]如果我们将该表移出IMO内存,可以看到其逻辑读变成了4076,执行效率也肯定大大下降:[p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica][size=13px][img=604,484]http://www.eygle.com/blog/images/noinmemory.png[/img][p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica][size=13px]通过视图V$INMEMORY_AREA可以查询内存区域的使用情况,其中USED_BYTES表明当前已经使用的内存:[p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica][size=13px][img=632,94]http://www.eygle.com/blog/images/inmemoryarea.png[/img][p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica][size=13px]注意,V$INMEMORY_AREA中的POPULATE_STATUS代表了当前数据向内存中加载的进度,在Done之前的查询不能充分使用内存列式运算。[p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica][size=13px][img=645,99]http://www.eygle.com/blog/images/populating.jpg[/img][p=19, null, left][font=Optima, Verdana, Arial, sans-serif, Tahoma, Helvetica][size=13px]如果内存设置不足以容纳指定的数据表,则状态会显示为"OUT OF MEMORY",这就需要去增加内存设置,或者减少Cache的对象数量。