免責事項
以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。また、情報提供を唯一の目
的とするものであり、いかなる契約にも組み込むことはできません。以下の事項は、マテリアルやコード、機能を
提供することをコミットメント(確約)するものではないため、購買決定を行う際の判断材料になさらないで下さい。
オラクル製品に関して記載されている機能の開発、リリースおよび時期については、弊社の裁量により決定さ
れます。
Oracleは、米国オラクル・コーポレーション及びその子会社、関連会社の米国及びその他の国における登録商標または商標です。
他社名又は製品名は、それぞれ各社の商標である場合があります。
Oracle Database 12c Release 1 (12.1.0.2)
CoreTech Seminar
Oracle Database In-Memory: メモリー構造と設定
日本オラクル株式会社
データベース事業統括 製品戦略統括本部
データベースエンジニアリング本部 Database & Exadata技術部
井上 克己
Agenda
1
2
3
メモリー構造
ポピュレーション
インスタンス・レベルの設定と動作
オブジェクト・レベル、カラム・レベル設定
圧縮
プライオリティ
4
5
2
3
4
5
ポピュレーション
インスタンス・レベルの設定と動作
オブジェクト・レベル、カラム・レベル設定
圧縮
プライオリティ
6
6
System Global Area (SGA)
Buffer Cache
Shared Pool
Redo Buffer
Large Pool
Other shared
Memory
Components
In-Memory
Area
INMEMORY_SIZE
パラメータ
インメモリ・カラム・ストアの基本構成
SGA内の新たな領域として、
インメモリ領域を追加
INMEMORY_SIZE
パラメータによりサイズ設定
最小値は100MB
SGA_TARGETは十分に
大きな値の設定が必要
静的プールとして確保
SGA
Buffer Cache
インメモリ・カラム・ストア
IMCU
Wnnn
1 MB Pool
64 KB Pool
メタ
データ
IMCO
ジャーナル
IMCU =
I
n-
M
emory
C
ompression
U
nit
IMCU
IMCU
メタ
データ
メタ
データ
インメモリ・カラム・ストア: 2つのプール領域
ジャーナル
インメモリ・カラム・ストアの構成
•
1MBプール と 64KBプール
–
1MBプール: 列型形式のデータがIMCUとして格納される
•
1MBの倍数単位で割り当てられる
–
64KBプール: 複数の目的で使用される
•
IMCUのメタデータ格納のため使われる
•
データ更新時、削除時などにジャーナルとして使われ使用率が増える
•
inmemory_sizeパラメータで指定したサイズの一定の割合が64KBプールと
して自動で割り当てられる
ディスクとインメモリ: 比較
ディスク上の表領域: 行型フォーマット
Data file 1
Data file 2
Data file N
セグメント
Extent
Extent
Extent
Extent
Block
Block
Block
行
行
行
In-Memory Area
IM セグメント
IMCU
IMCU
IMCU
インメモリ・カラム・ストア: 列型フォーマット
カ
ラ
ム
カ
ラ
ム
カ
ラ
ム
カ
ラ
ム
IMCU = In-Memory Compression Unit
IM セグメント
セグメント
IMCU(In-Memory Compression Unit):
カラム以外の構成物
6列の表の例
P_PARTKEY
P_NAME
P_MFGR
IMCU内の行数は圧縮指定に
より異なる
全てのIMCU内にカラム数分
のカラム圧縮ユニット
各IMCU内にRowID CUと
各カラムの最大最/小値エリア
が存在
他のカラム
RowID Min/Max
100M行の表の場合
数百個のIMCU
数十万行分の値
Agenda
1
2
3
メモリー構造
ポピュレーション
インスタンス・レベルの設定と動作
オブジェクト・レベル、カラム・レベル設定
圧縮
プライオリティ
4
5
6
ora_w001_orcl
ポピュレーション(population)とは
•
データをディスクからインメモリ・カラム・
ストアへ載せる動作を指す
–
データベースに新しいデータを取り込まない
–
既存データをメモリー中に最適化されたカラム
型フォーマットで取り込む
•
ポピュレーションはバックグラウンドで実
行される
–
ora_wNNN_${SID} プロセス
–
ワーカー・プロセス数は新しく追加された
INMEMORY_MAX_POPULATE_SERVERS
パラメータで設定
SALES
インメモリ・カラム・ストア
ポピュレーション
•
対象セグメント(表、パーティションなど)
を水平分割し複数プロセスで処理
–
分割時の処理については後述
•
ダイレクト・パス読み取り
–
バッファ・キャッシュには載らない
•
右図の解説
–
行数の異なる3つの表で
合計9つのIMCUの場合
–
9ワーカー・プロセスが同時に起動
SALES
PRODUCTS
CUSTOMERS
IMCUへの分割
•
ポピュレーション時に内部で自動的に分割し、1ワーカー・プロセスが1つ
のIMCUを作成
•
IMCUのサイズは行数、または、ディスク上でのサイズにより分割される
–
数十万行、数100MB程度
–
1行のサイズの平均が小さい場合、行数で分割される
最大値/最小値(ストレージ・インデックス)
•
ポピュレーション時に全てのIMCUで全てのカラムのmin/max値が格納される
•
NUMBER、VARCHAR2、CHAR、DATE型などはmin/max値が格納される
•
Exadataのストレージ・インデックスと類似する機能
プロセス構成
•
IMCO(
I
n-
M
emory
Co
ordinator)プロセスがコーディネータとして機能
–
SMCO(space management coordinator)と連携し"KTSJ"と呼ばれるタスク管理機構を
使用
–
ポピュレーションのリクエストはキューに入れられる
–
2分間隔でキューから取り出されタスクが実行される
•
キューは優先度が指定される
•
実際のポピュレーションはワーカー・プロセス(ora_wNNN_${SID})が実行
–
CPUとI/Oリソースを多く使用する傾向がある
起動するワーカー・プロセスの最大プロセス数の指定
•
初期化パラメータ
INMEMORY_MAX_POPULATE_SERVERS
で明示的に設定可能
•
右: ポピュレーション実行時の
topコマンドの画面ショット
(Linuxプラットフォーム)
起動するワーカー・プロセス数
•
デフォルトで起動される
プロセス数は
PGA_AGGREGATE_TARGET、
PGA_AGGREGATE_LIMIT
により決まる
–
上記2つがある程度大きい場合、
(コア数)*(スレッド数)/2
•
各プロセスがPGAを使用
–
PGA合計使用量に加算される
•
右: oratopコマンド画面ショット
ポピュレーション: その他
•
IMCUの範囲を読み取り一貫性でデータを読み取る
–
"ORA-1555: Snapshot is too old" などのエラーが発生した場合は
自動的にリトライされる
•
ポピュレーション実行時のCPUリソースとメモリーの使用量
–
圧縮率レベルの指定やデータ(データ型、カーディナティなど)に依存
•
必ずバックグラウンドで行われる
•
V$IM_HEADERビューのTIME_TO_POPULATEカラムで個々のIMCUの
ポピュレーションにかかった時間を確認可能
PRODUCTSCUSTOMERS
ORDERS
インメモリ領域の使用率の確認方法
•
V$INMEMORY_AREAビューを使用
•
1MBプールと64KBプールの両方に未使用領域がある場合
–
通常、64KBプールの方が"使用率"が低い
•
1MBプールに空き領域がない場合
–
64KBプールが枯渇することはない
SQL> SELECT * FROM V$INMEMORY_AREA;
POOL ALLOC_BYTES USED_BYTES POPULATE_STATUS CON_ID
--- --- --- --- ---
1MB POOL 171781914624 81371594752
DONE
0
64KB POOL 42932895744 298975232
DONE
0
POOL ALLOC_BYTES USED_BYTES POPULATE_STATUS
--- --- --- ---
1MB POOL 8186232832 8186232832
OUT OF MEMORY
インメモリ・カラム・ストア領域が枯渇する場合
•
ポピュレーションを行うプロセスは1MBプール領域を全て使い、1つでも多く
のブロックをインメモリ化する
–
部分的にインメモリ化される表が存在する可能性がある
•
エラーはアプリケーションのユーザーには返らない
–
非同期にバックグラウンドで実行されるため
•
alert.logに以下のメッセージが出力される
ポピュレーションに関する統計値
CPU待機クラス: Database In-Memory関連の待機イベント
•
Enterprise Manager Cloud Control 12c
のASH(Active Session History)
分析画面でCPU待機クラスへ
ドリルダウン
CPU待機クラス: Database In-Memory関連の待機イベント
•
ポピュレーション時のCPUリソース使用
は以下のように2種類に分けて集計
•
CPU: IM Prepopulate
–
優先度(CRITICAL、HIGH…)が付けられ
ているセグメントに対するポピュレーション
•
CPU: IM Populate
–
優先度NONEのセグメントに対して
オン・デマンドで行われるポピュレーション
Agenda
1
2
3
メモリー構造
ポピュレーション
インスタンス・レベルの設定と動作
オブジェクト・レベル、カラム・レベル設定
圧縮
プライオリティ
4
5
6
メモリー領域
•
INMEMORY_SIZEパラメータのみの設定で使用可能
–
設定可能な最小値は100MB
–
Enterprise Manager Cloud Control 12cでも設定可能
•
スタティックな領域で自動メモリー管理により増減されない
–
SGA_TARGET、SGA_MAX_SIZE、MEMORY_TARGET、MEMORY_MAX_TARGET で設定
されるメモリー容量にはINMEMORY_SIZEに割り当てられるサイズが含まれるため、
設定値を増加について検討が必要となる場合がある
•
ALTER SYSTEM FLUSHに相当するコマンドはない
–
個別(セグメント<表、パーティション>)は ALTER TABLE … NO INMEMORY 文で可能
•
COMPATIBLEパラメータを"12.1.0.0.0"以上に設定
Database In-Memoryを使うための初期化パラメータ設定例
SQL> ALTER SYSTEM SET SGA_TARGET=8G SCOPE=SPFILE;
SQL> ALTER SYSTEM SET INMEMORY_SIZE=1G SCOPE=SPFILE;
SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP
SQL> SELECT * FROM V$SGA;
NAME
VALUE
--- ---
Fixed Size
2927176
Variable Size
570426808
Database Buffers
4634022912
Redo Buffers
13848576
In-Memory Area
1024483648
Database In-Memoryに関連する初期化パラメータ(1)
•
DBCAでデータベース作成時に上記の
パラメータの値を任意に設定可能
SQL> show parameter inmem
NAME TYPE VALUE
--- --- ---
inmemory_clause_default string
inmemory_force string DEFAULT
inmemory_max_populate_servers integer 64
inmemory_query string ENABLE
inmemory_size big integer 120000000
inmemory_trickle_repopulate_servers_percent integer 1
Database In-Memoryに関連する初期化パラメータ(2)
•
INMEMORY_CLAUSE_DEFAULT
–
デフォルトの圧縮レベル、優先度等を設定
•
注意点:
値に"INMEMORY …"と指定すると新規に作成される表はINMEMORY指定がない場合でも
インメモリ化される
•
INMEMORY_FORCE
–
"OFF"に設定することで "INMEMORY" 指定されている表もインメモリ化されなくなる
•
INMEMORY_MAX_POPULATE_SERVERS
–
ポピュレーション時の最大プロセス数を指定
Database In-Memoryに関連する初期化パラメータ(3)
•
INMEMORY_QUERY
–
インメモリ検索の有効化/無効化を指定
•
INMEMORY_TRICKLE_REPOPULATE_SERVERS_PERCENT
–
トリクル再ポピュレートのためにワーカープロセスが使用可能なCPUリソースの割合
(%)を設定
読み取り専用オープンでのDatabase In-Memory機能
•
ALTER DATABASE OPEN READ ONLYでのオープン時は内部的にDatabase
In-Memory機能が無効化される
•
Active Data Guardで スタンバイ・データベースを読み取り専用でオープン
してもDatabase In-Memory機能は使用できない
–
将来のバージョンでの対応を予定
–
ロジカル・スタンバイ・データベースおよびOracle GoldenGateの複製先では
Agenda
1
2
3
メモリー構造
ポピュレーション
インスタンス・レベルの設定と動作
オブジェクト・レベル、カラム・レベル設定
圧縮
プライオリティ
4
5
6
インメモリ・カラム・ストアにポピュレーションすることが
可能なオブジェクトの種類
•
表
–
1つの表内の特定の列のみ指定することも可能
•
パーティション
–
全てのタイプ(リスト、レンジ…)に対応
–
表レベルで設定された場合、全てのパーティションがインメモリ化される
–
サブ・パーティションも指定可能
•
マテリアライズド・ビュー
インメモリ・カラム・ストアにポピュレーションすることが
不可能な表
•
グローバル一時表(GTT)
•
外部表
•
索引構成表
•
クラスタ化表
•
SYSユーザーが所有する SYSTEM表領域、SYSAUX表領域のオブジェクト
•
ディスク上のサイズが64KB以下の表
•
Advanced Replicationが設定されている表
ORA-30657: operation not supported on external organized table
ORA-14451: この機能は一時表ではサポートされていません。
インメモリ・カラム・ストアにポピュレーションすることが
不可能なカラム
•
同一表中のインメモリ化が不可能なカラム以外はポピュレーションされる
•
サポートされないデータ型
–
LONG
–
インラインでないCLOB、BLOB
•
ENABLE STORAGE IN ROWの場合4KBまではインメモリ化される
–
4KB を超えるVARCHAR2、RAW
•
初期化パラメータMAX_STRING_SIZEにEXTENDEDを設定している場合
カラム・レベルでの指定
•
V$IM_COLUMN_LEVELビューで確認
•
プライオリティ と RAC 固有属性はカラム間で異なる設定はできない
•
圧縮レベルのみカラムごとに個別で設定が可能
•
パーティション毎に異なる設定はできない
–
ORA-14049: invalid ALTER TABLE MODIFY PARTITION option
SQL> ALTER TABLE sales
INMEMORY
NO INMEMORY
(PROD_ID);
SQL> SELECT TABLE_NAME, COLUMN_NAME, INMEMORY_COMPRESSION
FROM V$IM_COLUMN_LEVEL;
カラム・レベル:
Database In-Memory機能とDDL操作に関する注意点
•
インメモリ化するオブジェクトに対してアクティブなトランザクションがある
場合、ALTER TABLE … INMEMORYの実行時にORA-54エラーが発生
–
ORA-00054: リソース・ビジー。NOWAITが指定されているか、タイムアウトしました
–
ポピュレーション中にDML操作を行うことは可能
•
"圧縮" 変更(後述)によりインメモリ・カラム・ストア中の該当IMCU領域は無
効化および再ポピュレーションが行われる
•
"プライオリティ"変更(後述)により インメモリ・カラム・ストア中の該当IMCU
領域は無効化され再度ポピュレーションが行われる
DDL操作と再ポピュレーションの必要性
•
カラム追加: インメモリ・カラム・ストアに影響なし
–
ALTER TABLE … ADD
•
カラム削除: 表全体が一旦インメモリ・カラム・ストアから無効化 され再ポ
ピュレーションが発生する
•
カラム属性変更: 無効化されない
•
パーティション関連の操作
–
パーティションの交換操作(EXCHANGE PARTITION)では再ポピュレーションは発生し
ない
–
その他 MOVE / SPLIT / MERGE ではインメモリ・カラム・ストアからの無効化および再
パーティションの交換操作時の動作
•
ALTER … EXCHANGE PARTITION実行前にINMEMORY属性を非パーティション表に設定
April 4th
2014
April 5th
2014
April 6th
2014
April 7th
2014
April 8th
2014
April 9th
2014
April 4th
2014
April 5th
2014
April 6th
2014
April 7th
2014
April 8th
2014
April 9th
2014
1.外部表の作成
temp_sales
2.CTASで非パーティション表
にロード
Sales 表
Sales 表
temp_sales
3. INMEMORY
属性の設定
4.統計情報の収集
5. alter table sales exchange partition
確認:
*_TABLESビュー INMEMORY列
•
*_TABLESディクショナリ・ビューに
新規に
INMEMORY
列が追加
•
INMEMORY はセグメント属性
SQL> SELECT table_name, inmemory
FROM USER_TABLES;
TABLE_NAME
INMEMORY
--- ---
CHANNELS DISABLED
COSTS
CUSTOMERS DISABLED
PRODUCTS ENABLED
SALES
TIMES
DISABLED
•
*_TABLESビューではロジカル・オブ
ジェクトにはセグメント属性を表示
しない
•
COSTSとSALESはパーティション
化されている、つまり、ロジカ
ルオブジェクト
•
*_TAB_PARTITIONSビューにも
INMEMORY列が追加
確認:
INMEMORY属性が設定された表のステータス
•
新規ビュー
V$IM_SEGMENTS
•
EMCC 12cから参照可能な情報:
•
インメモリ・カラム・ストアにポピュレート
されたオブジェクト
•
現在のポピュレーション・タスクのステー
タス
•
圧縮率
SELECT segment_name name,
populate_status status
FROM v$IM_SEGMENTS;
NAME
STATUS
--- ---
PRODUCTS COMPLETED
SALES
STARTED
Agenda
1
2
3
メモリー構造
ポピュレーション
インスタンス・レベルの設定と動作
オブジェクト・レベル、カラム・レベル設定
圧縮
プライオリティ
4
5
6
IMCU内のカラムユニットごとに圧縮
メモリー
SALES
カラム型
フォーマット
IMCU#2
IMCU#4
flag NULL Bit Vector Run Lengths Length Vector Data Vector/ Dictionary # Runs
Dictionary Encoded Values CLA CRLA Dict Size
カラムユニット
ディクショナリ
ディクショナリ・コード
または
カラム・データ
flag NULL Bit Vector Run Lengths Length Vector Data Vector/ Dictionary # Runs
Dictionary Encoded Values CLA CRLA Dict Size