Oracle 12c In-Memory 初探
Oracle 在12c版本中引入了記憶體與列式壓縮選件In-Memory,In-Memory可以極大提升查詢的效能。
這裡通過一個對比可以看到同樣的查詢中能提高多少效能。
1.先給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
2.INMEMORY_SIZE定義了in-memory的大小
SQL> alter system set inmemory_size=1000m scope=spfile;
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
修改完需要重啟一下
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 5016387584 bytes
Fixed Size 3721128 bytes
Variable Size 1056966744 bytes
Database Buffers 3724541952 bytes
Redo Buffers 13053952 bytes
In-Memory Area 218103808 bytes
Database mounted.
Database opened.
3.建立一張測試表
SQL> create table bmw.t as select * from dba_objects;
Table created.
SQL> select TABLE_NAME,INMEMORY_PRIORITY,INMEMORY_DISTRIBUTE,INMEMORY_COMPRESSION from dba_tables where table_name='T';
TABLE_NAME INMEMORY_PRIORITY INMEMORY_DISTRIBUTE INMEMORY_COMPRESSION
---------- ------------------------ --------------------------------------------- ---------------------------------------------------
T
可以看到並未真正的分配USED_BYTES
SQL> l
1* SELECT * FROM V$INMEMORY_AREA
SQL> /
POOL ALLOC_BYTES USED_BYTES POPULATE_STATUS CON_ID
-------------------- ----------- ---------- -------------------- ----------
1MB POOL 837812224 0 DONE 3
64KB POOL 201326592 0 DONE 3
4.看一下未使用In-Memory時的查詢
SQL> set autot trace
SQL> SELECT * FROM bmw.t;
90927 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 1601196873
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 90927 | 9M| 416 (1)| 00:00:01 |
| 1 | TABLE ACCESS FULL| T | 90927 | 9M| 416 (1)| 00:00:01 |
--------------------------------------------------------------------------
Statistics
----------------------------------------------------------
5 recursive calls
0 db block gets
7487 consistent gets
1525 physical reads
0 redo size
12128303 bytes sent via SQL*Net to client
67223 bytes received via SQL*Net from client
6063 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
90927 rows processed
執行計畫中也可以看到使用TABLE ACCESS FULL掃描,consistent gets也達到了7487。
5.將表放到In-Memory中
SQL> set autot off
SQL> alter table bmw.t inmemory;
Table altered.
SQL> select TABLE_NAME,INMEMORY_PRIORITY,INMEMORY_DISTRIBUTE,INMEMORY_COMPRESSION from dba_tables where table_name='T';
TABLE_NAME INMEMORY_PRIORITY INMEMORY_DISTRIBUTE INMEMORY_COMPRESSION
---------- ------------------------ --------------------------------------------- ---------------------------------------------------
T NONE AUTO FOR QUERY LOW
6.沒有對錶查詢前還是未真正放到In-Memory記憶體中
SQL> SELECT * FROM V$INMEMORY_AREA;
POOL ALLOC_BYTES USED_BYTES POPULATE_STATUS CON_ID
-------------------- ----------- ---------- -------------------- ----------
1MB POOL 837812224 0 DONE 3
64KB POOL 201326592 0 DONE 3
SQL> select count(*) from bmw.t;
COUNT(*)
----------
90927
7.查詢一次後可以看到USED_BYTES已經分配了記憶體
SQL> SELECT * FROM V$INMEMORY_AREA;
POOL ALLOC_BYTES USED_BYTES POPULATE_STATUS CON_ID
-------------------- ----------- ---------- -------------------- ----------
1MB POOL 837812224 4194304 DONE 3
64KB POOL 201326592 131072 DONE 3
8.查看一下執行計畫
SQL> set autot trace
SQL> SELECT * FROM bmw.t;
90927 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 1601196873
-----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 90927 | 9M| 20 (20)| 00:00:01 |
| 1 | TABLE ACCESS INMEMORY FULL| T | 90927 | 9M| 20 (20)| 00:00:01 |
-----------------------------------------------------------------------------------
Statistics
----------------------------------------------------------
5 recursive calls
0 db block gets
5 consistent gets
0 physical reads
0 redo size
4944325 bytes sent via SQL*Net to client
67223 bytes received via SQL*Net from client
6063 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
90927 rows processed
這裡可以看到使用了TABLE ACCESS INMEMORY FULL掃描,而且consistent gets為5.可以看到INMEMORY會給查詢帶來非常高的效能提升。