...

Oracle12c Database In

by user

on
Category: Documents
650

views

Report

Comments

Transcript

Oracle12c Database In
Presented with
第138回夜な夜な! なにわオラクル塾
Oracle12c Database In-Memory
入門!
日本オラクル株式会社
データベース事業統括
ソリューション本部
中部・西日本SC部
2015年01月28日
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
Safe Harbor Statement
以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。また、情報提供を唯一の目的とす
るものであり、いかなる契約にも組み込むことはできません。以下の事項は、マテリアルやコード、機能を提供すること
をコミットメント(確約)するものではないため、購買決定を行う際の判断材料になさらないで下さい。
オラクル製品に関して記載されている機能の開発、リリースおよび時期については、弊社の裁量により決定されます。
Oracleは、米国オラクル・コーポレーション及びその子会社、関連会社の米国及びその他の国における登録商標また
は商標です。
他社名又は製品名は、それぞれ各社の商標である場合があります。
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
2
Program Agenda
1
開発の背景と概要
2
技術ポイント
3
他社インメモリDBとの違い
4
利用用途例
5
まとめ
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
3
Program Agenda
1
開発の背景と概要
2
技術ポイント
3
他社インメモリDBとの違い
4
利用用途例
5
まとめ
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
4
Oracle Database In-Memoryの開発ゴール
リアルタイム
アナリティクス
100x
アプリケーション
の変更なし
OLTPの
高速化
最新世代の
H/Wを有効活用
CPU
2x
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
5
Oracle Database In-Memory Option
既存データベースの概念を根底から覆すテクノロジー
• お客様の既存資産(データとアプリケーション)の完全なる保護と継承
• Oracle Databaseの卓越した高可用性とセキュリティ機能をそのまま利用可能
• 完全なるデュアルフォーマットの提供により、OLTPとDWHの完全なる融合
• 情報系からのインデックス排除による開発・運用コストの劇的な削減
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
6
高速な分析をリアルタイム化する新たな技術革新
Databaseにおける主要な2種類のフォーマット – ロー型 vs カラム型
売上
ロー
(行)型
– 例:注文データの挿入と検索
– 少数の行(ロー)と多数の列(カラム)を高速処理
売上
カラム
(列)型
 OLTP処理を得意とするロー型
 集計、分析処理を高速化するカラム型
– 例:都道府県毎の売上合計のレポート
– 少数の列(カラム)と多数の行(ロー)を高速処理
Oracle Database In-Memory テクノロジーは、各特性を持つ
2つのフォーマットを“両方同時に”メモリー上にロードし利用可能
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
7
高速な分析をリアルタイム化する新たな技術革新
インメモリ・デュアル・フォーマット
メモリー
メモリー
 同一のデータを行型、カラム型双方
のフォーマットで保持
 インメモリ化指定したもののみ
売上
行型
フォーマット
売上
カラム型
フォーマット
 双方のフォーマットを同時に利用可能
トランザクションの一貫性も担保
 集計、レポート処理はカラム型
フォーマットに対して実行
 OLTP処理は行型フォーマットに
対して実行
1つのSales表というオブジェクトに
対して2つのフォーマット
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
8
OLTPとOLAPの性能向上はトレードオフ
どちらかを性能向上するとどちらかにオーバーヘッドが発生
OLTPとOLAPを1つのデータベースで
共存することは難しい
OLTP
トランザク
ション性能
OLAP分析
処理性能
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
9
一般的なOLTPとDWHの構成
• OLTPとDWHは別のHWで動作し、連携はバッチで同期を取っている
– DWH用のHWやDatabaseライセンスコストがかかる
– リアルタイムにデータが見れない
– 夜間バッチのパフォーマンスのためにリソース強化
OLTP
夜間バッチで1日1回 同期
DWH
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
10
Oracle 12c Database In-Memory: デュアル・フォーマット
Oracle 12c Database In-Memoryはデュアル・フォーマットなので、データベース
のオプティマイザがSQLにあわせて最適なフォーマットを選択してSQLを処理し
ます。(他社のインメモリ機能はハイブリッド型:オブジェクトをどちらの方式に
するか決定する必要あり)
Select * from sales_t
Where order_id = ‘ABC123’;
少数の行の全カラムのデータ
取得
Select region, sum(amount)
from sales_t
Group by region;
sales_t表
デュアル・フォーマット
行型
B-Tree索引を
使用した処理
Oracleデータベース
オプティマイザ
カラム型
インメモリ検索を
使用した処理
一部カラムを使った大量行の
集計処理
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
11
アプリケーションの変更は不要
機能性
実装容易性
互換性
マルチテナント
- SQLの制限なし
- データマイグレーションの必要なし
- 全ての既存アプリケーションは改修なく動作
- クラウド対応済み
アプリケーションの変更なく、インメモリのメリットを享受
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
12
カラム型表は何故分析用クエリーが高速か?
ポイント2:
効果的な圧縮技術により
圧縮した状態で検索が可能
(ディクショナリ圧縮)
C1 C2 C3 C4 C5 C6
ポイント3:
インメモリ・ストレージ索引により
最小限のユニットのみスキャン
例) where storeid > 8
Min 1
Max 3
Min 4
Max 7
ポイント4:
最新のプロセッサで搭載されている
SIMDにより高速スキャン
CPU
複数の
データを
ロード
Min 8
Max 12
Min 13
Max 15
ベクター・レジスタ
ポイント1:
集計に必要なカラムのみアクセス
CA
CA
CA
一度の命令で
全ての値を
ベクター演算
CA
ポイント5:
パラレル・クエリーとパーティション表
によりさらに高速化可能
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
13
カラム型表は何故分析用クエリーが高速か?
ポイント1: 必要なカラムのみアクセス(行フォーマット型の場合)
バッファ・キャッシュ
SELECT COL4 FROM MYTABLE;
X
X
X
X
X
行フォーマット
結果
X X X X X
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
14
カラム型表は何故分析用クエリーが高速か?
ポイント1: 必要なカラムのみアクセス
インメモリ・カラム・ストア
SELECT COL4 FROM MYTABLE;
結果
カラム・フォーマット
X
X
X
X
X
必要なカラムのみアクセス
データの読込量少ない
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
15
カラム型表は何故分析用クエリーが高速か?
ポイント1: 必要なカラムのみアクセス(実行計画)
インメモリ検索の実行計画例

新しいアクセス方法

