Oracle的内存列存储介绍
简介
关于内存列存储的说明
1)内存列存储是SGA里的一个静态的池。以列为单位的方存储元数据。因此oracle可以存储列或行的方式存储元数据在内存里。
2)列存储的数据可以压缩,且sql查询语句直接访问压缩数据
3)当你想把对象放到列存储里时,可以控制对象的优先级。
4)支持的版本为12.1.0.2或更高的兼容性
能在如下几种级别中打开内存存储
1)列(column)
2)表(tables)
3)物化视图(materialized view)
4)表空间(tablespace)
5)分区(partition)
如果在表空间级别启用In-Memory Column Store,那么所有存储在该表空间中的所有表与物化视图将抽默认启用In-Memory Column Store。可以将一个数据库对象的所有列或者将一个数据库对象的部分列加载到In-Memory Column Store中。类似地,对于分区表或物化视图,可以将所有分区或部分分区加载到In-Memory Column Store中
能用以下语句实现数据库对象放到内存列存储中
CREATE TABLE
ALTER TABLE
CREATE TABLESPACE
ALTER TABLESPACE
CREATE MATERIALIZED VIEW
ALTER MATERIALIZED VIEW
查看那些对象被放入到了列存储中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | SELECT OWNER, SEGMENT_NAME, INMEMORY_PRIORITY, INMEMORY_COMPRESSION FROM V$IM_SEGMENTS; SELECT * FROM v$im_column_level; SELECT * FROM v$im_segments; select pool,trunc(ALLOC_BYTES/1024/1024) ALLOC,trunc(USED_BYTES/1024/1024) USED,POPULATE_STATUS,con_id from V$INMEMORY_AREA; SELECT d.owner, d.table_name, d.tablespace_name, d.logging, d.degree, d.inmemory, d.inmemory_priority, d.inmemory_distribute, d.inmemory_compression, d.inmemory_duplicate, d.inmemory_service, d.inmemory_service_name FROM dba_tables d where d.table_name = 'T_OBJ_IOT'; exec dbms_stats.gather_table_stats(ownname=>'LHR',tabname=>'T_OBJ',degree=>8,cascade=>true); |
列存储的优先级
PRIORITY NONE-->LOW-->MEDIUM-->HIGH-->CRITICAL
优先级只针对于表级或表分区级;如果对象是64k或更小,虽然手动放入了列存储,但是内存列存储没有把其放入列存储中。
开启内存列存储的参数
默认情况下只需要配置INMEMORY_SIZE,其他参数默认就好。inmemory_size为0表示关闭,最小值100M。
通常情况下,sys用户下的对象及SYSTEM、SYSAUX表空间上的对象无法使用IMO特性,但通过设置“_enable_imc_sys”隐含参数也可以使用
1 | alter system set INMEMORY_SIZE=100M scope=spfile; --重启生效 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | LHR@127.0.0.1/orclpdb1> show parameter inmemory NAME TYPE VALUE ------------------------------------ ---------------------- ------------------------------ inmemory_adg_enabled boolean TRUE inmemory_automatic_level string OFF inmemory_clause_default string inmemory_expressions_usage string ENABLE inmemory_force string DEFAULT inmemory_max_populate_servers integer 2 inmemory_optimized_arithmetic string DISABLE inmemory_prefer_xmem_memcompress string inmemory_prefer_xmem_priority string inmemory_query string ENABLE inmemory_size big integer 500M inmemory_trickle_repopulate_servers_ integer 1 percent inmemory_virtual_columns string MANUAL inmemory_xmem_size big integer 0 optimizer_inmemory_aware boolean TRUE LHR@127.0.0.1/orclpdb1> |
优缺点
内存列存储可以改善以下操作
1)多行查询且带有= < > 与IN的过滤符号的查询语句
2)查询少量字段但有较多字段的表或物化视图的语句,例如查询某个字段有100表中的5列。
3)小表连接大表的查询语句
4)聚合数据的查询语句
内存列存储不能改善以下类型的操作
1)复杂谓词的查询语句
2)查询较多列的语句
3)返回较多行结果的查询语句
4)连接多个大表的查询语句
5)数据库里sys用户的对象以及SYSTEM,SYSAUX表空间里的对象都不支持列存储
示例
表级的操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | CREATE TABLE test_inmem ( id NUMBER(5) PRIMARY KEY, test_col VARCHAR2(15)) INMEMORY; ALTER TABLE test_inmem INMEMORY; ALTER TABLE test_inmem INMEMORY MEMCOMPRESS FOR CAPACITY LOW; ALTER TABLE test_inmem INMEMORY MEMCOMPRESS FOR CAPACITY HIGH PRIORITY LOW; ALTER TABLE test_inmem INMEMORY MEMCOMPRESS FOR QUERY ( product_id, product_name, category_id, supplier_id, min_price) INMEMORY MEMCOMPRESS FOR CAPACITY HIGH ( product_description, warranty_period, product_status, list_price) NO INMEMORY (weight_class, catalog_url); |
表空间级的操作
1 2 3 4 5 6 7 8 | CREATE TABLESPACE tbs1 DATAFILE 'tbs1.dbf' SIZE 40M ONLINE DEFAULT INMEMORY; ALTER TABLESPACE tbs1 DEFAULT INMEMORY MEMCOMPRESS FOR CAPACITY HIGH PRIORITY LOW; |
物化视图级的操作
1 2 3 4 5 | CREATE MATERIALIZED VIEW oe.prod_info_mv INMEMORY AS SELECT * FROM oe.product_information; ALTER MATERIALIZED VIEW oe.prod_info_mv INMEMORY PRIORITY HIGH; |
数据泵对于内存列存储的表的导出
导入的时候需要TRANSFORM=INMEMORY:y,那么默认在内存列存储才会继续在内存中。
参考
https://blog.csdn.net/weixin_34805048/article/details/116360141