適用先:
Oracleデータベース - 12.1.0.2
作成者:
Mahesh Reddy M
概要:
Oracle Database 12c In-Memoryの導入により、単一のデータベースで、混在するワークロードを効率的にサポートし、リアルタイムの分析とレポート作成を同時に実行しながら、トランザクションのパフォーマンスを最適化することができます。インメモリーを使用すると、データ マートとデータ ウェアハウスの両方でより多くのアドホック分析機能を提供し、同時にエンドユーザーは複数のビジネス関連クエリーを実行することができます。この機能を使用すると、列、テーブル、パーティション、およびマテリアライズド ビューを、通常の行形式ではなく、列形式でメモリーに保存することができます。インメモリー列ストア(IM列ストア)は、12.1.0.2パッチ セットの主要機能でした。
Oracle Database 12c In-Memoryアーキテクチャー:
従来のデータは行形式でのみ保存されます。一方で、インメモリー データベースは列形式でのみデータを格納します。したがって、Oracle Database 12cは2つのフォーマットのアーキテクチャーをサポートします。
- 読み取り/書き込み処理(データ操作)に対してデータが要求されるたびに、それらは、従来の行ストア(バッファー キャッシュ)にロードされます。
- データが読み取り専用操作に対して要求されるたびに、新しいインメモリー列ストアにデータが挿入されます。当然のことながら、ここでは行から列形式への変換も行われます。
- 挿入、更新、または削除を含むトランザクションがコミットされると、新しいデータはただちに、行ストアとインメモリー列ストアの両方に同時に表示されます。したがって、両方のストアはトランザクションで一致しています。
インメモリー列ストア:
Database In-Memoryでは、インメモリー列ストアを使用します。これは、インメモリー領域と呼ばれるシステム グローバル領域(SGA)の新しいコンポーネントです。IM列ストアのデータは、従来の行形式ではなく、新しい列形式を使用します。IM列ストアは、バッファー キャッシュの代わりにはなりませんが、補完機能として使用できます。これにより、データを行と列の両方の形式でメモリーに格納できるようになります。
インメモリー領域は、SGA内の静的プールで、そのサイズは初期化パラメーターのINMEMORY_SIZE(デフォルトは0)によって制御されます。インメモリー領域の現在のサイズは、V$SGAで表示されます。
IM列ストアは、2つのプールに分割されています。
- 1 MBプール - 実際の列形式データを格納します。
- 64kプール - オブジェクトに関するメタデータを格納します。
以下のクエリーを使用して、各プールで使用可能なメモリー容量を確認できます。
SQL> select * from v$inmemory_area;
プール |
ALLOC_BYTES |
USED_BYTES |
POPULATE_STATUS |
CON_I |
1MB POOL |
2.5767E+11 |
2.3569E+11 |
した |
1 |
64KB POOL |
6.4408E+10 |
876347392 |
した |
1 |
1MB POOL |
2.5767E+11 |
2.3569E+11 |
した |
2 |
64KB POOL |
6.4408E+10 |
876347392 |
した |
2 |
1MB POOL |
2.5767E+11 |
2.3569E+11 |
した |
3 |
64KB POOL |
6.4408E+10 |
876347392 |
した |
3 |
表1:各プールで使用可能なメモリー
IM列ストアを有効にする:
静的プールの場合、INMEMORY_SIZEパラメーターに対する変更は、データベース インスタンスが再起動されるまで有効になりません。また、自動メモリー管理(AMM)によって影響を受けたり、制御されたりすることはありません。インメモリー領域の最小サイズは、100MBである必要があります。
sql> ALTER SYSTEM SET SGA_TARGET=500G SCOPE=SPFILE;
sql> ALTER SYSTEM SET INMEMORY_SIZE=300G SCOPE=SPFILE;
sql>SHUTDOWN IMMEDIATE;
sql>STARTUP;
ORACLEインスタンスが開始されました。
Total System Global Area 4.2950E+11 bytes
Fixed Size 7677400 bytes
Variable Size 2.0938E+10 bytes
Database Buffers 8.5899E+10 bytes
Redo Buffers 529190912 bytes
In-Memory Area 3.2212E+11 bytes
データベースがマウントされました。
データベースが開きました。
以下のクエリーを使用して、インメモリーの設定を確認できます。
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 biginteger 300G
inmemory_trickle_repopulate_servers_ integer 1
パーセント
optimizer_inmemory_aware boolean TRUE
inmemory_sizeパラメーターは、CDBおよびPDBレベルでも設定できます。PDBレベルでこのパラメーターを設定した場合は、インスタンスまたはPDBを再起動する必要はありません。すべてのPDB値の合計は、CDB値以下になります。
以下に示すPDBレベルで、インメモリー オプションを有効または無効にすることができます。
PDBに接続し、次のコマンドを実行します。
無効にする:
Alter system set inmemory_size=0; or
Alter system reset inmemory_size;
有効にする:
Alter system set inmemory_size=20G;
インメモリーの優先レベル:
IM列ストアには、データベース内で最もパフォーマンスが重要なデータを挿入する必要があります。パフォーマンスがそれほど重要でないデータは、低コストのフラッシュまたはディスク上に格納することができます。当然ながら、データベースの容量が十分である場合は、すべてのテーブルをIM列ストアに挿入することができます。Database In-Memoryでは、テーブルおよびマテリアライズド ビューに新しいINMEMORY属性が追加されます。
INMEMORY属性は、次で有効にすることができます。
表領域、テーブル、(サブ)パーティション、およびマテリアライズド ビュー。
表領域レベルでこの属性を有効にすると、デフォルトで表領域内のすべてのテーブルとマテリアライズド ビューがIMCOLUMNストアで有効になります。
alter tablespace quest INMEMORY;
テーブル レベルでこの属性を有効にする場合、テーブル内のすべての列は、IMCOLUMNストアに挿入されます。ただし、列のサブセットのみをIMCOLUMNストアに挿入することはできます。
Alter table quest_tab INMEMORY NO Inmemory (EMP);
同様に、パーティション化されたテーブルの場合
Alter table quest_tab INMEMORY MODIFY Partition quest_part_1 No Inmemory;
バックグラウンド処理:
IMCO:IMCOバックグラウンド処理により、優先度がLOW/MEDIUM/HIGH/CRITICALのインメモリー対応オブジェクトの挿入(事前挿入)が開始されます。
SMCO:SMCOは、スレーブ プロセス(Wnnn)を動的に生成し、これらのタスクを実行します。
Wnnn:Wnnnプロセスは、インメモリーの挿入およびインメモリーの再挿入タスクを実行し、インメモリー対応オブジェクトを入力または再入力します。
オブジェクトは、データベースを開くとすぐに、または最初にスキャン(クエリー)された直後に、IM列ストアの優先リストに挿入されます。オブジェクトが入力される順序は、キーワード「PRIORITY」によって制御されます。それには5つのレベルがあります。デフォルトの「PRIORITY」はNONEです。これは、初めてスキャンされた後にのみオブジェクトが挿入されることを意味します。
INMEMORY句のPRIORITYサブ句によって制御される優先度レベルは、次のとおりです。
優先度レベルの説明
CRITICAL - データベースが開かれた直後にオブジェクトが挿入される
HIGH - CRITICALオブジェクトがすべて挿入された後にオブジェクトが挿入される
MEDIUM - すべてのCRITICALおよびHIGHオブジェクトが挿入された後にオブジェクトが挿入される
LOW - CRITICAL、HIGH、およびMEDIUMオブジェクトがすべて挿入された後にオブジェクトが挿入される
NONE - 初めてスキャンを行った後にのみオブジェクトが入力される(デフォルト)
64KBより小さいオブジェクトは、メモリーに格納されません。これは、メモリーが1MBのチャンクで割り当てられ、IM列ストア内の領域を大量に消費するためです。
例:alter table quest inmemory priority critical;
インメモリー圧縮の手法:
IM列ストアは、特殊な圧縮形式を使用して、ストレージ削減よりも、アクセス速度を最適化します。データベースは、次の方法で高速化されます。
- 圧縮形式を使用すると、データベースは各列で処理されるメモリーの量を減らすことができます。SQLは、圧縮された列で直接実行します。
- データベースは、SIMDベクトル(アレイ)命令を使用して、単一のCPUクロック サイクルで列値のアレイを処理します。データベースでは、ベクトルに多くの値を格納できます。これにより、SIMDベクトル処理によるパフォーマンスのメリットが最大化されます。
インメモリー圧縮は、キーワード「MEMCOMPRESS」とサブ句「INMEMORY」属性を使用して指定されます。これには6つのレベルがあり、それぞれが異なるレベルの圧縮とパフォーマンスを提供します。
No Memcompress:データは圧縮されずインメモリーに挿入されます。
Memcompress for DML:主にDMLパフォーマンスと最小限の圧縮に使用されます。
Memcompress for Query Low:クエリー パフォーマンス向けに最適化されます(デフォルト)。
Memcompress for Query High:クエリー パフォーマンスとスペース節約のために最適化されます。
Memcompress for Capacity Low:Query HighおよびQuery Lowと比較して、より多くの容量を節約します。
Memcompress for Capacity High:容量節約のために最適化され、パフォーマンスが若干低下します。
圧縮率は、選択した圧縮オプション、データ タイプ、テーブルの内容に応じて、2~20倍の差があります。
例:alter table quest inmemory memcompress for query high;
RAC上のインメモリー列ストア:
クラスター環境では、各ノードに独自の列ストアがあります。クラスター内の各ノードは、同じサイズのIM列ストアを維持する必要があります。デフォルトでは、メモリーに挿入されたすべてのオブジェクトは、クラスター内のすべてのIM列ストア間で分散されます。クラスター内のIM列ストアにわたるオブジェクトの分散は、INMEMORY属性の2つのサブ句である「DISTRIBUTE」と「DUPLICATE」によって制御されます(Engineered Systemsのみ)。
分散:
オブジェクトのクラスター内での分散は、「distribute」サブ句によって制御されます。以下の方法でオブジェクトを分散することができます。
Distribute by rowid range - ROWIDを使って異なるノードにオブジェクトを分散します。
Distribute by Partition – パーティションをクラスター内のノードに分散します。
Distribute by sub partition - サブ パーティションを異なるノードに分散します。
例:alter table quest inmemory distribute by partition;
ここでの重要な点は、Oracle In-Memory RACはクエリーに対して
シェアードナッシング アーキテクチャーであることです。つまり、インメモリー データ オブジェクトに対してクエリーを実行した場合(2つのIM列ストアにオブジェクトが分散されていることを前提とする)、Affinityノードにあるデータのみにアクセスできます。これは、IMCU(インメモリー圧縮ユニット)がクラスター内のインスタンス間で共有されないことを意味します。
したがって、
並列度(DOP)をAUTOに設定できます。この並列クエリー コーディネーターは、IMCUの他のインスタンスを特定します。DOPをAUTOに設定できない場合は、並列クエリー コーディネーターはIMCUの他のインスタンスを使用しません。
set the degree of parallel to auto
alter system set parallel_degree_policy=AUTO scope=both sid='*';
複製:
可用性を高めるために、オブジェクトはすべてのインスタンスにコピーされます。複製されたサブ句を使用して、クラスター内のすべてのインスタンスにインメモリー テーブルを格納するよう指定できます。このオプションは、Engineered Systemsでのみ機能します。
例:alter table quest inmemory duplicate all;
questテーブルはすべてのインスタンスに格納されます。
インメモリー オブジェクトの監視:
インメモリー オブジェクトを監視するために、Oracleでは次の2つの新しいV$ビューを導入しました。
v$IM_SEGMENTSまたはv$IM_USER_SEGMENTS、およびv$IM_COLUMN_LEVEL。
これらのビューを使用して、現在IMCOLUMNストアに挿入されているオブジェクトの数を確認できます。
例:
set linesize 256
set pagesize 999
select segment_name,ROUND(SUM(BYTES)/1024/1024/1024,2) "DATA GB",
ROUND(SUM(INMEMORY_SIZE)/1024/1024/1024,2) "IN-MEM GB",
ROUND(SUM(BYTES-BYTES_NOT_POPULATED)*100/SUM(BYTES),2) "% IN_MEM",
ROUND(SUM(BYTES-BYTES_NOT_POPULATED)/SUM(INMEMORY_SIZE),2) "COMP RATIO"
from V$IM_SEGMENTS
group by owner,segment_name
order by SUM(bytes) desc;
SEGMENT_NAME ORIG GB IN-MEM GB % IN_MEM COMP RATIO
H_LINEITEM 317.27 68.2 88.77 4.13
H_PARTSUPP 35.17 21.04 100 1.67
例:
set linesize 256
set pagesize 999
set verify off
col OBJECT format a30
SELECT owner||'.'||table_name OBJECT,
inmemory INMEMORY,inmemory_priority PRIORITY,
inmemory_distribute DISTRIBUTE,inmemory_compression COMPRESSION,
inmemory_duplicate DUPLICATE
FROM all_tables
where owner='QUEST'
ORDER BY inmemory, owner||'.'||table_name;
OBJECT INMEMORY PRIORITY DISTRIBUTE COMPRESSION DUPLICATE
H_NATION ENABLED CRITICAL AUTO FOR QUERY HIGH NO DUPLICATE
H_REGION ENABLED CRITICAL AUTO FOR QUERY HIGH NO DUPLICATE
H_CUSTOMER
H_SUPPLIER
上記の例では、CustomerとSupplierの2つのテーブルに、INMEMORY列の値がないことがわかります。INMEMORY属性は、セグメント レベルの属性です。CustomerとSupplierは、どちらもパーティション化されたテーブルであるため、論理オブジェクトです。これらのテーブルのINMEMORY属性は、*_TAB_ (SUB) PARTITIONSのパーティションまたはサブパーティション レベルに記録されます。
各テーブルの現在のInMemory属性を示すために、INMEMORY_PRIORITY、INMEMORY_DISTRIBUTE、INMEMORY_COMPRESSIONの3つの列が、*_TABLESビューに追加されています。