インメモリ検索を有効/無効化する
パラメータ
TABLE ACCESS INMEMORY FULL
INMEMORY_QUERY = {enable | disable}
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
16
カラム型表は何故分析用クエリーが高速か?
ポイント2: ディクショナリ圧縮
非圧縮
EMP表のJOB列
-----------------CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK
ディクショナリ圧縮
ディクショナリ(distinctされた値)
ソ
ー
ト
さ
れ
た
値
97
bytes
カラム値
ディクショナリ値
ビット表現
ANALYST
0
000
CLERK
1
001
MANAGER
2
010
PRESIDENT
3
011
SALESMAN
4
100
カラム値サイズ合計+ビット値合計
→ 36 bytes + 3bit * 5 = 38 bytes
ディクショナリ圧縮は
圧縮した状態で検索
が可能
Where job = ‘MANAGER’
Where job = 010
に内部的に変換
※圧縮状態で検索可能
エンコードされた各行の値
行
001 100 100 010 100 010 010 000 011 100 001 001 000 001
3bit * 14行 = 5.25bytes  38 + 5.25 = 44 bytes
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
(1/2.2 圧縮)
17
カラム型表は何故分析用クエリーが高速か?
ポイント3: インメモリ・ストレージ索引 (※メモリー内に定義される)
Select … From sales Where storeid > 8;
• 各カラムは複数のIMCUで構成さ
れる
メモリー
• 各IMCUで最小値/最大値を
自動的に記録
• WHERE句の条件に合致する領域
だけを読み込み
• すべての検索でパーティション・プ
ルーニングと同様の
パフォーマンスを提供
IMCU
Min 1
Max 3
IMCU
Min 4
Max 7
IMCU
Min 8
Max 12
IMCU
Min 13
Max 15
storeid
SALES表
カラム
フォーマット
IMCU - In-Memory Compression Unit
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
18
SIMD※による効果的な演算
※ SIMD: Single Instruction Multiple Data
ポイント4:最新のプロセッサで搭載されているSIMD命令セットにより高速スキャン
通常の命令セットの場合(1組のデータ演算から1つの結果を算出)
4回の一致
比較の場合
レジスタ
CPU命令
A1 B1
C1
CMPEQ
IF ( A1 = B1 ) → C1
IF ( A2 = B2 ) → C2
IF ( A3 = B3 ) → C3
IF ( A4 = B4 ) → C4
A2 B2
C2
A3 B3
CMPEQ
C3
A4 B4
CMPEQ
C4
CMPEQ
4回繰返し
SIMD命令セットの場合(複数のデータを1回の演算命令で高速実行)
ベクター
レジスタ
A1 A2 A3 A4
CPU命令
CMPEQ (SIMD)
B1 B2 B3 B4
ベクターレジスタ
C1 C2 C3 C4
1回の命令で高速演算
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
19
カラム型表は何故分析用クエリーが高速か?
0
000
CLERK
1
001
MANAGER
2
010
PRESIDENT
3
011
SALESMAN
4
100
001 100 100 010 100 010 010 000 011
ディクショナリ圧縮により
実データ値をビットデータとして
扱うことでより多くのデータを
CPUレジスタにロード可能
SIMD
ベクター・レジスタ
ANALYST
JOB
ポイント4:最新のプロセッサで搭載されているSIMD命令セットにより高速スキャン
EMP表
インメモリ・カラム・ストア
例: 「MANAGER」職種を検索
JOBカラム値
ディクショナリ値
ビット表現
(MANAGER → 010)
複数の
データを
ロード
CPU
010
100
010
010
001
110
010
100
一度の命令で
全ての値を
ベクター演算
MANAGER → 010(エンコード値)
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
20
カラム型表は何故分析用クエリーが高速か?
ポイント5:インメモリ検索はパラレル・クエリー、パーティション表によりさらに高速化
パラレル・クエリーで
さらに高速化
インメモリ・スキャン = TABLE ACCESS INMEMORY FULL
QS
QS
QS
QS
一部のパーティションをインメモリ化
→ パーティション・プルーニングにより高速化
基本的にFull Table Scanの発展系
→ データはインメモリ・カラム型で圧縮
→ 必要なカラムのみアクセス
→ インメモリ・ストレージ索引により
最低限のIMCUスキャン
カラム
型
行型
P1
P2
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
P3
P4
21
Database In-Memoryとパラレル・クエリー
メモリー内で
並列処理
autoDOPはインメモリ構成も
考慮してパラレル度を決定
QS
インメモリ・カラム・ストアなので
対象データはメモリー内にある
QS
In-Memory Parallel
Executionと同様の動き
(Buffer CacheではなくIMC利用)
QS
+
高速なインメモリ検索
インメモリ・カラム・ストア(IMC)
QS
クエリー
スレーブ




必要なカラムのみアクセス
効果的な圧縮(高速検索)
効率的なSIMD利用
インメモリ・ストレージ索引
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
基本的にディスク
読込は発生しない
22
インメモリ検索による表の結合処理の高速化
複数表の結合処理を内部的に高速カラム検索に変換 (ベクター結合)
例: 直販店(outlet)の売上合計を集計

インメモリ・カラム・ストアにより
複数表の結合処理を高速化
売上
店舗
1. ジョイン・フィルタと呼ばれるフィルタを
Type=Outlet
インメモリ固有の機能ではないが
インメモリ検索で非常に効果的
 店舗表のTYPE=‘OUTLET’ に該当する
StoreIDをリスト
Amount
StoreID in
15, 38, 64
カラム検索を使用して作成
Store ID
Store ID
Type
ジョイン・フィルタ
合計値
2. 作成したジョイン・フィルタの条件にあう
売上表のAMOUNTの合計値を計算
 ジョイン・フィルタから以下の条件を生成
「where StoreID in (15, 38, 64)」
 上記の条件にヒットする行の売上表
単体のカラム検索により高速にAMOUNT
列の合計値を算出
( SUM(AMOUNT) )
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
23
インメモリ検索による表の集計処理の高速化
ベクターGroup By(Vector Group By)
例: アウトレットでの靴の売上を集計
店舗表
インメモリ・レポート
アウトライン
売上表
Footwear
Footwear
商品表
$
$$
$$$
上に動的に作成(インメモリ配列)
 レポート内の集計値は
ファクト表のスキャン中に展開
Outlets
Outlets
 レポート・アウトラインをメモリー
 事前定義された多次元
