Oracle 12c 開啟與設定in-memory功能

首先要先確認你的Oracle版本,
版本需求為: Oracle Database 12.1.0.2版 
(12.1.0.1版本尚未開放in-memory功能)

1. 以dba權限登入Oracle 12c

2.輸入 show parameter inmemory; 確認是否有開啟in-memory功能
 如果inmemory_size 這欄位數值是0 --> in-memory功能尚未開啟

3.輸入select name, value from v$sga; 
 確認目前SGA分配

4.如下圖所示,
 SGA所分配的記憶體總計為
 2927528+956302424+1543503872+13848576=2516582400
 也就是2.34Gb
 取得這些資訊後,我們就可以開始來進行啟動in-memory的動作

5.假設我們要allocate 1G的記憶體供in-memory使用
 那就必須輸入ALTER SYSTEM SET inmemory_size = 1G scope=spfile;
 然後擴充你的SGA,也就是原本的2.34G+1G = 3G的memory
 ALTER SYSTEM SET sga_target = 4G scope=spfile;

6.重新啟動instace讓in-memory功能生效
 SQL> shutdown immediate;
 SQL> startup;

7. 輸入show parameter inmemory;確認是否已經開啟in-memory功能
 有的話inmemory_size會顯示你所設定的大小(這邊是1G)

到這裡,我們僅僅只是開啟in-memory的功能了,
然後輸入以下SQL查詢table是否已經有用到in-memory
SELECT table_name,
       inmemory,
       inmemory_priority,
       inmemory_distribute,
       inmemory_compression,
       inmemory_duplicate  
FROM   user_tables
ORDER BY table_name;
結果如下圖:

In-memory的功能為disabled,這是因為我們還要針對已經建好的Table進行設定
ALTER TABLE EMP_DEPARTMENT INMEMORY PRIORITY HIGH;
然後再做一次確認

然後你就會發現這個table已經使用了in-memory的功能,
不過做第一次查詢的時候比較無感,因為還是得等他load進記憶體中,
但是做第二次、第三次查詢這table內的資料的時候速度就會快很多,
且由於這資料是放在SGA中,所以對所有使用者都適用。
當然,如果table不大的話真的無感就是了...
但是如果做很複雜的查詢動作,就會稍微有點感覺,
最近測試一次的結果是做了一次跨多個table的join的查詢動作,
結果為300多萬筆資料,在一般狀態下費時69秒才給我結果,
然後把那幾個table都開啟in-memory功能後,
同樣一個查詢,只花了0.0015秒

至於create table時就要讓他in-memory的話,
也只要在SQL的最後面加上個in memory即可,
CREATE TABLE emp (
  id  NUMBER
) INMEMORY;

CREATE TABLE emp_2 (
  id  NUMBER
) NO INMEMORY;

當然,除了table外,tablespace也可以這麼做
創建新tablespace時只需在後面加上 DEFAULT INMEMORY,
之後只要在該tablespace創建的table,就會自動啟用in-memory的功能。
CREATE TABLESPACE DATA
   DATAFILE '/u01/app/oracle/oradata/train05/datafile/data_01.dbf' SIZE 1G 
   DEFAULT INMEMORY;
ALTER TABLESPACE DATA
  DEFAULT INMEMORY MEMCOMPRESS FOR CAPACITY HIGH;

View似乎也可以in-memory,我就不贊述了XD
有興趣的可以看看以下網頁,這也是這篇文章主要的來源,
http://oracle-base.com/articles/12c/in-memory-column-store-12cr1.php

至於儲存機制方面,in-memory的table,
在DB crash時改動的資料是否還會存在這點我還得去做實驗,
印象中之前去原廠聽產品介紹時是commit時才做把資料寫入storage的動作,
不過in-memory功能的確補強了以往Oracle DB在查詢時較慢的缺點,
這也是大型資料庫中常常出現的問題(沒辦法,超肥大XD)
在以往來說,Oracle DB和他買下來的MySQL比較起來,
MySQL在查詢上效能的確是好很多,
但在同時多人使用的壓力測試就...XD

不過講白了in-memory機制最誇張的點就是...你塞多少table進去,
就得有足夠量的memory size給他
所以要是想把整個資料庫的table都丟進去...打造這機器的錢大概不少XD

在國外的DBA論壇中,還有提到以column的方式放進記憶體的,
這邊我也還沒進行測試,
這部分印象中他們的靈感似乎是來自於column table,
column table和傳統的資料庫所使用的row table不太一樣
有興趣的可以去wiki看看: http://en.wikipedia.org/wiki/Column-oriented_DBMS
他的優點是做特定column的查詢速度很快,非常快,
但是在寫入上就非常慢,因為必須把所有的column跟row都掃一遍
不過這部分只要都放在記憶體上問題就不大。

留言

熱門文章