Oracle12c中效能最佳化&功能增強新特性之重大突破——記憶體列儲存新特性
Oracle12c中記憶體列儲存
記憶體列儲存(IM column store) 是Oracle12.1.0.2版本的主要特點。該特點允許列,表,分割槽和物化檢視在記憶體中以列格式儲存,而不是通常的行格式。資料存在記憶體中的好處顯而易見,而列格式儲存非常適合商務智慧(BI)產品中的分析查詢。
列儲存是Oracle企業版的獨立許可選項。
1. 簡介
記憶體列儲存在SGA中是一個新部分,透過初始化引數INMEMORY_SIZE指定大小。可以選擇確定的列,整個表,物化檢視或表分割槽組合儲存在該部分。或者,你也可以在表空間層啟用記憶體列儲存,從而該表空間中的所有表和物化檢視自動啟用記憶體列儲存。已對下列命令進行了修改以包括另外的in-memory子句。
CREATE TABLE
ALTER TABLE
CREATE TABLESPACE
ALTER TABLESPACE
CREATE MATERIALIZED VIEW
ALTER MATERIALIZED VIEW
常規用例將在後面展示。
文件中說到如下場景適合記憶體列儲存。
- 使用"=", "<", ">" and "IN"謂詞的大資料量掃描。
- 只返回很多列的表的少數列的查詢。
- 連線小表和大表的查詢。
- 匯聚資料的查詢。
文件也提到該特性不適合以下場景。
- 有複雜謂詞的查詢。
- 返回大量列的查詢。
- 返回大量行的查詢。
- 多個大表連線的查詢。
從上可知,需記住的最重要的事是要為決定哪些物件將從中受益負責。如果決定正確,你將看到效能的巨大提升。如果決定錯誤,你將浪費掉本可被緩衝區使用的大量記憶體。
2. 開啟記憶體列儲存
記住,記憶體列儲存是SGA的一部分,因此,SGA必須能包含你指定的NMEMORY_SIZE引數。在多宿主庫環境中,如果任何PDB需要存取記憶體列儲存,INMEMORY_SIZE引數必須在CDB中設定。
1) 如果你正使用AMM (MEMORY_TARGET),將必須擴充套件它以適應INMEMORY_SIZE引數值。
2) 如果你正使用ASMM (SGA_TARGET),將必須擴充套件它以適應INMEMORY_SIZE引數值。
假定COMPATIBLE引數設定成12.1.0或更高,且SGA總有足夠的空間容納記憶體列儲存,下列過程將開啟記憶體列儲存。這裡設定INMEMORY_SIZE引數為2G。
ALTER SYSTEM SET SGA_TARGET=3G SCOPE=SPFILE;
ALTER SYSTEM SET INMEMORY_SIZE=2GSCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;
ORACLE instance started.
Total System Global Area 3221225472 bytes
Fixed Size 2929552 bytes
Variable Size 419433584 bytes
Database Buffers 637534208 bytes
Redo Buffers 13844480 bytes
In-Memory Area 2147483648 bytes
Database mounted.
Database opened.
SQL>
注意,啟動期間會顯示"In-Memory Area"行。
當前IM相關設定將被如下顯示。除了大小,所有其他相關引數均為預設值。
SQL> SHOW PARAMETER INMEMORY
NAME TYPE VALUE
----------------------------------------------- ------------------------------
inmemory_clause_default string
inmemory_force string DEFAULT
inmemory_max_populate_servers integer 1
inmemory_query string ENABLE
inmemory_size big integer 2G
inmemory_trickle_repopulate_servers_integer 1
percent
optimizer_inmemory_aware boolean TRUE
SQL>
除非在PDB級別顯式設定INMEMORY_SIZE引數,否則,該引數設定將被所有PDB繼承。在PDB級別改變INMEMORY_SIZE引數並不要求重啟例項或PDB。
CONN sys@pdb1 AS SYSDBA
-- Disable IM column store in the PDB
ALTER SYSTEM SET INMEMORY_SIZE=0;
-- OR
ALTER SYSTEM RESET INMEMORY_SIZE;
-- Assign a PDB-specific size.
ALTER SYSTEM SET INMEMORY_SIZE=1G;
3. 關閉記憶體列
根據你的目的,有多種關閉記憶體列儲存的方法。
設定INMEMORY_FORCE引數為"OFF"意味著物件不再被儲存在記憶體列儲存中,將其切換回"DEFAULT"將恢復其預設的行為。
-- System level
ALTER SYSTEM SET INMEMORY_FORCE=OFF;
ALTER SYSTEM SET INMEMORY_FORCE=DEFAULT;
設定INMEMORY_QUERY引數為"DISABLE"意味著最佳化器最佳化查詢時將不再考慮記憶體列儲存。將其切換回"ENABLE"將恢復其預設功能。
-- System level
ALTER SYSTEM SET INMEMORY_QUERY=DISABLE;
ALTER SYSTEM SET INMEMORY_QUERY=ENABLE;
-- Session level
ALTER SESSION SET INMEMORY_QUERY=DISABLE;
ALTER SESSION SET INMEMORY_QUERY=ENABLE;
為了完全禁用記憶體列儲存且釋放記憶體,只需重置INMEMORY_SIZE引數。
ALTER SYSTEM RESET INMEMORY_SIZESCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;
就像前面說的,可以更改PDB級別的設定且不需要例項或PDB重啟。
4. 管理表
CREATE TABLE和ALTER TABLE命令已被改進,因此,你可以決定表是否要儲存在記憶體列儲存中。以NO INMEMORY子句建立的表和不確定子句是一樣的。下面的例子將展示用三種語法建立的三個表。
檢視[DBA|ALL|USER]_TABLES已經被改進來包含記憶體列儲存相關的資訊。
CONN test/test@pdb1
CREATE TABLE im_tab (
id NUMBER
) INMEMORY;
CREATE TABLE noim_tab (
id NUMBER
) NO INMEMORY;
CREATE TABLE default_tab (
id NUMBER
);
COLUMN table_name FORMAT A20
SELECT table_name,
inmemory,
inmemory_priority,
inmemory_distribute,
inmemory_compression,
inmemory_duplicate
FROM user_tables
ORDER BY table_name;
TABLE_NAME INMEMORY INMEMORY INMEMORY_DISTRIINMEMORY_COMPRESS INMEMORY_DUPL
-------------------- -------- ----------------------- ----------------- -------------
DEFAULT_TAB DISABLED
IM_TAB ENABLED NONE AUTO FOR QUERY LOW NO DUPLICATE
NOIM_TAB DISABLED
3 rows selected.
SQL>
ALTER TABLE命令可以改變物件記憶體列儲存方面的狀態。下例容易的改變記憶體列儲存的狀態。
ALTER TABLE IM_TAB NO INMEMORY;
ALTER TABLE NOIM_TAB INMEMORY MEMCOMPRESS FORCAPACITY LOW;
ALTER TABLE DEFAULT_TAB INMEMORY PRIORITYHIGH;
SELECT table_name,
inmemory,
inmemory_priority,
inmemory_distribute,
inmemory_compression,
inmemory_duplicate
FROM user_tables
ORDER BY table_name;
TABLE_NAME INMEMORY INMEMORY INMEMORY_DISTRIINMEMORY_COMPRESS INMEMORY_DUPL
-------------------- -------- -------- -------------------------------- -------------
DEFAULT_TAB ENABLED HIGH AUTO FOR QUERY LOW NO DUPLICATE
IM_TAB DISABLED
NOIM_TAB ENABLED NONE AUTO FOR CAPACITY LOW NO DUPLICATE
3 rows selected.
SQL>
5. 管理列
下例展示將部分列放進記憶體列儲存的語法。
CREATE TABLE im_col_tab (
id NUMBER,
col1NUMBER,
col2NUMBER,
col3NUMBER,
col4NUMBER
) INMEMORY
INMEMORY MEMCOMPRESS FOR QUERY HIGH (col1,col2)
INMEMORY MEMCOMPRESS FOR CAPACITY HIGH (col3)
NO INMEMORY (id, col4);
透過查詢檢視V$IM_COLUMN_LEVEL來獲取列設定的相關資訊。
CONN sys@pdb1 AS SYSDBA
SELECT table_name,
segment_column_id,
column_name,
inmemory_compression
FROM v$im_column_level
WHERE owner = 'TEST'
and table_name = 'IM_COL_TAB'
ORDER BY segment_column_id;
TABLE_NAME SEGMENT_COLUMN_ID COLUMN_NAME INMEMORY_COMPRESSION
-------------------- ------------------------------------------------ --------------------------
IM_COL_TAB 1 ID NO INMEMORY
IM_COL_TAB 2 COL1 FOR QUERY HIGH
IM_COL_TAB 3 COL2 FOR QUERY HIGH
IM_COL_TAB 4 COL3 FOR CAPACITY HIGH
IM_COL_TAB 5 COL4 NO INMEMORY
5 rows selected.
SQL>
可以用ALTER TABLE命令改變記憶體列儲存的設定。
CONN test/test@pdb1
ALTER TABLE im_col_tab
NO INMEMORY (col1, col2)
INMEMORY MEMCOMPRESS FOR CAPACITY HIGH (col3)
NO INMEMORY (id, col4);
CONN sys@pdb1 AS SYSDBA
SELECT table_name,
segment_column_id,
column_name,
inmemory_compression
FROM v$im_column_level
WHERE owner = 'TEST'
and table_name = 'IM_COL_TAB'
ORDER BY segment_column_id;
TABLE_NAME SEGMENT_COLUMN_ID COLUMN_NAME INMEMORY_COMPRESSION
-------------------- ------------------------------------------------ --------------------------
IM_COL_TAB 1 ID NO INMEMORY
IM_COL_TAB 2 COL1 NO INMEMORY
IM_COL_TAB 3 COL2 NO INMEMORY
IM_COL_TAB 4 COL3 FOR CAPACITY HIGH
IM_COL_TAB 5 COL4 NO INMEMORY
5 rows selected.
SQL>
6. 管理物化檢視
CREATE MATERIALIZED VIEW和ALTER MATERIALIZED VIEW命令和 CREATE TABLE and ALTER TABLE命令類似。
CONN test/test@pdb1
CREATE TABLE t1 AS
SELECT * FROM all_objects;
CREATE MATERIALIZED VIEW t1_mv INMEMORY
ASSELECT * FROM t1;
SELECT table_name,
inmemory,
inmemory_priority,
inmemory_distribute,
inmemory_compression,
inmemory_duplicate
FROM user_tables
WHERE table_name = 'T1_MV';
TABLE_NAME INMEMORY INMEMORY INMEMORY_DISTRIINMEMORY_COMPRESS INMEMORY_DUPL
-------------------- -------- ----------------------- ----------------- -------------
T1_MV ENABLED NONE AUTO FOR QUERY LOW NO DUPLICATE
1 row selected.
SQL>
ALTER MATERIALIZED VIEW t1_mv
INMEMORY MEMCOMPRESS FOR CAPACITY HIGH PRIORITY HIGH;
SELECT table_name,
inmemory,
inmemory_priority,
inmemory_distribute,
inmemory_compression,
inmemory_duplicate
FROM user_tables
WHERE table_name = 'T1_MV';
TABLE_NAME INMEMORY INMEMORY INMEMORY_DISTRIINMEMORY_COMPRESS INMEMORY_DUPL
-------------------- -------- ----------------------- ----------------- -------------
T1_MV ENABLED HIGH AUTO FOR CAPACITY HIGHNO DUPLICATE
1 row selected.
SQL>
ALTER MATERIALIZED VIEW t1_mv NO INMEMORY;
SELECT table_name,
inmemory,
inmemory_priority,
inmemory_distribute,
inmemory_compression,
inmemory_duplicate
FROM user_tables
WHERE table_name = 'T1_MV';
TABLE_NAME INMEMORY INMEMORY INMEMORY_DISTRIINMEMORY_COMPRESS INMEMORY_DUPL
-------------------- -------- ----------------------- ----------------- -------------
T1_MV DISABLED
1 row selected.
SQL>
7. 管理表空間
設定表空間的預設記憶體列儲存引數意味著該表空間內的所有表和物化檢視將使用那些設定,顯示覆蓋情況除外。
下列將展示如何在表空間建立期間設定記憶體列儲存引數。關鍵字DEFAULT是記憶體列儲存子句的一部分。預設記憶體列儲存設定可以查詢DBA_TABLESPACES檢視檢視。
CONN sys@pdb1 AS SYSDBA
CREATE TABLESPACE new_ts
DATAFILE '/u01/app/oracle/oradata/CDB1/datafile/pdb1/pdb1_new_ts.dbf'SIZE 10M
DEFAULT INMEMORY;
SELECT tablespace_name,
def_inmemory,
def_inmemory_priority,
def_inmemory_distribute,
def_inmemory_compression,
def_inmemory_duplicate
FROM dba_tablespaces
ORDER BY tablespace_name;
TABLESPACE_NAME DEF_INME DEF_INMEDEF_INMEMORY_DI DEF_INMEMORY_COMP DEF_INMEMORY_
------------------------------ ---------------- --------------- ----------------- -------------
NEW_TS ENABLED NONE AUTO FOR QUERY LOW NO DUPLICATE
SYSAUX DISABLED
SYSTEM DISABLED
TEMP DISABLED
USERS DISABLED
5 rows selected.
SQL>
ALTER TABLESPACE命令用來修改記憶體列儲存引數。
ALTER TABLESPACE new_ts
DEFAULT INMEMORY MEMCOMPRESS FOR CAPACITY HIGH;
SELECT tablespace_name,
def_inmemory,
def_inmemory_priority,
def_inmemory_distribute,
def_inmemory_compression,
def_inmemory_duplicate
FROM dba_tablespaces
ORDER BY tablespace_name;
TABLESPACE_NAME DEF_INME DEF_INMEDEF_INMEMORY_DI DEF_INMEMORY_COMP DEF_INMEMORY_
------------------------------ ---------------- --------------- ----------------- -------------
NEW_TS ENABLED NONE AUTO FOR CAPACITY HIGHNO DUPLICATE
SYSAUX DISABLED
SYSTEM DISABLED
TEMP DISABLED
USERS DISABLED
SQL>
ALTER TABLESPACE new_ts
DEFAULT NO INMEMORY;
SELECT tablespace_name,
def_inmemory,
def_inmemory_priority,
def_inmemory_distribute,
def_inmemory_compression,
def_inmemory_duplicate
FROM dba_tablespaces
ORDER BY tablespace_name;
TABLESPACE_NAME DEF_INME DEF_INMEDEF_INMEMORY_DI DEF_INMEMORY_COMP DEF_INMEMORY_
------------------------------ ---------------- --------------- ----------------- -------------
NEW_TS DISABLED
SYSAUX DISABLED
SYSTEM DISABLED
TEMP DISABLED
USERS DISABLED
5 rows selected.
SQL>
表空間預設設定能被上面展示的物件級的設定覆蓋。
8. 檢視
我們已看到,有些之前的檢視已經被修改以便包括記憶體列儲存資訊。下列V$檢視已經增加了記憶體列儲存相關的資訊。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8484829/viewspace-2120161/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java 16 新特性:instanceof增強Java
- Oracle12C新特性_DDL日誌Oracle
- ABAP 740新的OPEN SQL增強特性SQL
- C# 9 新特性 —— 增強的 foreachC#
- lightdb新特性--相容oracle儲存過程的聯合陣列Oracle儲存過程陣列
- LightDB23.1新特性支援Oracle hint增強DB2Oracle
- C# 9 新特性 —— 增強的模式匹配C#模式
- Oracle12C新特性_不可見欄位(二)Oracle
- 新特性解讀 | MySQL 8.0.28 使用者連線記憶體限制MySql記憶體
- 12C新特性___In-Memory列式儲存的總結
- 新特性
- Java 10 新特性之 AppCDSJavaAPP
- 深度解讀 MongoDB 最全面的增強版本 4.4 新特性MongoDB
- MySQL 8 新特性之自增主鍵的持久化MySql持久化
- Redis 7.0 新功能新特性總覽Redis
- openGauss儲存技術(二)——列儲存引擎和記憶體引擎儲存引擎記憶體
- React 新特性React
- 新特性介面
- Hadoop新特性Hadoop
- Java 8 新特性之方法引用Java
- IOS11新特性之maskedCornersiOS
- iOS 8 之後UINavigationController新特性iOSUINavigationController
- ES6 新特性之SymbolSymbol
- JDK8新特性之stream()JDK
- MySQL 8 新特性之Clone PluginMySqlPlugin
- HTML5 新特性之 WebsocketHTMLWeb
- Java8新特性之:OptionalJava
- MySQL 8 新特性之Invisible IndexesMySqlIndex
- 記憶體中的資料儲存記憶體
- 前端筆記之HTML5&CSS3(上)新特性&音訊視訊&本地儲存&自定義屬性前端筆記HTMLCSSS3音訊
- .NET 9 最佳化,搶先體驗 C# 13 新特性C#
- Android效能最佳化之記憶體洩露Android記憶體洩露
- 【新特性速遞】表格多列排序(SortingMulti)排序
- JDK 新特性學習筆記之模組系統JDK筆記
- Go1.19 那些事:國產晶片、記憶體模型等新特性,你知道多少?Go晶片記憶體模型
- 阿里雲訊息佇列 2021 新功能新特性重要里程碑阿里佇列
- JDK8新特性之Stream流JDK
- JDK 1.8 新特性之Lambda表示式JDK
- ?Java8新特性之Optional類Java