内存列式存储

Posted wangxingc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存列式存储相关的知识,希望对你有一定的参考价值。

 

内存列式存储(IM column store)(此特性在12cr1(12.1.0.2)版本后开始可用)是系统全局区中一个可选的部分,表中的数据是以列的形式而不是行的形式存储在内存里面的,如下图所示.在针对某列作查询的应用场景中,列式存储能极大地提升语句的执行速度.

IM的列存储在SGA中一个新的静态池。传统的表数据是以行为单位存储,列作为行的一个个片断,列式存储是以一种新的列格式。每个列被存储为一个单独的结构。列存储区不取代缓冲区缓存,但作为一个补充,使数据可以存储在内存中的行和列格式。要使用列存储,初始化参数(inmemory_size)必须设置为非零值。

您可以在以下任何级别启用列式存储:

Column(列)

Table(表)

Materialized view(物化视图)

Tablespace(表空间)

Partition(分区)

如果是在表空间级启用列存储,所有在此表空间里的表和物化视图默认情况下启用会启用列式存储。可以在列存储的所有数据库对象的列或数据库对象的列的子集上启用。类似地,对于一个分区表或物化视图,列存储都可以在某些列或列的子集上启用。

使用列存储,可以显著提高对数据库对象上执行的以下类型操作的性能:
1.扫描大量行的查询,并将使用诸如下列运算符的筛选器:=,< >
2.从表或物化视图中选择一个小的列的查询,有大量的列,如从表中选择五列的查询,100列
3.将小的表连接到大表的查询
4.聚合类的查询

通常情况下,创建多列索引以提高分析和报表查询的性能。但这些索引可以降低数据操作语言(DML)语句的性能。当一个数据库对象启用列存储中时,用于分析或报表查询的索引可以被减少或删除,而不会影响查询性能。删除这些索引可以提高交易和数据加载操作的性能。
列式存储可以在以下ddl语句中使用INMEMORY 子句启用.

  • CREATE TABLE

  • ALTER TABLE

  • CREATE TABLESPACE

  • ALTER TABLESPACE

  • CREATE MATERIALIZED VIEW

  • ALTER MATERIALIZED VIEW

 通常情况下,通过 v$im_segments视图查询那些已经启用了列存储的数据库对象:

SELECT OWNER, SEGMENT_NAME, INMEMORY_PRIORITY, INMEMORY_COMPRESSION 
   FROM V$IM_SEGMENTS;
在列存储中,数据可以被压缩,和SQL查询执行直接对压缩的数据。
 IM Column Store压缩方法
CREATE/ALTER Syntax                                             描述
NO MEMCOMPRESS 不压缩
MEMCOMPRESS FOR DML 这种方法优化DML操作和压缩列存储数据以最小比率(包括 no memCompress)。
MEMCOMPRESS FOR QUERY LOW

使用此选项的结果会获得最佳的查询性能。
该方法将存储数据大于memCompress for DML的压缩比但小于memCompress for query high 选项。
,此选项是默认的选项当INMEMORY子句没有指定压缩方法时。

MEMCOMPRESS FOR QUERY HIGH

此选项将为查询提供较好的查询性能。
此方法的压缩比率高于MEMCOMPRESS FOR QUERY LOW但小于MEMCOMPRESS FOR CAPACITY LOW选项。

MEMCOMPRESS FOR CAPACITY LOW  

使用此方法结果是良好的查询性能。

MEMCOMPRESS FOR CAPACITY HIGH  该方法会导致查询结果的公平性。

列存储数据选项
当您启用列存储的数据库对象时,您可以让数据库对象的数据填充在列存储(默认)中,或者您可以指定一个优先级级别来确定在队列中的数据库对象的优先级。Oracle SQL包括内存优先级小节提供人口队列的更多控制。例如,它可能是更重要的或不填充数据库对象的数据填充数据的其他数据库对象的重要。

 列式存储的优先级选项

CREATE/ALTER 语法 描述
PRIORITY NONE


这是默认的级别,不必在语句中显示写出。

PRIORITY LOW

数据被放入列式存储区的优先级高于优先级:PRIORITY NONE。
数据被放入列式存储区的优先级低于优先级:MEDIUMHIGH, CRITICAL.。

