Oracle database 12c New Features for administrators

作   者: 申建忠 精誠資訊 恆逸教育訓練中心 資深講師
技術分類:Oracle資料庫

Oralce database 12c New Features for administrators

Oracle 12c(12.1.0.2)開始,提供一個新功能In-Memory Option,讓Oracle Database同時擁有Row-Based/Column-Based兩種儲存格式,但卻不用對現有應用程式進行任何變動即可使用此功能。DBA只要事先設定In-Memory Column Store大小,與決定哪些表格/欄位需要另外以column-based方式儲存,其他工作就交由Oracle Server自行操作即可。

本文係針對Oracle Database 12c In-Memory Option所進行的初步說明。 --確定所安裝的版本,必須為12.1.0.2以上才支援In-Memory選項

SQL> select banner from v$version;
BANNER
------------------------------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
PL/SQL Release 12.1.0.2.0 - Production
CORE 12.1.0.2.0    Production
TNS for Linux: Version 12.1.0.2.0 - Production
NLSRTL Version 12.1.0.2.0 – Production

--接著確認目前所安裝的功能選項裡有加上In-Memory選項

SQL> select parameter,value
  2 from v$option
  3 where parameter like 'In-Memory%';
PARAMETER VALUE
------------------------------------------------------------------------------------------------------
In-Memory Column Store TRUE
In-Memory Aggregation TRUE

--最後確認與In-Memory功能相關的參數內容

SQL> show parameter inmemory
NAME TYPE VALUE
-----------------------------------------------------------------------------------------------------
inmemory_clause_default string  
inmemory_force string DEFAULT
inmemory_max_populate_servers integer 0
inmemory_query string ENABLE
inmemory_size big integer 0
inmemory_trickle_repopulate_ integer 1
servers_percent    
optimizer_inmemory_aware boolean TRUE

--如果inmemory_size為0,則需要明確將其設定值設為大於100M,方能啟動In-Memory功能。

SQL> alter system set inmemory_size=100M scope=spfile;

--重新啟動Instance.

--在加入12.1.0.2的In-Memory功能之前,Oracle資料庫使用Buffer Cache來快取最近用到的資料,讀取單位為Data Block,而使用單位為Row。

SQL> select inmemory,inmemory_priority,inmemory_distribute,
  2 inmemory_compression,inmemory_duplicate
  3 from dba_tables
  4 where owner='HR' and table_name='EMP';
INMEMORY INMEMORY INMEMORY_DISTRI INMEMORY_COMPRESS INMEMORY_DUPL
------------------------------------------------------------------------------------------------------
DISABLED


--加上inmemory選項讓表格變成可以另外以column-based方式快取在SGA裡。
使用範例如: CREATE TABLE … INMEMORY/ALTER TABLE … INMEMORY;

SQL> alter table hr.emp inmemory;
SQL> alter table hr.t1 inmemory priority critical;
SQL> select table_name,inmemory,inmemory_priority
  2 from dba_tables
  3 where owner='HR' and table_name in ('EMP','T1');

TABLE_NAME INMEMORY INMEMORY
-----------------------------------------------------------------------------------------------------
EMP ENABLED NONE
T1 ENABLED CRITICAL

--測試In-Memory功能是否發揮效果

SQL> select * from hr.emp;

--執行結果省略效 --由執行計畫來看

SQL> select * from table(dbms_xplan.display_cursor);
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------
SQL_ID c6ztk9t1t45vz, child number 0
------------------------------------------------------------------------------------------------------
select * from hr.emp
Plan hash value: 3956160932
------------------------------------------------------------------------------------------------------

Id Operation   Name Rows Bytes Cost (%CPU) Time 
-----------------------------------------------------------------------------------------------------
0 SELECT STATEMENT    1 (100)
1  TABLE ACCESS INMEMORY FULL EMP 107 7383 1    (0) 00:00:01
             

--執行計畫裡有出現INMEMORY字眼,似乎有使用到In-Memory機制,但還需要由執行下列查詢確認,該區段是否有真的被載入到In-Memory記憶體中?

