【Oracle】Oracle 12c DB In-Memory入门实验手册(一)

该手册实验基础要在实例级别启用IM column store,开启方法参考上篇文章:

链接:http://blog.csdn.net/badly9/article/details/49724983

(一)基础篇

1.objects开启IM column store

对于objects我们可以使用In-Memory clause来指定是否使用IM column store。这个参数我们可以在Create时进行指定,也可以在创建后使用Alter参数进行指定。同时In-Memory clause参数可以在objectstablespace级别来进行指定。

1.1 In-Memory Clause

首先来看一下使用In-Memory Clause的语句结构:

 

指定INMEMORY属性来开启objectsIM column store,对于已经开启IM column storeobjects可以修改inmemory_parameters

指定NO INMEMORY来禁止objects启用IM column store

INMEMORY_PARAMETERS允许指定附加sub-clauses来扩展objectsIn-Memory定义:

priority:这个属性控制objects载入到column store。当有多个objects需要加载到IM column store中时,根据priority的设置来确定优先级进行加载。

MEMCOMPRESS:这个属性控制了table或者columnsIM column store中的压缩级别。默认情况下,数据在IM column store中采用FOR QUERY LOW压缩级别来保证在压缩比和性能方面的平衡。

DUPLICATE:在RAC场景中,每个数据库节点有自己的IM column store。同一个objects可以以副本的形式存在于每一个节点的IM column store中。这个参数的默认值为NO DUPLICATE。这个参数仅仅在EXADATA环境中有效。在单实例和非EXADATA中这个属性不生效。

DISTRIBUTE:这个属性在RAC环境中有效。如果一个objects非常大,无法被加载到一个节点上的IM column store上时,可以分成几个数据片来分别放到rac的几个节点上。这个属性的默认值为AUTO-DISTRIBUTE。由Oracle自己来决定大的objects如何在几个节点的IM column store中进行分布。在单实例中这个参数无效。

 

对于使用了In-Memory clauseobjectsIM属性会被四个原有的数据字典捕获,分别是:*_tables,*segments,*_tab_partitions,*_tab_sub_partitions。同时在视图V$IM_SEGMENTSV$IM_USER_SEGMENTS中也可进行查看,在以上的数据字典和动态视图中,IM相关属性被分为以下四列:

INMEMORY:用于指示是否objectsINMEMORY还是NO INMEMORY,对应这一列的值分别为ENABLEDISABLED

INMEMORY_PRIORITY:用于指示该objects PRIORITY的属性。值分别为:NONELOWMEDIUMHIGHCRITICAL

INMEMORY_COMPRESSION:这个属性对应着objects inmemory_parametersMEMCOMPRESS属性。

INMEMORY_DUPLICATEINMEMORY_DISTRIBUTE:这两个分别对应着objects inmemory_parametersDUPLICATEDISTRIBUTE属性。

 

下面通过实验来看一下简单的将一个表放入到In-Memory Area中,并修改它的优先级。

实验过程如下:

 

1.创建一个测试表,赋予INMEMORY属性:

SQL> conn badly9/badly9

Connected.

SQL> CREATE TABLE PARTS (

  2  PART_ID NUMBER,

  3  NAME VARCHAR2(100),

  4  MFR VARCHAR2(50),

  5  CATEGORY VARCHAR2(30),

  6  BRAND VARCHAR2(50)) INMEMORY;

 

Table created.

2.通过user_tables查看该表的IM相关属性:

SQL> SELECT INMEMORY, INMEMORY_PRIORITY, INMEMORY_COMPRESSION,

  2  INMEMORY_DISTRIBUTE, INMEMORY_DUPLICATE

  3  FROM USER_TABLES

  4  WHERE TABLE_NAME = 'PARTS';

 

INMEMORY INMEMORY INMEMORY_COMPRESS INMEMORY_DISTRI INMEMORY_DUPL

-------- -------- ----------------- --------------- -------------

ENABLED  NONE     FOR QUERY LOW     AUTO            NO DUPLICATE

根据上边给出的各个列的属性,我们可以看到PARTS表启用了IM column storePRIORITY级别为NONECOMPRESS 级别为FOR QUERY LOWDISTRIBUTE值为AUTO,未启用DUPLICATE特性。

3.修改PRIORITY级别

语法如下:

ALTER TABLE ... INMEMORY PRIORTITY {NONE|LOW|MEDIUM|HIGE|CRITICAL}

SQL> alter table parts inmemory priority high;

 

Table altered.

