Oracle12c中效能最佳化&功能增強新特性之重大突破——記憶體列儲存新特性

sqysl發表於2016-06-14

Oracle12c中記憶體列儲存

記憶體列儲存(IM column store) 是Oracle12.1.0.2版本的主要特點。該特點允許列,表,分割槽和物化檢視在記憶體中以列格式儲存,而不是通常的行格式。資料存在記憶體中的好處顯而易見,而列格式儲存非常適合商務智慧(BI)產品中的分析查詢。

列儲存是Oracle企業版的獨立許可選項。

1.   簡介

記憶體列儲存在SGA中是一個新部分,透過初始化引數INMEMORY_SIZE指定大小。可以選擇確定的列,整個表,物化檢視或表分割槽組合儲存在該部分。或者,你也可以在表空間層啟用記憶體列儲存,從而該表空間中的所有表和物化檢視自動啟用記憶體列儲存。已對下列命令進行了修改以包括另外的in-memory子句。

CREATE TABLE

ALTER TABLE

CREATE TABLESPACE

ALTER TABLESPACE

CREATE MATERIALIZED VIEW

ALTER MATERIALIZED VIEW

常規用例將在後面展示。

文件中說到如下場景適合記憶體列儲存。

  • 使用"=", "<", ">" and "IN"謂詞的大資料量掃描。
  • 只返回很多列的表的少數列的查詢。
  • 連線小表和大表的查詢。
  • 匯聚資料的查詢。

文件也提到該特性不適合以下場景。

  • 有複雜謂詞的查詢。
  • 返回大量列的查詢。
  • 返回大量行的查詢。
  • 多個大表連線的查詢。

從上可知,需記住的最重要的事是要為決定哪些物件將從中受益負責。如果決定正確,你將看到效能的巨大提升。如果決定錯誤,你將浪費掉本可被緩衝區使用的大量記憶體。

2.   開啟記憶體列儲存

記住,記憶體列儲存是SGA的一部分,因此,SGA必須能包含你指定的NMEMORY_SIZE引數。在多宿主庫環境中,如果任何PDB需要存取記憶體列儲存,INMEMORY_SIZE引數必須在CDB中設定。

1)    如果你正使用AMM (MEMORY_TARGET),將必須擴充套件它以適應INMEMORY_SIZE引數值。

2)    如果你正使用ASMM (SGA_TARGET),將必須擴充套件它以適應INMEMORY_SIZE引數值。

假定COMPATIBLE引數設定成12.1.0或更高,且SGA總有足夠的空間容納記憶體列儲存,下列過程將開啟記憶體列儲存。這裡設定INMEMORY_SIZE引數為2G。

ALTER SYSTEM SET SGA_TARGET=3G SCOPE=SPFILE;

ALTER SYSTEM SET INMEMORY_SIZE=2GSCOPE=SPFILE;

SHUTDOWN IMMEDIATE;

STARTUP;

 

ORACLE instance started.

 

Total System Global Area 3221225472 bytes

Fixed Size                  2929552 bytes

Variable Size             419433584 bytes

Database Buffers          637534208 bytes

Redo Buffers               13844480 bytes

In-Memory Area           2147483648 bytes

Database mounted.

Database opened.

SQL>

注意,啟動期間會顯示"In-Memory Area"行。

當前IM相關設定將被如下顯示。除了大小,所有其他相關引數均為預設值。

SQL> SHOW PARAMETER INMEMORY

 

NAME                                 TYPE        VALUE

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

inmemory_clause_default              string

inmemory_force                       string      DEFAULT

inmemory_max_populate_servers        integer     1

inmemory_query                       string      ENABLE

inmemory_size                        big integer 2G

inmemory_trickle_repopulate_servers_integer     1

percent

optimizer_inmemory_aware             boolean     TRUE

SQL>

除非在PDB級別顯式設定INMEMORY_SIZE引數,否則,該引數設定將被所有PDB繼承。在PDB級別改變INMEMORY_SIZE引數並不要求重啟例項或PDB。

