内存列式存储(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 QUERY HIGH |
此选项将为查询提供较好的查询性能。 |
MEMCOMPRESS FOR CAPACITY LOW |
使用此方法结果是良好的查询性能。 |
MEMCOMPRESS FOR CAPACITY HIGH | 该方法会导致查询结果的公平性。 |
列存储数据选项
当您启用列存储的数据库对象时,您可以让数据库对象的数据填充在列存储(默认)中,或者您可以指定一个优先级级别来确定在队列中的数据库对象的优先级。Oracle SQL包括内存优先级小节提供人口队列的更多控制。例如,它可能是更重要的或不填充数据库对象的数据填充数据的其他数据库对象的重要。
列式存储的优先级选项
CREATE/ALTER 语法 | 描述 |
PRIORITY NONE |
|
PRIORITY LOW |
数据被放入列式存储区的优先级高于优先级:PRIORITY NONE。 |
PRIORITY MEDIUM | 数据被放入列式存储区的优先级高于优先级:NONE,PRIORITY LOW。 数据被放入列式存储区的优先级低于优先级:
HIGH , CRITICAL .。 |
PRIORITY HIGH | 数据被放入列式存储区的优先级高于优先级:NONE,LOW,MEDIUM。 数据被放入列式存储区的优先级低于优先级:
CRITICAL .。 |
PRIORITY CRITICAL | 系最高的优先级,数据将别最优先的数据放入列式存储区中. |
与列式存储相关的初始化参数
Initialization Parameter | 描述 |
INMEMORY_SIZE |
此初始化参数设置数据库实例中列存储池的大小。 |
|
此初始化参数可以启用列式储存对表和物化视图,或禁用列式存储的对所有表和物化视图。 |
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;