Oracle 12C 新特性 In-Memory
成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),固鎮(zhèn)企業(yè)網(wǎng)站建設(shè),固鎮(zhèn)品牌網(wǎng)站建設(shè),網(wǎng)站定制,固鎮(zhèn)網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,固鎮(zhèn)網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
In-Memory 是12C 開(kāi)始,在 SGA 中新增加的內(nèi)存區(qū)域,可以實(shí)現(xiàn)表數(shù)據(jù)按列存儲(chǔ);
In-Memory 并沒(méi)有取代傳統(tǒng)的Buffer Cache ,二者并存在 SGA 中。
SGA是動(dòng)態(tài)區(qū)域,In-Memory大小是靜態(tài)的,需要DBA手動(dòng)維護(hù)。
列式存儲(chǔ)數(shù)據(jù)和行式存儲(chǔ)數(shù)據(jù)各有優(yōu)缺點(diǎn),適用場(chǎng)景不同。
列式存儲(chǔ)在訪問(wèn)多行、少列情況下性能更優(yōu)。
下面啟用 inmemory , 進(jìn)行性能測(cè)試。
一 數(shù)據(jù)庫(kù)版本為19C( 相當(dāng)于 12.2.0.3 版本 )
SQL> select banner_full from v$version;
BANNER_FULL
---------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
二 查看 inmemory 是否啟用
SQL> show parameter inmemory_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
inmemory_size big integer 0
三 創(chuàng)建測(cè)試數(shù)據(jù)
SQL> conn cjc/cjc@cjcpdb
SQL> create table t1 as select * from dba_objects;
SQL> select count(*) from t1;
COUNT(*)
----------
72482
四 啟用 in - memory ( 實(shí)例級(jí)別 )
SQL> show parameter inmemory_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
inmemory_size big integer 0
SQL> alter system set inmemory_size=300M scope=spfile;
SQL> shutdown immediate
SQL> startup
ORACLE instance started.
Total System Global Area 1287650440 bytes
Fixed Size 9145480 bytes
Variable Size 759169024 bytes
Database Buffers 201326592 bytes
Redo Buffers 3436544 bytes
In-Memory Area 314572800 bytes
Database mounted.
Database opened.
SQL> show parameter inmemory_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
inmemory_size big integer 300M
五 性能對(duì)比
5.1 收集 T1 表統(tǒng)計(jì)信息
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('CJC','T1',estimate_percent=>100,CASCADE=> TRUE);
PL/SQL procedure successfully completed.
查看執(zhí)行計(jì)劃
SQL> set autotrace on
5.2 對(duì)表 t1 啟用 inmemory
SQL> conn sys/oracle@cjcpdb as sysdba
Connected.
SQL> alter table cjc.t1 inmemory;
--- 禁用 alter table cjc.t1 no inmemory;
5.3 收集統(tǒng)計(jì)信息
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('CJC','T1',estimate_percent=>100,CASCADE=> TRUE);
5.4 查看執(zhí)行計(jì)劃
SQL> set autotrace on
SQL> select count(object_id) from t1;
COUNT(OBJECT_ID)
----------------
72481
T1 表啟用 inmemory 后 ,consistent gets 由 1412 降到 2 , Cost 由 392 降到 16 ,性能提升比較明顯。
六 查詢(xún)相關(guān)信息
--- V$INMEMORY_AREA 、 V$IM_SEGMENTS 、V$IM_COLUMN_LEVEL
SELECT NAME, VALUE / (1024 * 1024 * 1024) "SIZE_IN_GB"
FROM V$SGA
WHERE NAME LIKE '%Mem%';
SELECT POOL ,
TRUNC ( ALLOC_BYTES / ( 1024 * 1024 * 1024 ), 2 ) "ALLOC_GB" ,
TRUNC ( USED_BYTES / ( 1024 * 1024 * 1024 ), 2 ) "USED_GB" ,
POPULATE_STATUS
FROM V$INMEMORY_AREA ;
SELECT OWNER ,
SEGMENT_NAME ,
bytes ,
INMEMORY_SIZE ,
POPULATE_STATUS ,
BYTES_NOT_POPULATED
FROM V$IM_SEGMENTS ;
SELECT table_name,
segment_column_id,
column_name,
inmemory_compression
FROM v$im_column_level;
七 注意事項(xiàng)
1 inmemory_size 不能小于 100M
SQL> startup
ORA-64353: in-memory area size cannot be less than 100MB
2 指定表在啟用或禁用 inmemory 時(shí),要及時(shí)收集統(tǒng)計(jì)信息
否則執(zhí)行計(jì)劃里的信息是不準(zhǔn)確的。
詳細(xì)信息可以參考官方文檔
https://docs.oracle.com/en/database/oracle/oracle-database/19/inmem/intro-to-in-memory-column-store.html#GUID-BFA53515-7643-41E5-A296-654AB4A9F9E7
歡迎關(guān)注我的微信公眾號(hào)"IT小Chen",共同學(xué)習(xí),共同成長(zhǎng)?。?!