$
キューブを使わずに高速化
Sales
インメモリ固有の機能ではないが
インメモリ検索で非常に効果的
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
24
分析基盤におけるインデックスが不要
• 既存Oracle Databaseによる分析基盤
• Oracle Database In-Memoryの適用
– インデックスは事前予測可能な
パターンのみ高速化
– インデックスなしですべての
カラム(列)の処理を高速化
– 更新処理は10~20個のインデックスの更新が必要
– カラム型ストアはディスクI/Oなし
• パフォーマンス低下の原因
1~3
OLTP用
インデックス
表
1~3
OLTP
インデックス
10 ~ 20
分析用
インデックス
インメモリ
カラム型
ストア
表
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
25
スケールアウト構成 – RACとの組み合わせ例 1/2
アプリケーションから透過的に表パーティション毎に柔軟な分散配置を構成可能
• 分散配置
– 大規模データを各ノードで分割して保持
– ROWIDもしくはパーティションで分割
Real Application Clusters
– インメモリ・カラム・ストアの
スケールアウトが可能
– In-Memory Parallel Queryと組み合わせによるインメモリ
並列処理が可能
• 複製配置
– 小規模データを各ノード重複して保持
– 2ノードもしくはすべてのノードに複製
Real Application Clusters
– ノード耐障害性の向上
– In-Memory Parallel Queryと組み合わせによるインメモリ
並列処理が可能
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
26
スケールアウト構成 – RACとの組み合わせ例 2/2
アプリから透過的にテーブル・パーティション毎に柔軟な分散配置を構成可能
• 分散+複製配置
In-Memory Parallel Query
– 大規模データを各ノードで分割し保持
• インメモリ・カラム・ストアのスケールアウトが可能
– In-Memory Parallel Queryと組み合わせによる
インメモリ並列処理
– 複製データにより可用性を向上し、
障害時の再インメモリ化(ポピュレーション)時間
を削減
– スケーラブルな可用性の高い
並列分析処理基盤の構築が可能
Real Application Clusters
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
複製データ(Duplicate 2)
• 各ノードのCPUを有効活用
27
可用性・セキュリティを既存の仕組みで実装可能
• 既存のOracle Databaseの信頼性・可用性・拡張性・セキュリティに
関わる機能をOracle Database In-Memoryでも透過的に利用可能
• ストレージ・フォーマット、ロギング、
バックアップ/リカバリなどの運用管理に
影響なし
• 既存のOracle Databaseの可用性機能は
透過的に動作
• 既存のOracle Databaseのデータ保護機能も
透過的に動作
– ノード障害、サイト障害、データ破損、
人的エラーなど
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
28
基本導入手順(設定・運用管理)
基本3ステップ
事前調査
本当に効果が
あるデータは
何か?
インメモリ・カラ
ム・ストアの
サイズは?
インメモリ・カラ
ム化する
データの選択
運用管理
不要な
インデックスを
削除
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
インメモリ・カラ
ム・ストアの
状況監視
29
容易な設定作業のみで実装可能
1. 使用するメモリ容量を設定
inmemory_size = XXX GB
2. メモリー上に格納するテーブル、パーティションを選択
alter table | partition … inmemory;
3. インデックスを削除
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
30
TimesTen In-Memory Database
更なるOLTPレイテンシを要求される場面でIn-Memory Technologyを補完
同アドレス空間
TIMESTEN
IN-MEMORY DATABASE
アプリケーション
150マイクロ秒の
ネットワーク処理
N
E
T
アプリケーションとデータベース間の
ネットワーク・レイテンシによるOLTP
処理遅延
- 呼制御、 株式トレーディング、他
5マイクロ秒で
SQLを実行
TimesTen In-Memory Database
非常に軽量で高速なインメモリDB
- 非常に軽量で高速なインメモリデータベース
Oracle
Database
- アプリケーションのアドレス空間で稼働
ネットワークレイテンシなし
- OLTP処理を30倍高速化
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
31
Program Agenda
1
開発の背景と概要
2
技術ポイント
3
他社インメモリDBとの違い
4
利用用途例
5
まとめ
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
32
インメモリ・カラム・ストアの基本構成
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
33
インメモリ・カラム・ストアの基本構成
• SGA内の新たな領域として、
インメモリ領域を追加
• INMEMORY_SIZE
パラメータによりサイズ設定
– 最小値は100MB
System Global Area (SGA)
Buffer Cache
Shared Pool
Redo Buffer
Large Pool
Other shared
Memory
Components
In-Memory
Area
• SGA_TARGET は十分に
大きな値の設定が必要
• 静的プールとして確保
INMEMORY_SIZE
パラメータ
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
34
インメモリ領域: SGA内の新しい領域
• INMEMORY_SIZE
初期化パラメータ
• 100MB が設定可能な最小値
• SGA_TARGET に十分な
空きが必要
• スタティック(静的) なプール
• 変更後再起動
確認方法
SELECT * FROM V$SGA;
NAME
-----------------Fixed Size
Variable Size
Database Buffers
Redo Buffers
In-Memory Area
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
VALUE
--------2927176
570426808
4634022912
13848576
10244836480
35
インメモリ領域: 構成
• 2つのサブプールで構成:
– IMCU(1MB)プール:
IMCU(In-Memory Compression Units)を格納
インメモリ領域
• 1MBの倍数単位で使われる
IMCU
IMCU
IMCU
IMCU
• 連続領域、エクステント
– SMU(64KB)プール:
SMU(Snapshot Metadata Units)を格納
• 64KB 1 つの中で完結
• 更新時に使用量が増える
IMCU
• IMCUはカラム書式のデータを格納
• SMUはメタデータとトランザクション情報を格納
– 1 IMCU の管理情報を格納する SMU Extentが1個作られる
– inmemory_size パラメータで指定したサイズの約 20 %が自
動で 64KB プールにされる
IMCU
IMCU
IMCU
SMU
SMU
SMU
SMU
SMU
SMU
SMU
SMU
SMUプール
(64KB)
IMCUプール(1MB)
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
36
インメモリ領域:確認
• V$INMEMORY_AREA:
現状の各プールのサイズと状態を表示
col pool for a10
col status for a20
select pool, alloc_bytes/1024/1024 alloc_MB,
used_bytes/1024/1024 used_MB,
(alloc_bytes - used_bytes)/1024/1024 free_MB
from v$inmemory_area;
割当領域
使用領域
空き領域
POOL
ALLOC_MB
USED_MB
FREE_MB
---------- ---------- ---------- ---------57338
42153
15185
IMCUプール 1MB POOL
14320
589.3125 13730.6875
SMUプール 64KB POOL
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
37
インメモリ領域:使用状況
• 空きがある状態
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
– 通常 64KB Pool の方が "空き率" が大きい。
• 空きがない状態
SQL> select pool,alloc_bytes,used_bytes,populate_status from v$inmemory_area;
POOL
ALLOC_BYTES USED_BYTES POPULATE_STATUS
---------------- ----------- ---------- ---------------1MB POOL
8186232832 8186232832 OUT OF MEMORY
64KB POOL
2063597568 26345472 DONE
– 64KB Pool の方があふれることはない• インメモリ領域があふれる場合
‐
‐
バックグラウンドプロセスの trc ファイルに以下が出力される
• ORA-64356: in-memory columnar area out-of-space
alert.log に以下が出る
• Insufficient memory to populate table to inmemory area.
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
38
ポピュレーション
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
39
ポピュレーション(population) とは
• データをディスクからインメモリ・カラム・ストアへ
載せる動作
インメモリ領域
• ポピュレーションは既存データをメモリー中に
最適化されたカラム型フォーマットで取り込む
– ポピュレーションは新しいデータを取り込まない
• ロギングのためのディスクI/Oなし
• データ更新のオーバーヘッドを極小化
– ポピュレーションのリクエストはキューに入れられる
• 2分間隔でキューから取り出されタスクが実行される
• キューは優先度が指定される
SALES
• ポピュレーションはバックグラウンドで実行される
– ORA_W001_orcl プロセス
• プロセス数はINMEMORY_MAX_POPULATE_SERVERS
初期化パラメータ(新規)で設定
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
40
ポピュレーション : オブジェクト(セグメント)属性
• INMEMORY 新属性
• 以下のセグメントの種類がサポートされる
ALTER TABLE sales INMEMORY;
– 表
ALTER TABLE sales NO INMEMORY;
– パーティション
– サブパーティション
– マテリアライズド・ビュー、マテリアライズド・ビュー・ログ
• 代表的なサポートされないセグメントの種類
– 外部表
– IOT(インデックス構成表)
– クラスタ化テーブル
CREATE TABLE
PARTITION BY
(PARTITION
(PARTITION
customers ……
LIST
p1 …… INMEMORY,
p2 …… NO INMEMORY);
– Out of line LOB
– SYS スキーマ、SYSTEM 表領域, SYSAUX 表領域のオブジェクト
– Advanced Replication 設定されている表
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
41
カラム・レベルでの指定(selective column機能)
• 列単位でのインメモリ指定が可能
– Alter Table文で指定
• V$IM_COLUMN_LEVEL ビュー で確認
– select table_name, column_name, inmemory_compression from v$im_column_level
• パーティション毎に異なる設定はできない
– ORA-14049: invalid ALTER TABLE MODIFY PARTITION option
Enterprise Managerからも確認・設定可能
ALTER TABLE sales INMEMORY
NO INMEMORY (PROD_ID);
EM Cloud Control での設定も可能
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
42
サポートされないカラム
• LONG
• Inline でない CLOB, BLOB
• 4KB 以上の VARCHAR2
• ネストされたテーブルカラム
• 仮想カラムはカラムレベルではサポートされない
– ORA-64359: INMEMORY clause may not be specified for virtual columns
※ 同一表の中のサポートされないカラム以外はポピュレーションされる
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
43
AWR: インメモリ・セグメント統計
• AWR レポートにインメモリ・
セグメント統計が追加
– V$IM_HEADER の
TIME_TO_POPULATE カラムで
ポピュレーションにかかった
時間を確認可能
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
44
IMCU - カラム型フォーマット
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
45
IMCU: In-Memory Compression Unit
IMCU
IMCUヘッダー
• カラム型オブジェクトの管理単位
カラム・ユニット(CU)
– カラム型データをある程度の行数のセットで
保持(例:50万行程度)
– 格納される行は1つ以上の
表エクステントから取得
ROWID
EMPID
NAME
DEPT
SALARY
• IMCUの実サイズは行サイズ、
圧縮率等により変化
(固定値ではない)
• カラム毎に分離/近接した
カラム・ユニット(CU)として保存
– Rowidも同様に1つのCUとして保存
Extent #13
Blocks 20-120
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
Extent #14
Blocks 82-182
Extent #15
Blocks 201-301
46
IMCU = In-Memory Compression Unit
CU = Column Unit
行型フォーマットとカラム型フォーマット
In-Memory Area: カラム・ストア
On-Disk 表領域: 行型フォーマット
In-Memory Area
Data file 1
IM Segment
Data file 2
Data file N
IM Segment
Segment
Extent
Block
Extent
Extent
Block
IMCU
IMCU
Extent
Row
Row
Row
Row
Block
8KB
IMCU
C
U
C
U
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
C
U
C
U
n MB
47
IMCU 分割基準
• 行数、または、サイズ
– 数十万行、数100MB程度
– 行長平均が小さい場合、行数で分割される
• ポピュレーション時に分割し1プロセスが 1つの IMCU作成
• HCC(Hybrid Columnar Compression) と比較するとユニットサイズは大きい
• 特別なカラム・ユニット(CU)
– ROWID CU
– 各カラムの最大最小値エリア
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
48
IMCUの確認(1) – 各オブジェクトのIMCU数
• V$IM_HEADER:
現在のインメモリ・カラム・ストア内のIMCU数の確認
col object_name for a20
SELECT OBJECT_NAME, count(*) NUM_IMCU
FROM V$IM_HEADER i, DBA_OBJECTS o
WHERE i.objd = o.object_id
group by object_name order by 1;
IMCU数
OBJECT_NAME
NUM_IMCU
-------------------- ---------CUSTOMER
3
DATE_DIM
1
LINEORDER
563
PART
3
SUPPLIER
1
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
49
IMCUの確認(2)
• V$IM_HEADER:
現在のインメモリ・カラム・ストア内のIMCUのリスト
col object_name for a20
col tsname for a15
SELECT OBJECT_NAME,ts.NAME TSNAME,ALLOCATED_LEN/1024/1024 ALLOC_MB,NUM_ROWS, NUM_COLS
FROM V$IM_HEADER i, DBA_OBJECTS o, v$tablespace ts
WHERE i.objd = o.object_id and i.tsn = ts.ts#
order by 1, 2;
OBJECT_NAME
-------------------CUSTOMER
CUSTOMER
CUSTOMER
DATE_DIM
PART
PART
PART
SUPPLIER
IMCUサイズ IMCU内行数
カラム数
TSNAME
ALLOC_MB
NUM_ROWS
NUM_COLS
--------------- ---------- ---------- ---------TS_DATA
39
495602
8
TS_DATA
33
415593
8
TS_DATA
47
588805
8
TS_DATA
1
2556
17
TS_DATA
1
14807
9
TS_DATA
14
591442
9
TS_DATA
14
593751
9
TS_DATA
8
100000
7
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
50
CU:カラム・ユニット (Column Unit)
• IMCUに格納されている各カラム値の
管理単位
• 全CUは自動的に最小/最大値を保存
– インメモリ・ストレージ索引
• 圧縮フォーマット
– 例)ディクショナリ圧縮
CUは実際の値ではなく、サイズの小さい
ディクショナリIDをデータ値として格納
→ 圧縮した状態で検索が可能
– 他の圧縮方式と組合わせることも可能
ディクショナリ
VALUE
Audi
BMW
Cadillac
ID
0
1
2
カラム値リスト
CU
Min: Audi
Max: Cadillac
BMW
2
Audi
0
BMW
2
Cadillac
1
BMW
2
Audi
0
Audi
0
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
51
CUの確認方法
• V$IM_COL_CU:
CUに関する情報の確認例
VARCHAR2型列:UTL_RAW.CAST_TO_VARCHAR2
DATE型列: DBMS_STATS.CONVERT_RAW_VALUE(プロシジャ)
col obj_name for a20
select
OBJECT_NAME, DICTIONARY_ENTRIES Dict_Entries,
UTL_RAW.CAST_TO_NUMBER(MINIMUM_VALUE) MIN_VALUE,
UTL_RAW.CAST_TO_NUMBER(MAXIMUM_VALUE) MAX_VALUE
from v$im_col_cu, dba_objects
where objd = object_id
and object_name = 'PART’ and owner = 'SSB'
表名とスキーマ名と
and column_number = 1
カラム番号の指定
order by 1;
値の種類数
最小値
最大値
OBJECT_NAME
DICT_ENTRIES MIN_VALUE MAX_VALUE
-------------------- ------------ ---------- ---------PART
14807
927875
942681
PART
591442
336433
927874
PART
593751
1
1200000
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
52
圧縮
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
53
6段階の圧縮
圧縮方式
特徴
NO MEMCOMPRESS
圧縮なし
MEMCOMPRESS FOR DML
カラムの値が全て同じ場合のみ圧縮
MEMCOMPRESS FOR QUERY LOW
デフォルト圧縮レベル(ディクショナリ圧縮)、最高のパフォーマンス
MEMCOMPRESS FOR QUERY HIGH
パフォーマンスに重点が置かれた圧縮とパフォーマンス間のバランスをとる
MEMCOMPRESS FOR CAPACITY LOW
容量に重点が置かれた圧縮とパフォーマンス間のバランスをとる
MEMCOMPRESS FOR CAPACITY HIGH
最大容量を対象。可能な場所では一般的な gzipなどに近い手法を適用
CREATE TABLE trades
(Name varchar(20),
Desc varchar(200))
INMEMORY MEMCOMPRESS FOR DML;
ALTER MATERIALIZED VIEWmv1
INMEMORY MEMCOMPRESS FOR QUERY;
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
54
圧縮動作
• IMCU毎、かつ、カラム毎に圧縮される
• 圧縮率は 2 – 20 倍 (1/2 から 1/20) 程度
– Exadata HCC と比較すると圧縮率は低い。
• パーティション毎に圧縮率を変えることができる
– 6 段階のレベル
• "FOR DML" , “NO MEMCOMPRESS"
DML頻度が多いパーティションや表に設定
• “FOR QUERY” (Low/High)
多くの表/partitionに最適(デフォルト)
• "FOR CAPACITY" (Low/High)
アクセスの少ない表。クエリーは上記より低速に
– ILM(Information Lifecycle Management)ポリシーに合わせて検討
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
55
圧縮アドバイザーとインメモリ
• 内部的に
サンプルデータに対し圧縮を試行
• 6段階の圧縮レベル対応 COMP_INMEMORY_NOCOMPRESS
COMP_INMEMORY_DML
COMP_INMEMORY_QUERY_LOW
COMP_INMEMORY_QUERY_HIGH
COMP_INMEMORY_CAPACITY_LOW
COMP_INMEMORY_CAPACITY_HIGH
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
56
プライオリティー
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
57
ポピュレーションの優先度(プライオリティー)
5段階のプライオリティー
• NONE
– 該当テーブルへのアクセス時にポピュレーション
がトリガーされる
• LOW、MEDIUM、HIGH、CRITICAL
CREATE TABLE orders
(c1 number,
c2 varchar(20),
c3 number)
INMEMORY PRIORITY CRITICAL
NO INMEMORY (c1);
– CREATE/ALTER TABLE 時にポピュレートタスクが
キューイングされる
– プライオリティー別のキューが4本存在
– Database起動時も同じようにキューイング
• ポピュレーション完了後にDatabaseをオープンするモードはない
• ポピュレーション の速度には影響しない
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
58
ポピュレーションの優先度(プライオリティー)
5段階のプライオリティー
優先レベル
説明
CRITICAL
オブジェクトは、データベースのオープン直後に移入されます
HIGH
オブジェクトは、すべてのCRITICALオブジェクトの移入後にインメモリ・カラム・ストアに使用可能な領域が残ってい
る場合、移入されます
MEDIUM
オブジェクトは、すべてのCRITICALオブジェクトとHIGHオブジェクトの移入後にインメモリ・カラム・ストアに使用可能
な領域が残っている場合、移入されます
LOW
オブジェクトは、すべてのCRITICALオブジェクト、HIGHオブジェクト、およびMEDIUMオブジェクトの移入後にインメモ
リ・カラム・ストアに使用可能な領域が残っている場合、移入されます
NONE
オブジェクトは、初回スキャン後にインメモリ・カラム・ストアに使用可能な領域がある場合のみ移入されます(デ
フォルト)
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
59
Pollingによるポピュレーション
プライオリティ: LOW / MIDDLE / HIGH / CRITICAL
• タスク・キューが2分間隔でpollされる
• システム統計では"CPU: IM Prepopulate“
と表現される
Critical
High
– 注意点: ポピュレートされていないプライオリティ
がCRITICALに設定されている表があり、インメモ
リ・カラム・ストアに空きがない場合でも、ポピュ
レート済みのプライオリティがLOWの表を落とす
動作は起こらない
Middle
Low
IMCO
Wnnn
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
ポピュレーション
タスク
60
オン・デマンドのポピュレーション
• プライオリティ:NONE
• プロシージャによる明示的なポピュ
レーション
• 該当テーブルにFULL SCANされると
– dbms_inmemory パッケージ
きにポピュレーションされる
– SELECT文によるクエリーが索引のみで
結果が返される場合、ポピュレーショ
ンはトリガーされない
• FULLヒントを付けることで明示的にポピュ
レーションを発生させられる
• SELECT /*+ FULL(表名) */
– システム統計では"CPU: IM Populate"
と表現される
– INMEMORY 属性がない表ではエラー
になる
SQL> alter table COMPTEST.TAB1 inmemory;
Table altered.
SQL> exec dbms_inmemory.populate('COMPTEST','TAB1');
PL/SQL procedure successfully completed.
SQL> alter table COMPTEST.TAB1 no inmemory;
Table altered.
SQL> exec dbms_inmemory.populate('COMPTEST','TAB1');
BEGIN dbms_inmemory.populate('COMPTEST','TAB1'); END;
*
ERROR at line 1:
ORA-03211: The segment does not exist or is not in a valid state
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
61
DML 実行時の動作 (Update / Delete)
• 従来通り、バッファ・
キャッシュ(行型)で、
データ・ブロックを更新
バッファ・キャッシュ
• トランザクションの一時的
な更新情報を Transaction
Journal に記録
• Commit 時、IMCU 内の
該当行に対する
Invalidateと Transaction
Journal の
解放を実施
update tab1 set c2=3 where c1=***;
C1
C2
C3
インメモリ・カラム・ストア
IMCU
C1 C2
Transaction
Journal
C3
行の更新情報
Commit;
3
Invalid
従来の更新操作に加え、IMCU内の行 の Invalidation を実施
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
62
DML実行時の動作-Insert(動作イメージ)
• 従来通りバッファ・キャッシュ
(行型)/ディスク上で行を挿入
• トランザクションに関する
一時的な情報を
トランザクション・ジャーナル
に記録
• 新規に挿入された行は
2分間隔の検知時もしくは
クエリー発行時に
ポピュレーションが行われる
バッファ・キャッシュ
インメモリ・カラム・ストア
①
Insert
C1
C2
IMCU
C1 C2
C3
Transaction
Journal
C3
メタデータ
③
⑤
②
Commit;
④
新規INSERT分はIMCOの監視タイミング/クエリー発行時に ポピュレーション
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
63
IMCUの再ポピュレーション
• 特定のタイミングで、無効な行を含むIMCUを
再作成 (再ポピュレーション)
• 更新処理とは非同期で実施
• 以下のタイミングで自動的に実施
– 多数の行が更新された時(再ポピュレーション)
– 2分間隔(トリクル再ポピュレーション)
• 手動実行も可能
– DBMS_INMEMORY.REPOPULATEプロシージャ
• 表単位ではなくIMCU単位で再作成
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
64
Oracle Database In-Memory技術ポイントのまとめ
インメモリ導入の容易性
技術要素
インメモリ導入事前調査
インメモリ・カラム・ストア
設定の基本3ステップ
1.
2.
3.
使用するメモリ容量を設定
inmemory_size = XXX GB
メモリー上に格納するテーブル、
パーティションを選択
alter table | partition … inmemory;
ポピュレーション
カラム型フォーマット
圧縮・プライオリティー
インデックスを削除
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
65
Program Agenda
1
開発の背景と概要
2
技術ポイント
3
他社インメモリDBとの違い
4
利用用途例
5
まとめ
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
66
OLTPと分析処理をリアルタイムに融合可能な“唯一の”仕組み
インメモリ・デュアル・フォーマット:高度な仕組み、かつシンプルな設計・運用管理
一般的なインメモリの仕組み
Oracle Database In-Memory
 ロー(行)型とカラム型の”どちらか一方を“選択