PRIORITY MEDIUM 数据被放入列式存储区的优先级高于优先级:NONE,PRIORITY LOW。
数据被放入列式存储区的优先级低于优先级:HIGH, CRITICAL.。
PRIORITY HIGH 数据被放入列式存储区的优先级高于优先级:NONE,LOW,MEDIUM。
数据被放入列式存储区的优先级低于优先级:CRITICAL.。
PRIORITY CRITICAL 系最高的优先级,数据将别最优先的数据放入列式存储区中.

 

与列式存储相关的初始化参数

Initialization Parameter                                                                                           描述
INMEMORY_SIZE  

此初始化参数设置数据库实例中列存储池的大小。
默认值为0,即禁用列式存储。此初始化参数必须设置为一个非零值,以启用列式存储。如果该参数被设置为非零值,那不能小于100m。
在一个多租户环境,在根此参数的设置是针对整个多租户数据库(CDB)设置容器。这个参数也可以设置在每个插入的数据库(PDB)限制每个PDB IM列存储的最大大小。PDB的值可以小于,等于,或大于cdb的大小。除非这个参数为某个特定的pdb设置,这意味着PDB可以使用所有可用IM列存储大小。

 


INMEMORY_FORCE   

 

此初始化参数可以启用列式储存对表和物化视图,或禁用列式存储的对所有表和物化视图。
此参数设置为默认值,默认值,允许,或没有,在单独的数据库对象的属性确定是否将填充在我列存储。
将此参数设置为关闭。

 INMEMORY_CLAUSE_DEFAULT

 此初始化参数使你为新表和物化视图指定一个默认的内存列式存储子句。

 

 INMEMORY_QUERY  这个初始化参数将定义in momory 查询是否被允许。
 INMEMORY_MAX_POPULATE_SERVERS  此参数将定义最大的后台进程个数为列式存储服务,此参数的设置应该根据系统的cpu core 来指定。
 INMEMORY_TRICKLE_REPOPULATE_SERVERS_PERCENT  
 OPTIMIZER_INMEMORY_AWARE  此参数将影响优化器在优化sql执行计划时是否考虑列式存储。将此参数设置为false将使优化器忽略内存列式存储。

在数据库中启用列存储
在表中,表空间,或物化视图启用 列存储功能之前,必须在数据库级别启用IM列存储。
使数据库启用列存储,完成以下步骤:
确保数据库是在12.1.0 或兼容性较高的版本。
1.inmemory_size初始化参数设置为非零值。
2.当你设置这个参数在服务器参数文件(二进制文件)使用ALTER SYSTEM语句,需要指定scope= SPFILE。
3.最小设置为100m。
4.重新启动数据库。

例如

alter system set inmemory_size=100M scope=spfile;
 
System altered.
 
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
 

创建表的时候指定列式存储

CREATE TABLE test_inmem (
     id        NUMBER(5) PRIMARY KEY,
     test_col  VARCHAR2(15))
  INMEMORY;

修改表以启用列式存储

ALTER TABLE oe.product_information INMEMORY;

 为表启用列式存储压缩方式

ALTER TABLE oe.product_information INMEMORY MEMCOMPRESS FOR CAPACITY LOW;

为表定义列式存储优先级

ALTER TABLE oe.product_information INMEMORY PRIORITY HIGH;

完整示例

ALTER TABLE oe.product_information  
   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);

创建表空间的时候启用列式存储

CREATE TABLESPACE tbs1 
   DATAFILE \'tbs1.dbf\' SIZE 40M 
   ONLINE
   DEFAULT INMEMORY;

修改表空间启用列式存储

ALTER TABLESPACE tbs1 DEFAULT INMEMORY 
   MEMCOMPRESS FOR CAPACITY HIGH 
   PRIORITY LOW;

创建物化视图时其用列式存储

CREATE MATERIALIZED VIEW oe.prod_info_mv INMEMORY 
  AS SELECT * FROM oe.product_information;

修改物化视图使用一个列式存储优先级选项

ALTER MATERIALIZED VIEW oe.prod_info_mv INMEMORY PRIORITY HIGH;

  

以上是关于内存列式存储的主要内容,如果未能解决你的问题,请参考以下文章

什么是行式数据库,什么是列式数据库

五大存储模型关系模型键值存储文档存储列式存储图形存储

五大存储模型关系模型键值存储文档存储列式存储图形存储

如何解析列式存储格式的XML文件?

将存储在内存中的文件上传到s3

彻底理解大数据的列式存储