CONN sys@pdb1 AS SYSDBA

-- Disable IM column store in the PDB

ALTER SYSTEM SET INMEMORY_SIZE=0;

-- OR

ALTER SYSTEM RESET INMEMORY_SIZE;

 

-- Assign a PDB-specific size.

ALTER SYSTEM SET INMEMORY_SIZE=1G;

3.   關閉記憶體列

根據你的目的,有多種關閉記憶體列儲存的方法。

設定INMEMORY_FORCE引數為"OFF"意味著物件不再被儲存在記憶體列儲存中,將其切換回"DEFAULT"將恢復其預設的行為。

-- System level

ALTER SYSTEM SET INMEMORY_FORCE=OFF;

ALTER SYSTEM SET INMEMORY_FORCE=DEFAULT;

設定INMEMORY_QUERY引數為"DISABLE"意味著最佳化器最佳化查詢時將不再考慮記憶體列儲存。將其切換回"ENABLE"將恢復其預設功能。

-- System level

ALTER SYSTEM SET INMEMORY_QUERY=DISABLE;

ALTER SYSTEM SET INMEMORY_QUERY=ENABLE;

 

-- Session level

ALTER SESSION SET INMEMORY_QUERY=DISABLE;

ALTER SESSION SET INMEMORY_QUERY=ENABLE;

為了完全禁用記憶體列儲存且釋放記憶體,只需重置INMEMORY_SIZE引數。

ALTER SYSTEM RESET INMEMORY_SIZESCOPE=SPFILE;

SHUTDOWN IMMEDIATE;

STARTUP;

就像前面說的,可以更改PDB級別的設定且不需要例項或PDB重啟。

4.   管理表

 CREATE TABLE和ALTER TABLE命令已被改進,因此,你可以決定表是否要儲存在記憶體列儲存中。以NO INMEMORY子句建立的表和不確定子句是一樣的。下面的例子將展示用三種語法建立的三個表。

檢視[DBA|ALL|USER]_TABLES已經被改進來包含記憶體列儲存相關的資訊。

CONN test/test@pdb1

 

CREATE TABLE im_tab (

 id  NUMBER

) INMEMORY;

 

CREATE TABLE noim_tab (

 id  NUMBER

) NO INMEMORY;

 

CREATE TABLE default_tab (

 id  NUMBER

);

 

COLUMN table_name FORMAT A20

 

SELECT table_name,

      inmemory,

      inmemory_priority,

      inmemory_distribute,

      inmemory_compression,

      inmemory_duplicate 

FROM  user_tables

ORDER BY table_name;

 

TABLE_NAME           INMEMORY INMEMORY INMEMORY_DISTRIINMEMORY_COMPRESS INMEMORY_DUPL

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

DEFAULT_TAB          DISABLED

IM_TAB               ENABLED  NONE    AUTO            FOR QUERY LOW     NO DUPLICATE

NOIM_TAB             DISABLED

 

3 rows selected.

 

SQL>

ALTER TABLE命令可以改變物件記憶體列儲存方面的狀態。下例容易的改變記憶體列儲存的狀態。

ALTER TABLE IM_TAB NO INMEMORY;

ALTER TABLE NOIM_TAB INMEMORY MEMCOMPRESS FORCAPACITY LOW;

ALTER TABLE DEFAULT_TAB INMEMORY PRIORITYHIGH;

 

SELECT table_name,

      inmemory,

      inmemory_priority,

      inmemory_distribute,

      inmemory_compression,

      inmemory_duplicate 

FROM  user_tables

ORDER BY table_name;

 

TABLE_NAME           INMEMORY INMEMORY INMEMORY_DISTRIINMEMORY_COMPRESS INMEMORY_DUPL

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

DEFAULT_TAB          ENABLED  HIGH    AUTO            FOR QUERY LOW     NO DUPLICATE

IM_TAB               DISABLED

NOIM_TAB             ENABLED  NONE    AUTO            FOR CAPACITY LOW  NO DUPLICATE

 

3 rows selected.

 

SQL>