4.再来看一下parts表的In-Memory属性:

SQL> SELECT INMEMORY, INMEMORY_PRIORITY, INMEMORY_COMPRESSION,

  2  INMEMORY_DISTRIBUTE, INMEMORY_DUPLICATE

  3  FROM USER_TABLES

  4  WHERE TABLE_NAME = 'PARTS';

 

INMEMORY INMEMORY INMEMORY_COMPRESS INMEMORY_DISTRI INMEMORY_DUPL

-------- -------- ----------------- --------------- -------------

ENABLED  HIGH     FOR QUERY LOW     AUTO            NO DUPLICATE

可以看到此时INMEMORY_PRIORITY属性已经被调整为HIGH。其他属性的调整方法类似,具体可变化值参考官档。

 

1.2 in-memory column clause

对于表和物化视图,in-memory clause还有一个允许附加的sub-clause叫做in-memory column clause。可以用来控制表的某些列开启和关闭IM column store,对某一列更改compress级别(可以对某一列使用和整表不同的压缩级别)。

 【Oracle】Oracle 12c DB In-Memory入门实验手册(一)_第1张图片

对于列的IM属性,我们可以通过视图V$IM_COLUMN_LEVEL来查看列的compress属性。这个视图只有compress属性,没有PRIORITYDUPLICATEDISTRIBUTE属性。

举例说明,去开启一个已存在表的IM column store,你可以使用ALTER table语句进行更改它的INMEMORY属性,例如:

ALTER TABLE ... INMEMORY (col1)

ALTER TABLE ... INMEMORY (col1,col2)

ALTER TABLE ... NO INMEMORY (col1,col2)

ALTER TABLE ... INMEMORY MEMCOMPRESS QUERY LOW (col1)

ALTER TABLE ... INMEMORY MEMCOMPRESS QUERY HIGH (col2)

             NO INMEMORY (col3)

             INMEMORY PRIORITY HIGH

 

实验过程:

1.查看测试表的IM属性:

SQL> SELECT INMEMORY, INMEMORY_PRIORITY, INMEMORY_COMPRESSION,

  2  INMEMORY_DISTRIBUTE, INMEMORY_DUPLICATE

  3  FROM USER_TABLES

  4  WHERE TABLE_NAME = 'PROMOTIONS';

 

INMEMORY INMEMORY INMEMORY_COMPRESS INMEMORY_DISTRI INMEMORY_DUPL

-------- -------- ----------------- --------------- -------------

DISABLED

2.查看测试表表结构

SQL> DESC PROMOTIONS

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 PROMO_ID                                  NOT NULL NUMBER(6)

 PROMO_NAME                                NOT NULL VARCHAR2(30)

 PROMO_SUBCATEGORY                         NOT NULL VARCHAR2(30)

 PROMO_SUBCATEGORY_ID                      NOT NULL NUMBER

 PROMO_CATEGORY                            NOT NULL VARCHAR2(30)

 PROMO_CATEGORY_ID                         NOT NULL NUMBER

 PROMO_COST                                NOT NULL NUMBER(10,2)

 PROMO_BEGIN_DATE                          NOT NULL DATE

 PROMO_END_DATE                            NOT NULL DATE

 PROMO_TOTAL                               NOT NULL VARCHAR2(15)

 PROMO_TOTAL_ID                            NOT NULL NUMBER

3.将测试表中一些列开始IM column store需要注意的是不开启IM column store的列需要加入到NO INMEMORY中,否则这些列默认也会开启INMEMORY。同时在某些列开启IM column store之前整张表也要开启IM column store,否则执行语句会报错

SQL> ALTER TABLE PROMOTIONS INMEMORY

  2  INMEMORY (PROMO_NAME, PROMO_CATEGORY, PROMO_COST, PROMO_TOTAL)

  3  NO INMEMORY (PROMO_ID, PROMO_CATEGORY_ID, PROMO_SUBCATEGORY_ID);

 

Table altered.

4.查看测试表的IM属性:

SQL> SELECT INMEMORY, INMEMORY_PRIORITY, INMEMORY_COMPRESSION,

  2  INMEMORY_DISTRIBUTE, INMEMORY_DUPLICATE

  3  FROM USER_TABLES

  4  WHERE TABLE_NAME = 'PROMOTIONS';

 

INMEMORY INMEMORY INMEMORY_COMPRESS INMEMORY_DISTRI INMEMORY_DUPL

-------- -------- ----------------- --------------- -------------