SQL> select segment_name,bytes Disk, inmemory_size,populate_status
  2 from v$im_segments
  3 where segment_name=’EMP’;
no rows selected

--似乎沒有真正使用In-Memory裡的資料列。因為Oracle還會根據區段大小決定是否需要對該物件使用In-Memory機制。當區段大小小於_inmemory_small_segment_threshold則不會真的採用In-Memory方式處理此區段, 雖然執行計畫看似有使用到In-Memory機制。

SQL> select indx,ksppinm,ksppdesc from x$ksppi where indx=2355;

  INDX KSPPINM
------------------------------------------------------------------------------------------------------
KSPPDESC
------------------------------------------------------------------------------------------------------
  2355 _inmemory_small_segment_threshold
In-memory small segment threshold (must be larger for in-memory)

SQL> select ksppstvl from x$ksppcv where indx=2355;
KSPPSTVL
--------------
65536

SQL> select segment_name,bytes
  2 from dba_segments
  3 where owner='HR' and segment_name in ('EMP','T1');
SEGMENT_NAME BYTES
-----------------------------------------------------------------------------------
EMP 65536
T1 13631488

--以下為真正使用到In-Memory機制的範例

SQL> select count(object_name) from hr.t1 where object_type='TABLE';
COUNT(OBJECT_NAME)
--------------------------------
2636

SQL> select * from table(dbms_xplan.display_cursor);
PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------
SQL_ID 5x9n4jhz7xk7y, child number 0
-----------------------------------------------------------------------------------
select count(object_name) from hr.t1 where object_type='TABLE'
Plan hash value: 3724264953
-----------------------------------------------------------------------------------

Id Operation   Name Rows Bytes Cost (%CPU) Time 
-----------------------------------------------------------------------------------------------------
0 SELECT STATEMENT   28 (100)
1 SORT AGGREGATE   1 34   00:00:01
*2  TABLE ACCESS INMEMORY FULL T1   2035 69190  28   (4) 00:00:01  

-----------------------------------------------------------------------------------
Predicate Information (identified by operation id):
-----------------------------------------------------------------------------------
  2 - inmemory("OBJECT_TYPE"='TABLE')
  filter("OBJECT_TYPE"='TABLE')

SQL> select segment_name,bytes Disk,inmemory_size,populate_status
  2 from v$im_segments
  3 where segment_name='T1';

SEGMENT_NAME DISK INMEMORY_SIZE POPULATE_
-----------------------------------------------------------------------------------------------------
T1   13631488    4325376 COMPLETED

何時欄位資料會被載入?將根據ALTER/CREATE TABLE … INMEMORY

PRIORITY XXX的設定: CRITICAL:當Instance啟動後,自動載入。 HIGH:當Instance啟動後,所有屬於critical等級的資料都載入後,還有剩餘的記憶體空間可用,將自動載入此等級的資料。 MEDIUM: 當Instance啟動後,所有屬於critical/high等級的資料都載入後,還有剩餘的記憶體空間可用,將自動載入此等級的資料。 LOW: 當Instance啟動後,所有屬於critical/high/medium等級的資料都載入後,還有剩餘的記憶體空間可用,將自動載入此等級的資料。 NONE:此表格/欄位第一次被查詢時,如果inmemory空間還有剩餘空間時,將會自動載入。此選項為預設值。

--當欄位資料被載入In-Memory記憶體後,並不會影響往後對此表格的DML操作。雖然DML操作會讓位於In-Memory記憶體的資料失效,但不會立刻被再載入,因為要維持讀取一 致性。而且同時會將更新後的欄位值將被加入transaction journal。

所以現在開始進行的查詢指令,將會由transaction journal取得最新欄位值。

--In-Memory的過期資料將自動由ICMO每隔2分鐘檢查一次,是否超過staleness threshold數量,若超過則將重新由磁碟機載入最新資料。

以上內容為對Oracle Database 12c In-Memory Option的基礎介紹,如果需要學習更進一步的內容,請報名相關課程。

Share |
您可在下列課程中了解更多技巧喔!
相關學習資源︰

【12cNFA】Oracle12c資料庫之新功能介紹-DBA篇