5.   管理列

下例展示將部分列放進記憶體列儲存的語法。

CREATE TABLE im_col_tab (

 id   NUMBER,

  col1NUMBER,

  col2NUMBER,

  col3NUMBER,

  col4NUMBER

) INMEMORY

INMEMORY MEMCOMPRESS FOR QUERY HIGH (col1,col2)

INMEMORY MEMCOMPRESS FOR CAPACITY HIGH (col3)

NO INMEMORY (id, col4);

透過查詢檢視V$IM_COLUMN_LEVEL來獲取列設定的相關資訊。

CONN sys@pdb1 AS SYSDBA

 

SELECT table_name,

      segment_column_id,

      column_name,

      inmemory_compression

FROM  v$im_column_level

WHERE owner = 'TEST'

and   table_name = 'IM_COL_TAB'

ORDER BY segment_column_id;

 

TABLE_NAME           SEGMENT_COLUMN_ID COLUMN_NAME                     INMEMORY_COMPRESSION

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

IM_COL_TAB                           1 ID                              NO INMEMORY

IM_COL_TAB                           2 COL1                            FOR QUERY HIGH

IM_COL_TAB                           3 COL2                            FOR QUERY HIGH

IM_COL_TAB                           4 COL3                            FOR CAPACITY HIGH

IM_COL_TAB                           5 COL4                            NO INMEMORY

 

5 rows selected.

 

SQL>

可以用ALTER TABLE命令改變記憶體列儲存的設定。

CONN test/test@pdb1

 

ALTER TABLE im_col_tab

NO INMEMORY (col1, col2)

INMEMORY MEMCOMPRESS FOR CAPACITY HIGH (col3)

NO INMEMORY (id, col4);

 

CONN sys@pdb1 AS SYSDBA

 

SELECT table_name,

      segment_column_id,

      column_name,

      inmemory_compression

FROM  v$im_column_level

WHERE owner = 'TEST'

and   table_name = 'IM_COL_TAB'

ORDER BY segment_column_id;

 

TABLE_NAME           SEGMENT_COLUMN_ID COLUMN_NAME                     INMEMORY_COMPRESSION

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

IM_COL_TAB                           1 ID                              NO INMEMORY

IM_COL_TAB                           2 COL1                            NO INMEMORY

IM_COL_TAB                           3 COL2                            NO INMEMORY

IM_COL_TAB                           4 COL3                            FOR CAPACITY HIGH

IM_COL_TAB                           5 COL4                            NO INMEMORY

 

5 rows selected.

 

SQL>

6.   管理物化檢視

CREATE MATERIALIZED VIEW和ALTER MATERIALIZED VIEW命令和 CREATE TABLE and ALTER TABLE命令類似。

CONN test/test@pdb1

 

CREATE TABLE t1 AS

 SELECT * FROM all_objects;

 

CREATE MATERIALIZED VIEW t1_mv INMEMORY

  ASSELECT * FROM t1;

 

SELECT table_name,

      inmemory,

      inmemory_priority,

      inmemory_distribute,

      inmemory_compression,

      inmemory_duplicate 

FROM  user_tables

WHERE table_name = 'T1_MV';

 

TABLE_NAME           INMEMORY INMEMORY INMEMORY_DISTRIINMEMORY_COMPRESS INMEMORY_DUPL

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

T1_MV                ENABLED  NONE    AUTO            FOR QUERY LOW     NO DUPLICATE

 

1 row selected.

 

SQL>

 

 

ALTER MATERIALIZED VIEW t1_mv

 INMEMORY MEMCOMPRESS FOR CAPACITY HIGH PRIORITY HIGH;

 

SELECT table_name,

      inmemory,

      inmemory_priority,

      inmemory_distribute,

      inmemory_compression,

      inmemory_duplicate 

FROM  user_tables

WHERE table_name = 'T1_MV';

 

TABLE_NAME           INMEMORY INMEMORY INMEMORY_DISTRIINMEMORY_COMPRESS INMEMORY_DUPL

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