ENABLED  NONE     FOR QUERY LOW     AUTO            NO DUPLICATE

可以看到从这里可以看到整张表都开启了IM column store,如果需要知道具体哪些列开启了IM column store则需要到V$IM_COLUMN_LEVEL中进行查看

5.查看测试表列的IM属性:

SQL> SELECT TABLE_NAME, COLUMN_NAME, INMEMORY_COMPRESSION

  2  FROM V$IM_COLUMN_LEVEL

  3  WHERE TABLE_NAME = 'PROMOTIONS';

 

TABLE_NAME                      COLUMN_NAME                     INMEMORY_COMPRESSION

------------------------------- ------------------------------- --------------------------

PROMOTIONS                      PROMO_ID                        NO INMEMORY

PROMOTIONS                      PROMO_NAME                      DEFAULT

PROMOTIONS                      PROMO_SUBCATEGORY               DEFAULT

PROMOTIONS                      PROMO_SUBCATEGORY_ID            NO INMEMORY

PROMOTIONS                      PROMO_CATEGORY                  DEFAULT

PROMOTIONS                      PROMO_CATEGORY_ID               NO INMEMORY

PROMOTIONS                      PROMO_COST                      DEFAULT

PROMOTIONS                      PROMO_BEGIN_DATE                DEFAULT

PROMOTIONS                      PROMO_END_DATE                  DEFAULT

PROMOTIONS                      PROMO_TOTAL                     DEFAULT

PROMOTIONS                      PROMO_TOTAL_ID                  DEFAULT

 

11 rows selected.

可以看到从这个视图中可以准确的看到哪些列开启了IM,哪些列没有开启IM

 

1.3 NO INMEMORY clause

可以开启就可以关闭,那么关闭表的IM column store可以通过NO INMEMORY clause来实现。

具体语句如下:

ALTER TABLE ... NO INMEMORY

实验过程如下:

1.关闭IM column store

SQL> ALTER TABLE PROMOTIONS NO INMEMORY;

 

Table altered.

2.查询相关视图

SQL> SELECT INMEMORY, INMEMORY_PRIORITY, INMEMORY_COMPRESSION,

  2  INMEMORY_DISTRIBUTE, INMEMORY_DUPLICATE

  3  FROM USER_TABLES

  4  WHERE TABLE_NAME = 'PROMOTIONS';

 

INMEMORY INMEMORY INMEMORY_COMPRESS INMEMORY_DISTRI INMEMORY_DUPL

-------- -------- ----------------- --------------- -------------

DISABLED

SQL> SET LINES 100;

SQL> SELECT TABLE_NAME, COLUMN_NAME, INMEMORY_COMPRESSION

  2  FROM V$IM_COLUMN_LEVEL

  3  WHERE TABLE_NAME = 'PROMOTIONS';

 

no rows selected

 

2 tablespace级别开启IM column store

我们除了可以对单个objects开启IM,也可以对整个表空间使用in-memory clause来更改表空间的默认属性,可以通过create也可以通过alter

举例说明,通过alter语句修改tablespaceIM属性:

Ø ALTER TABLESPACE ... DEFAULT INMEMORY

Ø ALTER TABLESPACE ... DEFAULT INMEMORY MEMCOMPRESS QUERY HIGH

Ø ALTER TABLESPACE ... DEFAULT INMEMORY PRIORITY LOW

一旦手工指定了tablespacein-memory clause,则在该表空间内创建表和物化视图,如果没有手动指定IM属性,则将继承tablespaceIM属性,只对更改tablespaceIM属性之后新建的表和物化视图生效。如果在表或物化视图创建时手工指定了IM属性,则最终属性为手工指定的属性。

 

实验过程如下:

1.查看测试表空间IM属性:

SQL> SELECT DEF_INMEMORY, DEF_INMEMORY_PRIORITY,

  2  DEF_INMEMORY_COMPRESSION, DEF_INMEMORY_DISTRIBUTE,

  3  DEF_INMEMORY_DUPLICATE

  4  FROM DBA_TABLESPACES

  5  WHERE TABLESPACE_NAME = 'TBS_TEST';

 

DEF_INME DEF_INME DEF_INMEMORY_COMP DEF_INMEMORY_DI DEF_INMEMORY_

-------- -------- ----------------- --------------- -------------

DISABLED

2.更改测试表空间的IM属性

SQL> ALTER TABLESPACE TBS_TEST DEFAULT INMEMORY

  2  MEMCOMPRESS FOR CAPACITY HIGH PRIORITY LOW;

 

