Oracle 12c新特性:IN-Memory Option - 快取與引數

shilei1發表於2015-12-30

2014年6月,在Oracle 12c的12.1.0.2版本中,Oracle正式釋出和引入了基於記憶體和列式計算的In-Memory Option (以下簡稱IMO),這距離Larry在2013年OOW上釋出這一特性已經過去了近10個月。

2014年7月22日,Oracle正式提供了12.1.0.2版本的資料庫產品下載,可以透過:

 

下載該產品的最新版本。

在上,Oracle也隨後釋出了下載連結:

12c020.png

下圖是IMO特性的原理圖,透過在記憶體中開闢一塊獨立的區域,Oracle將指定的表或者分割槽以列式記憶體儲存,但是在儲存上,仍然以一份行式儲存,這就需要額外的記憶體空間。

inmemorycolumn.png

當然,記憶體對於Oracle來說從來都不是問題,為了配合IMO特性,Oracle此前已經推出了SuperCluster M6-32一體機,該伺服器滿配可以配置32 TB記憶體,這是一個記憶體快速擴充套件的時代:

supercluster632.png

我們來看一下Oracle廣為關注的這一新特性的表現。

IMO的預設的引數有:

SQL> select name from v$parameter where name like '%inmemory%';

NAME

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

inmemory_size

inmemory_clause_default

inmemory_force

inmemory_query

inmemory_max_populate_servers

在資料庫啟動時,可以看到SGA中分配的Inmemory Area區域:

SQL> show sga

Total System Global Area 2147483648 bytes

Fixed Size     2917936 bytes

Variable Size   402655696 bytes

Database Buffers 1191182336 bytes

Redo Buffers   13856768 bytes

In-Memory Area   536870912 bytes

啟用IMO特性,需要設定inmemory_size引數,指定可以作為記憶體列存的記憶體區域,該引數為靜態引數,以下語句將該記憶體指定為800M,重啟資料庫使得該引數失效:

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

System altered.

除此之外,另外一個關鍵引數是:inmemory_max_populate_servers 。該引數設定用於將資料載入到記憶體的後臺程式數量。以下將該引數設定為2 :

SQL> alter system set inmemory_max_populate_servers=2;

System altered.

此後可以透過在表或者分割槽級別設定INMEMORY選項,將該表資料設定儲存在記憶體中:

SQL> alter table accbill inmemory;

Table altered.

以下透過測試來演示一下IN-Memory表的查詢效能,以下執行計劃中的INMEMORY意味著這是一個IMO查詢,邏輯讀僅為7,較常規表大大縮減:

inmemory.png

如果我們將該表移出IMO記憶體,可以看到其邏輯讀變成了4076,執行效率也肯定大大下降:

noinmemory.png

透過檢視V$INMEMORY_AREA可以查詢記憶體區域的使用情況,其中USED_BYTES表明當前已經使用的記憶體:

inmemoryarea.png

注意,V$INMEMORY_AREA中的POPULATE_STATUS代表了當前資料向記憶體中載入的進度,在Done之前的查詢不能充分使用記憶體列式運算。

populating.jpg

如果記憶體設定不足以容納指定的資料表,則狀態會顯示為"OUT OF MEMORY",這就需要去增加記憶體設定,或者減少Cache的物件數量。

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

相關文章