12c的alter table richard.oracle inmemory其实就是把表放到一个单独的内存空间,而存储的方式是列存储
InMemory可以针对如下级别进行操作
Column
Table
Materialized view
Tablespace
Partition
InMemory数据库参数
INMEMORY_SIZE 指定IM分配内存大小,默认值为0,如果启动该值最小为100M;如果在CDB环境中使用,CDB级别设置为整个库级别限制,PDB默认继承CDB设置,但是在实际使用中PDB中总数不能超过CDB限制
INMEMORY_FORCE 指定是否允许数据库中对象使用IM,默认是DEFAULT,即可以实现在对象级别定义INMEMORY or NO INMEMORY,如果设置为OFF 即表示表或者物化视图无法使用IM
INMEMORY_CLAUSE_DEFAULT 默认为空,和NO INMEMORY意义相同,表示创建新对象默认不启用IM,如果配置为INMEMORY,表示新创建对象默认启用IM
INMEMORY_QUERY 默认为TRUE,表示查询是否使用IM特性,设置为FALSE表示查询不使用IM特性
INMEMORY_MAX_POPULATE_SERVERS 默认和系统core一致,用途是把你的表中数据写入到IM中
INMEMORY_TRICKLE_REPOPULATE_SERVERS_PERCENT 控制IM中对象数据的重新载入的进程数,该值为INMEMORY_MAX_POPULATE_SERVERS参数的百分比
OPTIMIZER_INMEMORY_AWARE 该参数是控制优化器成本计算时是否考虑IM,默认为TRUE
InMemory有压缩级别和优先级别请参考官方文档
参考语句
ALTER
TABLESPACE Richard
DEFAULT
INMEMORY
MEMCOMPRESS
FOR
CAPACITY HIGH
PRIORITY LOW;
对于inmemory有几个需要注意的地方
1什么样的表或分区(对象)应该inmemory(这涉及列存储相对于行存储的优势),好的技术关键还是看怎么用
需要放inmemory的
A query that scans a large number of rows and applies filters that use operators such as the following: =, <, >, and IN
A query that selects a small number of columns from a table or materialized view with a large number of columns,
such as a query that selects five columns from a table with 100 columns
A query that joins a small table to a large table
A query that aggregates data
不需要放inmemory的
Queries with complex predicates
Queries that select a large number of columns
Queries that return a large number of rows
Queries with multiple large table joins
2对象在inmemory占用多少内存评估,当然可能需要考虑数据量的持续增长
可以使用dbms_compression.get_compression_ratio评估
随着IM中对象的增加,当INMEMORY_SIZE不足之时,当IM中的对象不能全部在IM中之时,对其对象操作,会转换成传统数据库操作
3关于priority参数测试
a. 指定PRIORITY不为none也需要访问对象后才能够放入IM中
b. 当IM不足时,PRIORITY级别高的会把级别低的对象刷出IM
4对于inmemory对象可以设置压缩参数,请选用最合理的那个
例如alter
table
richard.oracle inmemory MEMCOMPRESS
FOR
QUERY HIGH
5对于RAC,需要保证2个参数的设置正确才是真正的开启inmemory
SQL>
alter
system
set
parallel_force_local=
false
sid=
'*'
;
SQL>
alter
system
set
parallel_degree_policy=AUTO sid=
'*'
;
资料来源http://www.xifenfei.com/5645.html