Tablespace altered.

3.查看更改后的表空间IM属性

SQL> SELECT DEF_INMEMORY, DEF_INMEMORY_PRIORITY,

  2  DEF_INMEMORY_COMPRESSION, DEF_INMEMORY_DISTRIBUTE,

  3  DEF_INMEMORY_DUPLICATE

  4  FROM DBA_TABLESPACES

  5  WHERE TABLESPACE_NAME = 'TBS_TEST';

 

DEF_INME DEF_INME DEF_INMEMORY_COMP DEF_INMEMORY_DI DEF_INMEMORY_

-------- -------- ----------------- --------------- -------------

ENABLED  LOW      FOR CAPACITY HIGH AUTO            NO DUPLICATE

4.在该表空间创建测试表parts2,不设置IM属性

SQL> CREATE TABLE PARTS2 (

  2  PART_ID NUMBER,

  3  NAME VARCHAR2(100),

  4  MFR VARCHAR2(50),

  5  CATEGORY VARCHAR2(30),

  6  BRAND VARCHAR2(50)) tablespace TBS_TEST;

 

Table created.

5.查看测试表parts2的属性

SQL> SELECT INMEMORY, INMEMORY_PRIORITY, INMEMORY_COMPRESSION,

  2  INMEMORY_DISTRIBUTE, INMEMORY_DUPLICATE

  3  FROM USER_TABLES

  4  WHERE TABLE_NAME = 'PARTS2';

 

INMEMORY INMEMORY INMEMORY_COMPRESS INMEMORY_DISTRI INMEMORY_DUPL

-------- -------- ----------------- --------------- -------------

ENABLED  LOW      FOR CAPACITY HIGH AUTO            NO DUPLICATE

6.创建测试表parts3,设置IM属性

SQL> CREATE TABLE PARTS3 (

  2  PART_ID NUMBER,

  3  NAME VARCHAR2(100),

  4  MFR VARCHAR2(50),

  5  CATEGORY VARCHAR2(30),

  6  BRAND VARCHAR2(50))

  7  INMEMORY MEMCOMPRESS FOR QUERY HIGH PRIORITY HIGH

  8  TABLESPACE TBS_TEST;

 

Table created.

7.查看测试表parts3IM属性

SQL> SELECT INMEMORY, INMEMORY_PRIORITY, INMEMORY_COMPRESSION,

  2  INMEMORY_DISTRIBUTE, INMEMORY_DUPLICATE

  3  FROM USER_TABLES

  4  WHERE TABLE_NAME = 'PARTS3';

 

INMEMORY INMEMORY INMEMORY_COMPRESS INMEMORY_DISTRI INMEMORY_DUPL

-------- -------- ----------------- --------------- -------------

ENABLED  HIGH     FOR QUERY HIGH    AUTO            NO DUPLICATE

8.关闭tablespace TBS_TESTIM column store

SQL> ALTER TABLESPACE TBS_TEST DEFAULT NO INMEMORY;

 

Tablespace altered.

9.查看tablespace TBS_TESTIM属性

SQL> SELECT DEF_INMEMORY, DEF_INMEMORY_PRIORITY,

  2  DEF_INMEMORY_COMPRESSION, DEF_INMEMORY_DISTRIBUTE,

  3  DEF_INMEMORY_DUPLICATE

  4  FROM DBA_TABLESPACES

  5  WHERE TABLESPACE_NAME = 'TBS_TEST';

 

DEF_INME DEF_INME DEF_INMEMORY_COMP DEF_INMEMORY_DI DEF_INMEMORY_

-------- -------- ----------------- --------------- -------------

DISABLED

10.查看已建立的表的IM属性

SQL> SELECT INMEMORY, INMEMORY_PRIORITY, INMEMORY_COMPRESSION,

  2  INMEMORY_DISTRIBUTE, INMEMORY_DUPLICATE

  3  FROM USER_TABLES

  4  WHERE TABLE_NAME IN ('PARTS2','PARTS3');

 

INMEMORY INMEMORY INMEMORY_COMPRESS INMEMORY_DISTRI INMEMORY_DUPL

-------- -------- ----------------- --------------- -------------

ENABLED  HIGH     FOR QUERY HIGH    AUTO            NO DUPLICATE

ENABLED  LOW      FOR CAPACITY HIGH AUTO            NO DUPLICATE

可以看到修改tablespaceIM属性并不会导致已建立表的IM属性发生修改。

 