ロー(行)型とカラム型を”両方同時に”実現
処理内容に応じ、
ロー型・カラム型の
適切なメモリを自動的に選択
処理内容をユーザが
意識しアクセスする
必要あり
VS
同期
インデックスは不要
ローとカラムは
メモリ上では別管理
ローとカラムは
自動で同期
顧客テーブル
売上テーブル
データフォーマットは
1種類
データフォーマット
2種類を管理が必要
顧客テーブル 売上テーブル
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
67
コスト効率性の高いメモリ上へのデータ配置
コスト効率と性能を柔軟にバランス(スモールスタートが可能)
一般的なインメモリの仕組み
Oracle Database In-Memory
高速化したいデータのみをメモリ上に展開
頻繁に分析するデータのみを
メモリ上に格納可能
 基本的に全てのデータをメモリ上に展開
VS
全てのデータがメモリ
上にある前提で処理
頻繁にアクセスするデータは
それほど多くない
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
68
Program Agenda
1
開発の背景と概要
2
技術ポイント
3
他社インメモリDBとの違い
4
利用用途例
5
まとめ
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
69
Database In-Memoryの利用効果の大きい処理
少数列に対する大量行の処理に効果大
1. 処理特性
ディスクI/Oの物理読込(Physical Reads)量が大きいもの
大量データの全表走査(Full Table Scan)
大量データの索引走査(Index Range Scan/Bitmap Index Scan)
2. SQLの特徴
大量行の表を含む分析クエリ
複数表を利用した結合処理とフィルタ条件(WHERE xxx = :abc)
集計演算処理(特に MAX, MIN, COUNT)
中間一致検索(ユニーク値の列は除く)
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
70
Database In-Memoryの利用効果の大きい処理
ディスクI/Oの物理読込(Physical Reads)量が大きいSQLとは?
インメモリ化によるパフォーマンス改善が
期待できる処理
全表走査
Full Table Scan
索引走査
Index Range Scan
db file scattered read
db file sequential read
SQL Monitorによる確認例
SQLの処理で多くのディスク・アクセスが発生している
(User I/O: db file scattered read)
ディスクアクセス量大
このようなSQLであればインメモリ化による
パフォーマンス改善の効果を期待できる
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
71
Database In-Memoryの利用効果の大きい処理
大量行の表を含む結合処理、集計処理でディスクアクセスがある場合と比較
select sum(lo_quantity) from lineorder, customer
LINEORDER: 3億件
CUSTOMER: 150万件
where lo_custkey = c_custkey and c_nation in ( 'JAPAN', 'CHINA' ) ;
Elapsed Time
ディスクアクセスあり
バッファキャッシュ(索引)
ディスクアクセスあり
バッファキャッシュ(表)
108倍(表)、 64倍(索引)高速
インメモリ
0
20
40
60
80
単位(秒)
100
16並列で実行
120
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
72
Database In-Memoryの利用効果の大きい処理
大量行の表を含む結合処理、集計処理でディスクアクセスがある場合と比較
select max(lo_quantity) from lineorder
LINEORDER: 3億件
where lo_orderkey between 1 and 50000000 ;
Elapsed Time
ディスクアクセスあり
バッファキャッシュ(表)
360倍高速
インメモリ
5並列で実行
0
20
40
単位(秒)
60
80
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
73
Database In-Memoryの利用効果の大きい処理
大量行の表に対する中間一致検索でディスクアクセスあり
select sum(lo_quantity) from lineorder, customer
where lo_custkey = c_custkey and c_region like '%RICA%' ;
LINEORDER: 3億件
CUSTOMER: 150万件
Elapsed Time
バッファキャッシュ(表)
ディスクアクセスあり
74倍高速
インメモリ
0
50
16並列で実行
100
150
単位(秒)
200
250
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
74
Q)大きなサイズのバッファ・キャッシュを
確保して、全データをキャッシュ内に
保持して実行すればインメモリ検索と
変わらないのか?
→ No
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
75
検証1)フル・キャッシュ(行) vs インメモリ(列)
全表スキャン vs 索引スキャン vs インメモリ・スキャン
バッファ・キャッシュに表の全データがキャッシュされている場合とインメモリ検索の場合のパフォーマンスの違いを計測
実行SQL select sum(lo_quantity) from lineorder
3億行から5,000万行を
抽出する
where lo_orderkey between 1 and 50000000 ;
SGA
インメモリ・カラム・ストア(列)
SGA
バッファ・キャッシュ(行)
索引
テーブル
+
全テーブル+索引をキャッシュ
vs
ポピュレート
データ読込み&Pin
LINEORDER
3億行
LINEORDER
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
76
検証1)フル・キャッシュ(行) vs インメモリ(列)
3億行の表から5,000万行を抽出するSQL
読込メモリブロック数(consistent gets)
インメモリは圧倒的にメモリ
読込量が少ない
Database InMemory
表(フルキャッシュ)
索引(フルキャッシュ)
224
2,285,176
497,832
索引はシングル・ブロック
読込なので大量行アクセス
には非効率
Elapsed Time
ディスクアクセスなし
フルバッファキャッシュ(索引)
ディスクアクセスなし
フルバッファキャッシュ(表)
5並列で実行
31倍(表)、 44倍(索引)高速
インメモリ
0
2
4
単位(秒)
6
8
10
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
12
77
Q)インメモリ化すると全ての検索処理を
高速化出来るのか?
→ No
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
78
Database In-Memoryの利用効果が大きくない処理
1. 索引により最適化されている
(大きな表から少ない行データを検索する)
数億/数千万行の表から 1~数百行取得するような検索
ハードウェア・リソースの観点からインメモリ検索の
並列度を高く設定出来ない
2. 集計値を別の仕組みで保持している
マテリアライズド・ビューにより集計値を保持
同一内の別カラム、また別表に集計値を保持
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
79
少ない検索結果件数による比較
索引 vs インメモリ
• 6億行の表から530行を検索するSQL (シリアル実行)
select lo_quantity from lineorder where lo_custkey = 1499999 ;
Elapsed Time
索引
0.04秒
インメモリ
0.13秒
→ 表の格納行数が多く、検索結果件数が少ないほど
索引が若干速くなるケースが多い
→ SQLヒントを指定しないと索引アクセス処理になる
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
80
1. 情報系への適用(DWH、データマート、特定用途分析)
DWHシステムの分析クエリの高速化、 ETL処理の高速化
①
OLTPシステム
処理タイプにより両方定義
カラム型表による
分析クエリの高速化
データウェアハウス(DWH)
OLTP
OLTP
データベース
OLTP
データベース
データベース
カラム型表による
ETL処理の高速化
(大量の集計演算)
②
カラム型表中心に設計
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
81
2. OLTP系システムの高速化
OLTPシステムの分析、レポート処理の高速化
オンライン処理
行型でOLTP
・
・
・
バッチ/分析処理
索引削除で高速化
カラム型で分析処理
バッチ処理:集計レポート
• 日次/週次/月次レポート
• 会計期末レポート
• 原価計算処理
OLTP
データベース
カラム型で分析処理
ビジネス分析
• 販売管理ダッシュボード
• サービス・ダッシュボード
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
82
3. リアルタイムデータ活用
OLTPシステムで発生したデータをリアルタイムに活用
オンライン処理
カラム型で
データ活用
行型でOLTP
・
・
・
リアルタイムデータ活用
索引削除で高速化
同期
OLTP&
データ活用
データベース
リアルタイム分析
• 新商品の初動確認
• 日配品の値下げタイミングの
把握
• マシン稼働状況の把握
リアルタイムデータ活用
• 重点商品の自動発注
• リアルタイム・プロモーション
• マシン予防保全
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
83
4. RACを利用したOLTP-バッチ・分析処理の分離
バッチ専用ノードをインメモリ化
バッチ処理
分析
OLTP
インスタンス1
OLTP処理専用(非インメモリ)
バッファ
キャッシュ
インメモリ・
カラム・ストア
INMEMORY_SIZE
=0
インスタンス2
バッチ・分析処理専用(インメモリ)
バッファ
キャッシュ
インメモリ・
カラム・ストア
INMEMORY_SIZE
= 100GB
→ Exadata推奨
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
84
Program Agenda
1
開発の背景と概要
2
技術ポイント
3
他社インメモリDBとの違い
4
利用用途例
5
まとめ
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
85
高速にアクセス出来る理由
インメモリ・スキャンの高速フィルタリング
1. 必要なカラムのみアクセス
全表走査
2. 効果的な圧縮技術により
圧縮した状態で検索が可能
(ディクショナリ圧縮)
Table Access Inmemory Full
フィルタリング
CPU
複数の
データを
ロード
Min 8
Max 12
Min 4
Max 7
Min 13
Max 15
ベクター・レジスタ
データ読込み
(インメモリ・スキャン)
Min 1
Max 3
3. インメモリ・ストレージ索引により
最小限のIMCUのみスキャン
CA
CA 一度の命令で
CA 全ての値を
ベクター演算
CA
4. 最新のプロセッサで搭載されて
いるSIMDにより高速スキャン
(ベクター・スキャン)
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
86
Oracle Database In-Memory Option による影響
想定される既存システムへの影響と変化
想定される変化
意思決定の精度向上
今現在の大量データを用いたリアルタイム
分析によるビジネスの俊敏性と正確性向上
システム・アーキテクチャのシンプル化
多様なワークロードを1つのDatabaseで処理
開発生産性・運用管理性の更なる向上
集約率の更なる向上によるTCO削減
変化しない事
 既存膨大なアプリケーション資産