T1_MV                ENABLED  HIGH    AUTO            FOR CAPACITY HIGHNO DUPLICATE

 

1 row selected.

 

SQL>

 

 

ALTER MATERIALIZED VIEW t1_mv NO INMEMORY;

 

SELECT table_name,

      inmemory,

      inmemory_priority,

      inmemory_distribute,

      inmemory_compression,

      inmemory_duplicate 

FROM  user_tables

WHERE table_name = 'T1_MV';

 

TABLE_NAME           INMEMORY INMEMORY INMEMORY_DISTRIINMEMORY_COMPRESS INMEMORY_DUPL

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

T1_MV                DISABLED

 

1 row selected.

 

SQL>

7.   管理表空間

設定表空間的預設記憶體列儲存引數意味著該表空間內的所有表和物化檢視將使用那些設定,顯示覆蓋情況除外。

下列將展示如何在表空間建立期間設定記憶體列儲存引數。關鍵字DEFAULT是記憶體列儲存子句的一部分。預設記憶體列儲存設定可以查詢DBA_TABLESPACES檢視檢視。

CONN sys@pdb1 AS SYSDBA

 

CREATE TABLESPACE new_ts

  DATAFILE '/u01/app/oracle/oradata/CDB1/datafile/pdb1/pdb1_new_ts.dbf'SIZE 10M

  DEFAULT INMEMORY;

 

SELECT tablespace_name,

      def_inmemory,

       def_inmemory_priority,

      def_inmemory_distribute,

      def_inmemory_compression,

      def_inmemory_duplicate

FROM  dba_tablespaces

ORDER BY tablespace_name;

 

TABLESPACE_NAME                DEF_INME DEF_INMEDEF_INMEMORY_DI DEF_INMEMORY_COMP DEF_INMEMORY_

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

NEW_TS                         ENABLED  NONE    AUTO            FOR QUERY LOW     NO DUPLICATE

SYSAUX                         DISABLED

SYSTEM                        DISABLED

TEMP                           DISABLED

USERS                          DISABLED

 

5 rows selected.

 

SQL>

ALTER TABLESPACE命令用來修改記憶體列儲存引數。

ALTER TABLESPACE new_ts

 DEFAULT INMEMORY MEMCOMPRESS FOR CAPACITY HIGH;

 

SELECT tablespace_name,

      def_inmemory,

      def_inmemory_priority,

      def_inmemory_distribute,

      def_inmemory_compression,

      def_inmemory_duplicate

FROM  dba_tablespaces

ORDER BY tablespace_name;

 

TABLESPACE_NAME                DEF_INME DEF_INMEDEF_INMEMORY_DI DEF_INMEMORY_COMP DEF_INMEMORY_

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

NEW_TS                         ENABLED  NONE    AUTO            FOR CAPACITY HIGHNO DUPLICATE

SYSAUX                         DISABLED

SYSTEM                         DISABLED

TEMP                           DISABLED

USERS                          DISABLED

 

SQL>

 

 

ALTER TABLESPACE new_ts

 DEFAULT NO INMEMORY;

 

SELECT tablespace_name,

      def_inmemory,

      def_inmemory_priority,

      def_inmemory_distribute,

      def_inmemory_compression,

      def_inmemory_duplicate

FROM  dba_tablespaces

ORDER BY tablespace_name;

 

TABLESPACE_NAME                DEF_INME DEF_INMEDEF_INMEMORY_DI DEF_INMEMORY_COMP DEF_INMEMORY_

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

NEW_TS                         DISABLED

SYSAUX                         DISABLED

SYSTEM                         DISABLED

TEMP                           DISABLED

USERS                          DISABLED

 

5 rows selected.

 

SQL>

表空間預設設定能被上面展示的物件級的設定覆蓋。

8.   檢視

我們已看到,有些之前的檢視已經被修改以便包括記憶體列儲存資訊。下列V$檢視已經增加了記憶體列儲存相關的資訊。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8484829/viewspace-2120161/,如需轉載,請註明出處,否則將追究法律責任。

相關文章