3 数据库参数inmemory_clause_default的使用

通过对于INMEMORY_CLAUSE_DEFAULT参数的设置,可以为库中新建的表或物化视图指定一个默认的IM column store clause

该参数默认为空,代表INMEMORY_CLAUSE_DEFAULT被禁用,和设置为NO INMEMORY一个效果。

如果设置了该参数,所有新建的表和物化视图如果没有设置IM clause或者没有设置某个inmemory_parameter相应的IM clause,都会按照该参数的设置添加INMEMORY条件。说的有点乱,还是举例说明,如果该参数被设置成MEMCOMPRESS FOR CAPACITY LOW,新创建的表的IM clauseINMEMORY PRIORITY HIGH,则这个表实际被创建时的IM条件为INMEMORY MEMCOMPRESS FOR CAPACITY LOW PRIORITY HIGH。但是如果该表创建时使用了NO INMEMORY属性,则不会和INMEMORY_CLAUSE_DEFAULT进行叠加。

 

实验过程如下:

1.使用dba用户登录:

[oracle@badly9 ~]$ sqlplus / as sysdba

2.更改INMEMORY_CLAUSE_DEFAULT参数:

SQL> ALTER SYSTEM SET INMEMORY_CLAUSE_DEFAULT = "MEMCOMPRESS FOR QUERY HIGH" SCOPE=BOTH;

 

System altered.

3.登陆到测试用户并创建测试表test_tab

SQL> conn badly9/badly9

Connected.

SQL> CREATE TABLE TEST_TAB (COL1 NUMBER) INMEMORY PRIORITY HIGH;

 

Table created.

4.查看测试表test_tabIM属性

SQL> SELECT INMEMORY, INMEMORY_PRIORITY, INMEMORY_COMPRESSION,

  2  INMEMORY_DISTRIBUTE, INMEMORY_DUPLICATE

  3  FROM USER_TABLES

  4  WHERE TABLE_NAME = 'TEST_TAB';

 

INMEMORY INMEMORY INMEMORY_COMPRESS INMEMORY_DISTRI INMEMORY_DUPL

-------- -------- ----------------- --------------- -------------

ENABLED  HIGH     FOR QUERY HIGH    AUTO            NO DUPLICATE

可以看到,此时该测试表的IM属性是由表创建时指定的IM属性和INMEMORY_CLAUSE_DEFAULT叠加之后的结果。

5.创建测试表test_tab2

SQL> CREATE TABLE TEST_TAB2 (COL1 NUMBER) INMEMORY MEMCOMPRESS FOR CAPACITY LOW;

 

Table created.

6.查看测试表test_tab2IM属性

SQL> SELECT INMEMORY, INMEMORY_PRIORITY, INMEMORY_COMPRESSION,

  2  INMEMORY_DISTRIBUTE, INMEMORY_DUPLICATE

  3  FROM USER_TABLES

  4  WHERE TABLE_NAME = 'TEST_TAB2';

 

INMEMORY INMEMORY INMEMORY_COMPRESS INMEMORY_DISTRI INMEMORY_DUPL

-------- -------- ----------------- --------------- -------------

ENABLED  NONE     FOR CAPACITY LOW  AUTO            NO DUPLICATE

可以看到当建表语句中的IM属性和INMEMORY_CLAUSE_DEFAULT定义产生冲突时,会按照建表语句中的属性来执行。

9.建立测试表TEST_TAB3

SQL> CREATE TABLE TEST_TAB3 (COL1 NUMBER) NO INMEMORY TABLESPACE TBS_TEST;

 

Table created.

10.查看测试表TEST_TAB3IM属性

SQL> SELECT INMEMORY, INMEMORY_PRIORITY, INMEMORY_COMPRESSION,

  2  INMEMORY_DISTRIBUTE, INMEMORY_DUPLICATE

  3  FROM USER_TABLES

  4  WHERE TABLE_NAME = 'TEST_TAB3';

 

INMEMORY INMEMORY INMEMORY_COMPRESS INMEMORY_DISTRI INMEMORY_DUPL

-------- -------- ----------------- --------------- -------------

DISABLED

11.清除测试数据及设置:

DROP TABLE TEST_TAB;

DROP TABLE TEST_TAB2;

DROP TABLE TEST_TAB3;

ALTER SYSTEM SET INMEMORY_CLAUSE_DEFAULT = '' SCOPE=BOTH;

 

 

 

 

 

你可能感兴趣的:(DB,12c,In-Memory)