次世代 インメモリ・アーキテクチャ
インメモリ処理が
アーキテクチャの中心へ
インメモリ・
ミドルウェア
インメモリ・
データベース
超高速
トランザクション
処理
高速
トランザクション
処理
集計・
分析処理
 アプリを書き変える事なく移行が可能
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
87
Oracle Database In-Memory
リアルタイム・エンタープライズの促進
DATADRIVEN
AGILE





究極の高速化: 分析とOLTP
容易な導入手法
究極のスケールアウトとアップ
究極の可用性
完全なるセキュリティ
EFFICIENT
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
88
Appendix
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
90
オブジェクト毎のインメモリ定義の確認
• USER_TABLES: オブジェクト毎のインメモリ定義
column
column
column
column
table_name format a20
PRIORITY format a15
DISTRIBUTE format a15
COMPRESSION format a20
Select table_name,
inmemory_priority priority,
inmemory_distribute distribute,
inmemory_compression compression
From user_tables;
ポピュレート優先度
ノード間分散方式
TABLE_NAME
PRIORITY
DISTRIBUTE
-------------------- --------------- --------------LINEORDER
CRITICAL
AUTO
PART
NONE
AUTO
CUSTOMER
NONE
AUTO
SUPPLIER
NONE
AUTO
DATE_DIM
NONE
AUTO
圧縮モード
COMPRESSION
-------------------FOR QUERY LOW
FOR QUERY LOW
FOR QUERY LOW
FOR QUERY LOW
FOR QUERY LOW
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
91
オブジェクト毎のポピュレーションの状態確認
• V$IM_SEGMENTS: オブジェクト毎のポピュレーションの状態
column
column
column
column
name format a20
owner format a10
status format a15
No_Pop_Bytes format 999,999,999,999
ポピュレート未完了の
オブジェクト
SELECT v.owner, v.segment_name name, v.populate_status status,
inmemory_size/1024/1024 IM_MB, v.bytes_not_populated No_Pop_Bytes
FROM
v$im_segments v;
インメモリ内サイズ
未完了のバイト数
OWNER
NAME
STATUS
IM_MB
NO_POP_BYTES
---------- -------------------- --------------- ---------- ---------------SSB
SUPPLIER
COMPLETED
16.125
0
SSB
LINEORDER
STARTED
23975.75
15,753,846,784
SSB
CUSTOMER
COMPLETED
240.4375
0
SSB
DATE_DIM
COMPLETED
1.125
0
SSB
PART
COMPLETED
34.25
0
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
92
オブジェクト毎のインメモリ内のサイズと圧縮率の確認
• V$IM_SEGMENTS: オブジェクト毎のインメモリサイズと圧縮率
column name format a20
Select v.segment_name
name,
v.bytes/1024/1024
orig_MB,
v.inmemory_size/1024/1024 in_mem_MB,
v.bytes/v.inmemory_size
comp_ratio
From
v$im_segments v
where v.owner = 'SSB'
Order by 4;
元サイズ インメモリサイズ
圧縮率
NAME
ORIG_MB IN_MEM_MB COMP_RATIO
-------------------- ---------- ---------- ---------CUSTOMER
256
240.4375 1.06472576
PART
128
34.25 3.73722628
SUPPLIER
64
16.125 3.96899225
DATE_DIM
64
1.125 56.8888889
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
93
Database In-Memoryのチューニング
1. 基本的にほとんどチューニング項目はない
–
ポピュレート完了の状態、パフォーマンス統計などの確認等
2. パラレル度の指定とパーティションの活用方法
–
–
CPUのネックにならないように検索のパラレル度を調整する
表サイズが大きい場合はパーティションを効果的に利用し
インメモリスキャンのスキャンサイズを小さくする
3. Attribute Clusterも限定的に利用検討する
–
検索条件頻度の高いカラムには「Attribute Cluster」の機能の適用を検討する
•
–
インメモリ・ストレージ索引の効果を高める可能性大
Attribute Clusterの仕様を理解したうえで利用する
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
94
Database In-Memoryでもパーティション表は効果的
リストパーティション( SALES表)
P1: ORDER_STATUS=‘OPEN’
P2: ORDER_STATUS=‘CLOSED’
In-Memory
IMCU
パーティション単位に
最適なSQL実行計画を
選択可能
IMCU
ローカル索引
IMCU
P1: インメモリスキャンが最適
→ 最適なパフォーマンス
P2: 索引スキャンが最適
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
95
実行したインメモリ検索の速度が妥当か?
物理I/Oアクセスがないかをチェック
• 対応が必要なもの
– ポピュレートが未完了
– PGA領域不足(大量ソート、結合) ※通常のデータベース・チューニング
– Oracle RAC構成の場合でインターノード・パラレルクエリ
• パラレル度ポリシーの設定(AutoDOP): PARALLEL_DEGREE_POLICY = AUTO
• 対応が特に不要なもの
– ハード・パースによるアクセス(2回目以降なくなる)
– Adaptive Plan、Dynamic Samplingによるアクセス(2,3回目以降なくなる)
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
96
ポピュレートが未完了
オブジェクトのポピュレートがまだ完了していない場合
POPULATE_STATUSが
「STARTED」で、
BYTES_NOT_POPULATED列に
値が表示される場合は未完了
SQL> select segment_name, populate_status, inmemory_priority, inmemory_size, bytes_not_populated from
v$im_segments;
SEGMENT_NAME POPULATE_STATUS INMEMORY_PRIORITY INMEMORY_SIZE
BYTES_NOT_POPULATED
------------ --------------- ----------------- ------------- ------------------ACCOUNTS STARTED
HIGH
196606
2434886912
SALES
COMPLETED
CRITICAL
135790592 0
SQL> select pool, alloc_bytes, used_bytes, populate_status from v$inmemory_area;
POOL
ALLOC_BYTES USED_BYTES POPULATE_STATUS
---------------- ----------- ---------- ---------------1MB POOL
8186232832 8186232832 OUT OF MEMORY
64KB POOL
2063597568 26345472 DONE
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
インメモリ・カラム・ストアの
領域不足の場合に
「OUT OF MEMORY」が
表示される
97
PGA領域が不足している(大量ソート、結合など)
SQL Monitorより
待機イベント・サマリで
TEMP領域の書込発生
結合とソート処理で
ディスクI/Oあり
インメモリ・スキャンはCPUのみ
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
98
Copyright © 2015 Oracle and/or its affiliates. All rights reserved. |
99
Fly UP