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。