Oracle DB In-Memory是預裝在Oracle Database 12c(12.1.0.2之後的版本)中的,不需要安裝其他軟件或者是重新編譯現有的的數據庫軟件。這是因爲In-Memory選項是作爲SGA的一個新組件無縫集成在Oracle Database軟件內核中的,所以如果Oracle Database已經安裝,則Oracle DB In-Memory同時也已安裝。In-Memory store默認是不開啓的,但是可以簡單通過幾個步驟來開啓改功能。
比較重要的一點是DB In-Memory的開啓是在實例級別的,同時對於要存儲到In-memory的objects需要手動指定,否則是不會自動存儲到In-Memory Area的。
In-Memory Area是SGA中用列式存儲的方式來存儲數據的一個靜態池。在沒有這個特性之前,oracle的數據全部採用行形式進行存儲(除EHCC壓縮之外),而在In-Memory Area中數據以列式進行存儲,通過這種存儲方式在某些業務場景中提升掃描性能,如:出報表等。
In-Memory Area的大小通過參數INMEMORY_SIZE來進行控制的,改參數默認爲0,表示DB In-Memory被禁用。
數據庫當前正在使用的INMEMORY_SIZE參數可以通過v$parameter視圖進行查看,同時在v$sga視圖中也可以看到。In-Memory column存儲在一個靜態池當中,所以對於INMEMORY_SIZE參數的所有調整都只在該instance重啓之後纔會生效。同時In-Memory pool的大小也不會受到自動內存管理(AMM)的影響。如果啓用DB In-Memory特性,INMEMORY_SIZE最小需要設置爲100M。
下面我們來看一下和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_servers_ integer 1
percent
optimizer_inmemory_aware boolean TRUE
這7個含有INMEMORY前綴的參數分別控制着In-Memory功能的各個方面。比如INMEMORY_QUERY參數控制着在system和session級別上用戶查詢是否可以使用列式存儲的數據。其他參數也會在之後的文章中一一介紹。
在當前的參數設置中可以看到INMEMORY_SIZE參數被設置爲0,這代表着DB In-Memory功能未啓用,未在SGA中分配相關空間。
我們同樣可以通過v$sga進行查看,In-Memory Area沒有被分配空間。
SQL> select name,value from v$sga;
NAME VALUE
-------------------- ----------
Fixed Size 2929160
Variable Size 469765624
Database Buffers 2600468480
Redo Buffers 13844480
開啓DB In-Memory過程如下:
1.修改INMEMORY_SIZE參數:
SQL> ALTER SYSTEM SET INMEMORY_SIZE=1G SCOPE=SPFILE;
System altered.
注意:INMEMORY_SIZE最小爲100M。
2.檢查sga參數的設置,確保在設置完inmemroy_size參數之後數據庫實例還可以正常啓動。如果數據庫使用了ASMM,則需要檢查sga_target參數。如果使用了AMM,則需要檢查MEMORY_TARGET參數,同時也需要檢查SGA_MAX_TARGET(或MEMORY_MAX_TARGET)。
3.重啓數據庫實例
SQL> shutdown immediate;
SQL> startup
4.檢查重啓後的數據庫參數設置:
SQL> show parameter INMEMORY_SIZE
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
inmemory_size big integer 1G
同時也可通過v$sga視圖查詢In-Memory Area的分配:
SQL> select name,value from v$sga;
NAME VALUE
-------------------- ----------
Fixed Size 2929160
Variable Size 469765624
Database Buffers 1526726656
Redo Buffers 13844480
In-Memory Area 1073741824
在In-Memory Area中又被分爲兩個小的pool,分別爲:
1.1M pool(IMCU pool)
2.64KB pool(SMU pool)
具體分配的大小我們可以通過V$INMEMORY_AREA視圖進行查看:
SQL> select pool,alloc_bytes,used_bytes from v$inmemory_area;
POOL ALLOC_BYTES USED_BYTES
-------------------------- ----------- ----------
1MB POOL 854589440 0
64KB POOL 201326592 0
可以看到絕大部分的In-Memory Area被分配爲1MB pool。在沒有手工指定In-Memory的表時,USED_BYTES爲0。