Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Oracle Database 23c Database In-Memory 関連新機能

Oracle Database 23c Database In-Memory 関連新機能

2023年12月21日実施
Oracle Database Technology Night #74 Oracle Database 23c 新機能#3 資料
セッションアーカイブ動画:https://youtu.be/lqjjWwlajRc

oracle4engineer

January 14, 2024
Tweet

More Decks by oracle4engineer

Other Decks in Education

Transcript

  1. Oracle Database 23c Database In-Memory 新機能 Oracle Database Technology Night

    #74 津島 浩樹 ⽇本オラクル株式会社 2023年12⽉21⽇
  2. Copyright © 2023, Oracle and/or its affiliates Agenda 2 1.

    Database In-Memory とは 2. インメモリ・ディープ・ベクトル化の機能拡張 3. ⾃動インメモリの機能拡張 4. 新しいインメモリ・アドバイザ 5. Database In-Memory その他の機能拡張 6. Fast Ingest (Memoptimize for Write) の機能拡張
  3. Copyright © 2023, Oracle and/or its affiliates 3 Database In-Memory(DBIM)

    とは • DBIMのメリット • 技術概要 • 主な特徴(代表的な機能)
  4. DBIMのメリット レポート・パフォーマンスの向上 • レポートの⾼速化 - アプリケーションの変更が不要 • スキャンおよびフィルタリングの⾼速化 リアルタイム分析 •

    運⽤データをリアルタイム分析に活⽤ • デュアル・フォーマット オーバーヘッドの削減 • 分析の⾼速化 - ストレージ・オーバーヘッドの削減 • 分析索引を削除することによるスペースの節約とDMLの競合の減少 Copyright © 2023, Oracle and/or its affiliates 4
  5. 技術概要 列型フォーマット 純粋なインメモリ列フォーマット • ストレージ上に永続化されない(Undo/Redoが不要) • DML操作については従来同様に、⾏ストアで処理される • ディスク・フォーマットの変更なし (インメモリ領域に格納するときに列型

    に変更する) すべての機能 (セキュリティ、可⽤性) が透過的に機能する データベース全体をインメモリにする必要がない • 表領域、テーブル、パーティションのレベルで有効にできる • 必要ない列の除外も可能 In-Memory Compression Unit (IMCU) • インメモリ列ストアの割り当て単位 • 1 つ以上の表エクステント上の多数の⾏ (例えば50万⾏) にまたがる • 各列は Column Compression Unit (column CU) として格納される • ディスク上の⾏は、ROWID CUを介してIMCUにマッピングされる 複数のMEMCOMPRESSレベル • FOR QUERY LOW/HIGH (クエリ性能重視) • FOR CAPACITY LOW/HIGH (圧縮率重視) • FOR DML (ある程度のデータ更新) 6 Copyright © 2023, Oracle and/or its affiliates In-Memory Compression Unit Extent #13 Blocks 20-120 Extent #14 Blocks 82-182 Extent #15 Blocks 201-301 ROWID EMPID NAME DEPT SALARY Column Compression Unit NAME
  6. 技術概要 データをより効率的にスキャンおよびフィルタリング 7 Copyright © 2023, Oracle and/or its affiliates

    圧縮 圧縮形式でのデータの スキャンとフィルタ (ディク ショナリ圧縮) 12.2から結合グループを 導⼊ ストレージ索引 列から不要なデータを消去 (各列のColumn CUにMin/Maxが 記録され、不要なIMCUを排除) SIMDベクター処理 単⼀のCPU命令で複数の列値を 処理 (スキャンとブルーム・フィルタ) 必要な列のみにアクセス (クエリに含まれる全ての列 のインメモリ化が必要) 21cからインメモリ・ハイブ リッド・スキャンを導⼊ 列形式 NAME ID AUDI 0 BMW 1 CADILLAC 2 PORSCHE 3 TESLA 4 VW 5 共通ディクショナリ where NAME=‘BMW’ where NAME=1 where Store_id=8
  7. 技術概要 オプティマイザの機能拡張 (分析クエリのあらゆる側⾯を改善) 8 Copyright © 2023, Oracle and/or its

    affiliates • SIMDベクトル化を使⽤した秒間 数⼗億⾏のスキャン スキャン 集計 • メモリに最適化されたアルゴリズムによ り、集計や結合を10倍⾼速に実⾏ • レポート・アウトライン (インメモリ多次 元配列)を作成し、ファクト表のスキャ ン中に集計 (多次元キューブを使わず に⾼速化) 結合 •インメモリ列データ形式を活⽤し、 低速な結合を10倍⾼速なフィル タリング列スキャンに変換 (IMブ ルーム・フィルター) HASH JOIN ITEMS SALES
  8. 1. インメモリ⽤のメモリ容量を設定 (最⼩値は100Mバイト) 2. インメモリに含まれる表またはパーティションを設定 3. 分析のための索引を削除してOLTP処理を⾼速化可能 設定の基本3ステップ インメモリ導⼊の容易性 インメモリ導⼊事前調査

    (IMアドバイザ、圧縮アドバイザ) inmemory_size = XXX GB alter table | partition … inmemory; 技術概要 導⼊が容易 SGA内の新たな領域としてインメモリ領域を追加 静的プールとして確保 (サイズ変更に再起動が必要) • SGA_TARGETはIM領域を収容するのに⼗分な⼤きさが必要 • データベース実⾏中にサイズを⼤きく変更可能 (12.2から) 9 Copyright © 2023, Oracle and/or its affiliates システム・グローバル領域(SGA) バッファ キャッシュ 共有プール ログバッファ ラージ プール その他 インメモリ 列ストア
  9. 技術概要 Database In-Memory はどこで利⽤できるのか Database In-Memory は Oracle Database Enterprise

    Edition のオプションです Database In-Memoryは、12.1 (12.1.0.2) と それ以降のすべてのOracle Databaseリリースに含まれています 利⽤可能︓ • Database Cloud Service – Virtual Machines: Extreme Performance • Database Cloud Service – Bare Metal: Extreme Performance • Exadata Cloud Service • Exadata Cloud at Customer • Autonomous Data Warehouse (Flash only) • On-premises • Oracle Database XE Copyright © 2023, Oracle and/or its affiliates Note: Database In-Memoryは デフォルトでは有効になって いません 10
  10. Copyright © 2023, Oracle and/or its affiliates 11 Database In-Memory(DBIM)

    とは • 主な特徴(代表的な機能) • ミックス・ワークロード • ベクトル分析 • ⾃動インメモリ • インメモリ+Exadata • コンバージド分析
  11. ミックス・ワークロード Copyright © 2023, Oracle and/or its affiliates 12 デュアル・フォーマット・アーキテクチャーにより、⾼速なミックス・ワークロードと⾼

    速な分析を実現 無効な⾏は列ストアから論理的に削除されるため (ビットをセットするだけ) イン メモリDMLは⾼速 (ジャーナルにROWIDが格納される) 分析クエリは列ストアの無効な⾏を無視し、有効な⾏だけをベクター処理する そして、無効な⾏は⾏ストアで処理される IMCUに無効な⾏が蓄積されると、ミックス・ワークロードのパフォーマンスが低下 する可能性がある • ダーティなIMCUをバックグラウンドでリフレッシュする追加テクニック • 多数の⾏が更新された時の再ポピュレート • 2分間隔のトリクル再ポピュレーション Memory Memory SALES SALES Row Format Column Format SALES X .… X X
  12. ミックス・ワークロード ⾼速なバックグラウンドの再ポピュレーション IMCUの汚れ具合、スキャン頻度から、リフレッシュ (再ポピュレーション) のタイミングを追跡する • ダブル・バッファリング (古いIMCUは、新しいIMCUが構築されるまでオンラインに留まり、新しいIMCUの準備が整うとスイッチする) • 増分再ポピュレーション

    (古いIMCUに存在するメタデータを使⽤して新しいIMCUに列を構築し、迅速なフォーマットを可能にする) • 列レベルの無効化 (IMスキャンを可能にするために追跡される列レベルの無効化) Copyright © 2023, Oracle and/or its affiliates インメモリ領域 オリジナルIMCU IMCU IMCU JOURNAL ROW_ID:123765490 ROW_ID:123800000 ROW_ID:257643100 ROW_ID:257643100 ROW_ID:257643100 オリジナルIMCUをSCN時点で古い バージョンとしてマークする 1 オリジナルSMU 新バージョンIMCU オリジナルのクリーンな⾏と、変更された⾏ の最新バージョンを組み合わせて、新しい バージョンのIMCUを作成する 2 IMCU IMCU JOURNAL 新しいSMU IMCU作成中に発⽣したDML 操作をジャーナルで追跡する 3 13
  13. インメモリ・ベクター結合(21cから) ベクトル分析 Copyright © 2023, Oracle and/or its affiliates 14

    ディープ・ベクトル化レームワークにより、幅広いSQLクエ リ演算⼦のSIMDベクトル化が可能になる インメモリ・ベクター結合は、このフレームワークを使って 複雑な結合を⾼速化する 1つのSIMDベクター命令で、SALESテーブルとITEMS テーブル間の複数⾏を⼀致させる 最⼤10倍⾼速なインメモリ結合処理 例: SalesとItemsの結合 SALES ITEMS Vector Register Vector Register
  14. ベクトル分析 Copyright © 2023, Oracle and/or its affiliates 15 ホットな式は、追加のカラムとしてメモリに保存できる

    すべてのインメモリ最適化が式列に適⽤される (ベクター 処理、ストレージ索引など) 2つのモード: • マニュアル: 必要なインメモリ式のために仮想列を宣⾔する • ⾃動: 頻度の⾼い式を⾃動検出 複雑なクエリを3〜5倍⾼速化 Net = Price + Price * Tax 例: 総販売価格の計算 Price Tax Price + Price *Tax インメモリ式(12.2から)
  15. ⾃動インメモリ Copyright © 2023, Oracle and/or its affiliates 16 ⾃動インメモリが強化され、インメモリ列ストアを⾃⼰管理で

    きるようになった 機械学習アルゴリズムが、ユーザー⼊⼒なしでテーブルのポピュ レートと削除を⾏う テーブルのINMEMORY宣⾔は不要 (21cから) アクセス頻度の低いインメモリ列も⾃動圧縮する (21cから) ⾃⼰管理型インメモリ列ストア(18cから)
  16. Exadataフラッシュ上のインメモリ Copyright © 2023, Oracle and/or its affiliates 17 DBIMを使⽤してデータをセル・メモリとしてキャッシュすると、Smart

    Scan はさ らに2〜5倍⾼速化される • DBコンピュート・サーバ上のインメモリ列データ形式が、セル・メモリとしてストレージ・ サーバの Smart Flash Cache に拡張される • IM列型フォーマットに⾃動的に変換する (CELLMEMORY句はデフォルト有効) • ストレージ・サーバーのデータも同様にインメモリ最適化される (クエリでディクショナリ 圧縮検索やSIMDベクター処理を可能にする) DRAMに収まらない⼤規模表に最適なインメモリ列容量の⼤幅な増加 (フ ル・ラックで〜1PB) • 階層間 (DRAM、フラッシュ、ディスク) のシームレスなストレージ階層化とクエリ処理 ユーザーの介⼊なしに、全ての表タイプに透過的に適⽤される • DBコンピュート・サーバーのDRAMに列ストアを割当てる必要がない (21cから) • inmemory_force = CELLMEMORY_LEVEL その他のExadataだけのインメモリの利点 • ⾼可⽤性とパフォーマンスを実現するインメモリ・デュプリケーション (DUPLICATE句) • インメモリ Active Data Guard による列容量のスケールアウト In-Memory Columnar scans In-Flash Columnar scans Storage Servers Compute Servers リアルタイム 分析 ⾮リアルタイム 分析 Exadataフレッシュのインメモリ形式(12.2から)
  17. Spatial, Text, JSON のインメモリ分析 コンバージド・ワークロード Copyright © 2023, Oracle and/or

    its affiliates 18 In-Memory (IM) Table Columns Spatial Column Spatial Summary In-Memory (IM) Table Columns Text Index Resume (Text) Words .. database .. … 3. IM列ストアに最適化された バイナリ表現でJSONを 保存する (12.2から) { "Theater":"AMC 15", "Movie":”Rogue One", "Time“:2017-01-09 18:45", "Tickets":{ "Adults":2 } } 00101001… 1. SpatialサマリーをIM列ストア に保存してフィルタリングを⾼速 化 (21cから) 2. 最適化されたText索引構造を IM列ストアに保存し、⾼速検索 を実現 (21cから)
  18. Copyright © 2023, Oracle and/or its affiliates 19 Oracle Database

    23c 新機能 • インメモリ・ディープ・ベクトル化の機能拡張 • ⾃動インメモリの機能拡張 • 新しいインメモリ・アドバイザ • Database In-Memory その他の機能拡張 • Fast Ingest (Memoptimize for Write) の機能拡張
  19. インメモリ・ベクター結合の強化 機能概要 • インメモリ・ディープ・ベクトル化 (SIMDベースのフレームワーク) を使⽤したインメモリ・ベクター結合に、以下のサ ポートが強化された (これまでは単⼀レベル結合、内部結合のみのサポート) • マルチレベル・ハッシュ結合

    (Right Deep Joinもサポート) • 完全なGroup By集計 • マルチ結合キー (複数の結合キー列) • 追加の結合メソッド (セミ結合、外部結合) メリット • この機能により、分析クエリの基盤である結合と集計のパフォーマンスが向上 • アプリケーションSQLを変更することなく、より⾼速なリアルタイム分析の実⾏が 可能になる インメモリ・ディープ・ベクトル化の機能拡張 Copyright © 2023, Oracle and/or its affiliates 21
  20. • ハッシュ結合を順番に実施 (今までの実⾏計画) • 複数のジョイン・フィルタを利⽤してファクト表の⾼速カ ラム検索 インメモリ・ディープ・ベクトル化の機能拡張 22 ハッシュ・ テーブル

    作成 ハッシュ・ テーブル 作成 Left-deep tree PART HASH JOIN LINEORDER HASH JOIN SUPPLIER HASH JOIN DATEDIM 1 2 3 4 1 2 3 Right-deep tree PART HASH JOIN LINEORDER HASH JOIN SUPPLIER HASH JOIN DATEDIM 2 3 1 2 3 ジョイン フィルタ 作成 ジョイン フィルタ 作成 1 ジョイン フィルタ 作成 4 何故この機能が重要か? LINEORDERをマルチプル フィルタを利用して初期 スキャをすることにより 上位の実行計画で処理する 行数を縮小する 複数のジョインフィル タによるLINEORDER表 (ファクト表)の高速列 型検索 ハッシュ・ テーブル 作成 ハッシュ・ テーブル作成 ハッシュ・ テーブル作成 ハッシュ・ テーブル作成 補⾜︓Right-deep Join Copyright © 2023, Oracle and/or its affiliates
  21. インメモリ・ベクター結合(21c) インメモリ・ディープ・ベクトル化の機能拡張 Copyright © 2023, Oracle and/or its affiliates 23

    機能概要 • インメモリ・ベクター結合は、新しいインメモリ・ベクトル化フレームワーク を使⽤して、複雑な結合を⾼速化する • 初期化パラメータINMEMORY_DEEP_VECTORIZATIONをFALSEで 無効化できる (デフォルト有効) • ハッシュ結合とGroup By集計の最適化 • IMスキャン時に結合・集計処理を⾏う (IMスキャンにプッシュ・ダウンする) • パラレル実⾏はSmall Table Replicateのときのみ動作 • 結合グループを活⽤してパフォーマンスを向上させる • 1つのSIMDベクター命令でSALES表とITEMS表間の複数⾏を⼀致さ せる • IM動的スキャンを活⽤してパフォーマンスを向上 • ⾮IMハッシュ結合と⽐較してパフォーマンスを最⼤15倍向上させること ができる
  22. 利⽤イメージ • マルチレベル・ハッシュ結合 インメモリ・ディープ・ベクトル化の機能拡張 Copyright © 2023, Oracle and/or its

    affiliates 24 SQL> show parameter INMEMORY_DEEP_VECTORIZATION NAME TYPE VALUE ------------------------------------ ----------- --------------- inmemory_deep_vectorization boolean TRUE SQL> CREATE TABLE t1 2 (id NUMBER,col1 VARCHAR2(10),col2 VARCHAR2(10), col3 VARCHAR2(20)); … SQL> ALTER TABLE t1 INMEMORY; SQL> SELECT COUNT(*) from t1; SQL> CREATE TABLE t2 2 (id NUMBER,col1 VARCHAR2(10),col2 VARCHAR2(20)); … SQL> ALTER TABLE t2 INMEMORY; SQL> SELECT COUNT(*) FROM t2; SQL> CREATE TABLE t3 2 (id NUMBER,col1 VARCHAR2(10),col2 VARCHAR2(20)); … SQL> ALTER TABLE t3 INMEMORY; SQL> SELECT COUNT(*) FROM t3; SQL> select SEGMENT_NAME,SEGMENT_TYPE,INMEMORY_COMPRESSION 2 from v$im_segments; SEGMENT_NAME SEGMENT_TYPE INMEMORY_COMPRESS -------------------- ------------------ ----------------- T1 TABLE FOR QUERY LOW T2 TABLE FOR QUERY LOW T3 TABLE FOR QUERY LOW SQL> SELECT /*+ MONITOR */ COUNT(*) 2 FROM t1,t2,t3 WHERE t1.col1=t2.col1 AND t1.col2=t3.col1; … SQL> SELECT /*+ MONITOR PARALLEL(2) */ COUNT(*) 2 FROM t1,t2,t3 WHERE t1.col1=t2.col1 AND t1.col2=t3.col1; …
  23. 実⾏時に決定されるため実⾏計画では情報が得られない • SQL監視の「HASH JOIN」操作の双眼鏡アイコンをクリックして 「その他の情報」ウィンドウで調べる(結合グループと同じ調べ⽅) • DeepVec Hash Joinsの値が1の場合にIMベクター結合が使⽤されている •

    DeepVec Hash Join Flagsはディープ・ベクトル化でどのような最適化を⾏ったかを⽰す内部統計 マルチレベル・ハッシュ結合(確認はSQL監視のみ) インメモリ・ディープ・ベクトル化の機能拡張 Copyright © 2023, Oracle and/or its affiliates 25
  24. マルチレベル・ハッシュ結合(パラレル実⾏) インメモリ・ディープ・ベクトル化の機能拡張 Copyright © 2023, Oracle and/or its affiliates 26

    Small Table Replicateが動作している • スキャンと結合が同⼀プロセスでないと動作しない • DeepVec Hash Joinsの値がパラレル度になる ようだ Small Table Replicate 結合+ スキャン PX PX QC 表T1 表T3
  25. マルチ結合キー インメモリ・ディープ・ベクトル化の機能拡張 Copyright © 2023, Oracle and/or its affiliates 27

    SQL> CREATE TABLE t21 2 (id NUMBER,col1 VARCHAR2(10),col2 VARCHAR2(10), col3 VARCHAR2(20)); … SQL> ALTER TABLE t21 INMEMORY; SQL> SELECT COUNT(*) from t21; SQL> CREATE TABLE t22 2 (id NUMBER,col1 VARCHAR2(10),col2 VARCHAR2(10), col3 VARCHAR2(20)); … SQL> ALTER TABLE t22 INMEMORY; SQL> SELECT COUNT(*) FROM t22; SQL> select SEGMENT_NAME,SEGMENT_TYPE,INMEMORY_COMPRESSION 2 from v$im_segments; SEGMENT_NAME SEGMENT_TYPE INMEMORY_COMPRESS -------------------- ------------------ ----------------- T21 TABLE FOR QUERY LOW T22 TABLE FOR QUERY LOW SQL> SELECT /*+ MONITOR */ COUNT(*) FROM t21,t22 2 WHERE t21.col1=t22.col1 AND t21.col2=t22.col2 ; …
  26. セミ結合、外部結合 インメモリ・ディープ・ベクトル化の機能拡張 Copyright © 2023, Oracle and/or its affiliates 28

    SQL> CREATE TABLE t21 2 (id NUMBER,col1 VARCHAR2(10),col2 VARCHAR2(10), col3 VARCHAR2(20)); SQL> CREATE TABLE t22 ( ... ); SQL> SELECT /*+ monitor */ COUNT(*) FROM t21 2 WHERE exists 3 (SELECT 0 FROM t22 WHERE t21.col1=t22.col1); … SQL> SELECT /*+ monitor */ COUNT(*) 2 FROM t21 left outer join t22 on (t21.col1=t22.col1); …
  27. Group By集計 インメモリ・ディープ・ベクトル化の機能拡張 Copyright © 2023, Oracle and/or its affiliates

    29 SQL> SELECT /*+ monitor */ t2.col1,t3.col1, count(*) FROM t1, t2, t3 WHERE t1.col1=t2.col1 AND t1.col2=t3.col1 GROUP BY t2.col1,t3.col1;
  28. Copyright © 2023, Oracle and/or its affiliates 30 ⾃動インメモリの機能拡張 •

    ⾃動インメモリ・サイジング • インメモリ・パフォーマンス機能の⾃動有効化
  29. インメモリ列ストアの⾃動サイジング 機能概要 • 異なるワークロード・タイプが同時にリソースを共有することを考慮した、 IM列ストアの⾃動サイズ調整 • DMLを多⽤するワークロードが予測される場合は、IM列ストアを縮⼩し、 バッファ・キャッシュを増加させる • OLAPの集中的なワークロードが予測される場合は、バッファ・キャッシュを縮⼩し、

    IM列ストアを増加させる • V$INMEMORY_SIZE_ADVICEビューの統計情報から最適なIMサイズを決定する • INMEMORY_SIZEパラメータはIM列ストアの最⼩サイズを設定する • ⾃動インメモリ (AIM) との連携 (INMEMORY_AUTOMATIC_LEVEL) • AIMレベルがHIGHであり、ASMMが有効 (SGA_TARGET>0) であることが必要 • AIMレベルがMEDIUMでも動作するがINMEMORY句が⾃動的に設定されない • AIMはINMEMORY_SIZE=0 (IM列ストアは無効) では動作しない メリット • IM列ストアのサイズを⼿動で変更する必要がなくなり、DBIMを有効にする際の管理作業が軽減される • これにより、IM列ストアをAutonomous Databaseでも有効にでき、より⾼速な分析クエリを利⽤することができる ⾃動インメモリ・サイジング Copyright © 2023, Oracle and/or its affiliates 31 SGA インメモリ 列ストア バッファ・ キャッシュ SGA バッファ・キャッシュ インメモリ 列ストア OLTP OLAP
  30. ⾃動インメモリ(21c) 機能概要 • 使⽤パターンを追跡し、⾃動的にオブジェクトのポピュレート、退避、列の圧縮を⾏う • 内部でヒートマップ・データを活⽤するがヒートマップ機能をONにする必要はない • 初期化パラメータINMEMORY_AUTOMATIC_LEVEL • OFF(デフォルト)

    • ⾃動インメモリは無効、12cR2 (12.2.0.1) と同じ動作 (ADOインメモリポリシーにて⾃動的な インメモリ化/インメモリ退去が可能) • LOW(18cから) • ポピュレートの失敗がトリガーとなり、データベースはコールド・セグメント (PRIORITYがNONE) を 退避させ、単⼀のタスクで失敗したオブジェクトのポピュレートを⾏う • MEDIUM(18cから) • メモリが圧迫されている場合、適格なホット・セグメントを確実にポピュレートする • ポピュレートの失敗ではなく、IMCOサイクル中にトリガーされる • HIGH(21cから) • MEDIUMの動作に加え、 INMEMORY句が未設定のセグメントをINMEMORY MEMCOMPRESS AUTOに設定して、コールド列に対しての圧縮制御 (より⾼い圧縮レベルへの変更など) を⾏う • AIMの決定を上書きできる • 既存のINMEMORY設定は変更されない ⾃動インメモリ・サイジング Copyright © 2023, Oracle and/or its affiliates 32 インメモリ列ストア アクティブ・セグメントは ⾃動的に列ストアに ポピュレートします ⾮アクティブ・セグメン トは列ストアから削 除されます 利⽤頻度の低い列データは ⾃動的に圧縮されます
  31. V$INMEMORY_SIZE_ADVICE(23cから) IM列ストアの異なるシミュレート・サイズに対する使⽤量とパフォーマンス統計を推定する (実⾏はCDBでのみ) • PDBではV$INMEMORY_SIZE_ADVICE_PDBビューで表⽰できる ⾃動インメモリ・サイジング Copyright © 2023, Oracle

    and/or its affiliates 33 SQL> select * from V$INMEMORY_SIZE_ADVICE; IM_POOL_SIZE_FOR_ESTIMATE SIZE_FACTOR ESTD_IM_USED_SIZE ESTD_IM_SCAN_TIME ESTD_TOTAL_DB_TIME CON_ID ------------------------- ----------- ----------------- ----------------- ------------------ ---------- 870 .3465 609 338 1791 0 970 .3863 679 377 1735 0 1080 .4301 756 419 1673 0 1200 .4779 840 455 1620 0 1330 .5297 930 493 1564 0 1480 .5894 1036 539 1498 0 1640 .6531 1148 585 1430 0 1830 .7288 1281 630 1363 0 2030 .8084 1421 678 1295 0 2250 .8961 1575 730 1218 0 2511 1 1757 791 1130 0 3150 1.2545 2205 889 987 0 3790 1.5094 2653 920 941 0 4430 1.7642 2773 929 929 0 5070 2.0191 2773 929 929 0 5700 2.27 2773 929 929 0 6340 2.5249 2773 929 929 0 6980 2.7798 2773 929 929 0 7620 3.0346 2773 929 929 0 8260 3.2895 2773 929 929 0
  32. フル・スキャン問合せの実⾏ • 各初期化パラメータと動的SGAコンポーネントの確認 • フル・スキャン問合せ実⾏後 ⾃動インメモリ・サイジング Copyright © 2023, Oracle

    and/or its affiliates 34 DECLARE V_COUNT NUMBER := 0; BEGIN FOR I IN 1..30 LOOP select count(*) into V_COUNT from ( select ... ); END LOOP; END; / ... SQL> select COMPONENT, CURRENT_SIZE/1024/1024 "CURR(MB)", 2 MIN_SIZE/1024/1024 "MIN(MB)", 3 MAX_SIZE/1024/1024 "MAX(MB)",LAST_OPER_TYPE,OPER_COUNT 4 from v$memory_dynamic_components 5 where COMPONENT in ('In-Memory Area','DEFAULT buffer cache’); COMPONENT CURR(MB) MIN(MB) MAX(MB) LAST_OPER_TYP OPER_C -------------------- -------- ------- ------- ------------- ------ DEFAULT buffer cache 12480 12480 12576 SHRINK 3 In-Memory Area 224 128 224 GROW 3 SQL> show parameter ... NAME TYPE VALUE ------------------------------------ ----------- --------------- sga_target big integer 14848M inmemory_size big integer 128M inmemory_automatic_level string HIGH SQL> select COMPONENT, CURRENT_SIZE/1024/1024 "CURR(MB)", 2 MIN_SIZE/1024/1024 "MIN(MB)", 3 MAX_SIZE/1024/1024 "MAX(MB)",LAST_OPER_TYPE,OPER_COUNT 4 from v$memory_dynamic_components 5 where COMPONENT in ('In-Memory Area','DEFAULT buffer cache’); COMPONENT CURR(MB) MIN(MB) MAX(MB) LAST_OPER_TYP OPER_C -------------------- -------- ------- ------- ------------- ------ DEFAULT buffer cache 12576 12576 12576 INITIALIZING 0 In-Memory Area 128 128 128 STATIC 0
  33. 機能概要 • ⾃動インメモリ (AIM) が使⽤状況と利点に基づき、予測的かつ最適な⽅法でインメモリ・パフォーマンス機能を⾃動的 に有効にする(変更を監視し、コスト効率が低い場合は元に戻す) • 結合グループ、インメモリ最適化算術など • 混在ワークロード環境をより適切に考慮するためのワークロード分析の強化

    • DMLオーバーヘッドを考慮 (IM列ストアの無効な⾏をバッファ・キャッシュからフェッチなど) • AIMレベルがHIGHで、AIM_TASKが有効の場合に以下のように動作する • ⼀定期間のSQL⽂をキャプチャする • 効果がありそうなインメモリ機能を特定する • インメモリ機能を有効にすることで効果があるかを検証する • 機能を有効にするかどうかを決定する • 定期的にワークロードを監視し、効果を確認する メリット • 主要なパフォーマンス機能の活⽤に必要な⼿作業を削減する • 有効化するメリットを判断するには、コストとメリットを理解するためのワークロード分析をかなり⾏う必要がある インメモリ・パフォーマンス機能の⾃動有効化 Copyright © 2023, Oracle and/or its affiliates 35
  34. 制御とステータス DBMS_AUTOIM パッケージ • SET_PARAMETERプロシージャ • 機能作成の制御 (オン/オフ) • 統計時間ウィンドウの設定

    • ACTIVETY_REPORTファンクション • 指定した時間間隔のAIMタスク・アクティビティを⽣成する DBA_AIM_PERF_FEATURES ビュー • 次のAIMパフォーマンス機能が有効になっている表の列を⽰す • Optimized Arithmetic (最適化算術) • 列が算術演算に最適化されている (サイズのオーバーヘッドがある) • Bloom Filter Optimization (ブルーム・フィルター最適化) • 列がハッシュ結合時にブルーム・フィルターをプローブするためにキャッシュされたハッシュ値を使⽤する (ハッシュ値を毎回計算する必要がない) • Vector Optimization (ベクトル最適化) • ベクトル最適化を⽤いてデータを列に格納する • Join Group (結合グループ) • 列がAIMによって作成された結合グループの⼀部である (効果がない場合がある) インメモリ・パフォーマンス機能の⾃動有効化 Copyright © 2023, Oracle and/or its affiliates 36
  35. DBMS_AUTOIMパッケージ AIM設定を制御する • DBMS_AUTOIM.SET_PARAMETERプロシージャ(⼀部のAIM設定を変更する) • AIM_TASK (⾃動IMパフォーマンス機能作成タスクの有効化または無効化、デフォルトDISABLE) • INTERVAL (⾃動IMパフォーマンス機能作成タスクの頻度を秒単位で設定する、デフォルト900秒)

    • DBMS_AUTOIM.GET_PARAMETERプロシージャ(⼀部のAIM設定を確認する) インメモリ・パフォーマンス機能の⾃動有効化 Copyright © 2023, Oracle and/or its affiliates 37 SQL> exec DBMS_AUTOIM.SET_PARAMETER('AIM_TASK', 'ENABLE’); SQL> exec DBMS_AUTOIM.SET_PARAMETER('INTERVAL',900); SQL> VARIABLE w_aimtask char(10) BEGIN DBMS_AUTOIM.GET_PARAMETER('AIM_TASK', :w_aimtask); END; / PRINT w_aimtask W_AIMTASK -------------------------------- ENABLED SQL> VARIABLE w_interv number BEGIN DBMS_AUTOIM.GET_PARAMETER('INTERVAL', :w_interv); END; / PRINT w_interv W_INTERV ---------- 900
  36. DBMS_AUTOIMパッケージ • DBMS_AUTOIM.ACTIVITY_REPORTファンクション(選択した機能に関するデータを収集する) • パラメータ feature_id, start_time, end_time, type, level

    が指定可能 • Feature_id (V$AUTO_IM_FEATURES から取得) • Type (指定可能な値は 'TEXT'、'HTML'、'XML') • Level (指定可能な値は 'BASIC'、'DETAILED') • 過去24時間のAutoIMアクティビティに関する典型的なレポートを作成する例 インメモリ・パフォーマンス機能の⾃動有効化 Copyright © 2023, Oracle and/or its affiliates 38 SQL> set long 2000000 SQL> set heading off SQL> select dbms_autoim.activity_report() from dual; REPORT SUMMARY ------------------------------------------------------------------------------- Start time : 27-NOV-2023 07:03:06 End time : 28-NOV-2023 07:03:06 No. of times auto task scheduled : 1 Statements Analyzed : 25 IM Performance Candidates Identified : 1 Statements Verified : 0 IM Performance Candidates Accepted : 1 ------------------------------------------------------------------------------- DBMS_AUTOIM.ACTIVITY_REPORT ( feature_id IN number := NULL, start_time IN timestamp with time zone := NULL, end_time IN timestamp with time zone := NULL, type IN varchar2 := 'TEXT', level IN varchar2 := 'BASIC' ) return clob;
  37. インメモリ・パフォーマンス機能の⾃動有効化 AIMを検査するためのビュー • V$AUTO_IM_FEATURES • AIMによって最適化されるIM列ストアのパフォーマ ンス機能を⽰す • DBMS_AUTOIM.ACTIVITY_REPORTファンク ションで使⽤するfeature_idを取得する

    • DBA_AIM_PERF_FEATURES • AIMパフォーマンス機能が有効になっている表の列 を⽰す 39 Copyright © 2023, Oracle and/or its affiliates SQL> select * from V$AUTO_IM_FEATURES; FEATURE_ID DESCRIPTION CON_ID ---------- ---------------------------------------- ------ 1 Autonomous Join Groups 0 2 Autonomous DML tracking 0 3 Autonomous Optimized Arithmetic 0 4 Autonomous Bloom Filter Optimization 0 5 Autonomous Vector Optimization 0 6 Autonomous Cold Column Eviction 0 6 rows selected. SQL> alter system set INMEMORY_AUTOMATIC_LEVEL=HIGH ; SQL> exec DBMS_AUTOIM.SET_PARAMETER('AIM_TASK', 'ENABLE’); ... SQL> select * from DBA_AIM_PERF_FEATURES; OWNER_NAME TABLE_NAME COLUMN_NAME O B V J CREATION_ ---------- ---------- ----------- - - - - --------- TEST23 TAB01 C3 Y N N N 07-NOV-23 TEST23 TAB01 C2 Y N N N 07-NOV-23 TEST23 TAB01 C1 Y N N N 07-NOV-23 SQL> show parameter inmemory_optimized_arithmetic NAME TYPE VALUE ------------------------------------ ----------- --------------- inmemory_optimized_arithmetic string DISABLE O – optimized_arithmetic B – bloomfilter_optimization V – vector_optimization J – join_group
  38. DBMS_AUTOIM.ACTIVITY_REPORTファンクションの詳細レポート インメモリ・パフォーマンス機能の⾃動有効化 Copyright © 2023, Oracle and/or its affiliates 40

    SQL> set long 2000000 SQL> set heading off SQL> select dbms_autoim.activity_report(NULL,to_timestamp('07-NOV-2023','DD-MON-YYYY'), to_timestamp('08-NOV-2023','DD-MON-YYYY'),'TEXT','DETAILED') from dual; REPORT SUMMARY ------------------------------------------------------------------------------- Start time : 07-NOV-2023 00:00:00 End time : 08-NOV-2023 00:00:00 No. of times auto task scheduled : 10 Statements Analyzed : 9 IM Performance Candidates Identified : 4 Statements Verified : 4 IM Performance Candidates Accepted : 4 ------------------------------------------------------------------------------- REPORT DETAILS ------------------------------------------------------------------------------- FEATURE NAME: Optimized Arithmetic ------------------------------------------------------------------------------- Delta Elapsed time : 52.42 Delta CPU time : 65.03 ------------------------------------------------------------------------------- CANDIDATES: --------------------------------------------------------------- | Table Name | Column Name | Frequency | Monitored | Accepted | --------------------------------------------------------------- | TAB01 | C1 | 9 | 45 | TRUE | | TAB01 | C2 | 8 | 45 | TRUE | | TAB01 | C3 | 8 | 45 | TRUE | --------------------------------------------------------------- Target SQLs ---------------------- ----------------------------------------------------------------------------------- | SQL ID | B_Elapsed | A_Elapsed | B_CPU | A_CPU | Elapsed(%) | CPU(%) | ----------------------------------------------------------------------------------- | 7jmwzc81n3t9w | 4787045 | 4366032 | 2657137 | 2035592 | 8.79 | 23.39 | | 9r4qas79bssga | 4185080 | 1175995 | 4158117 | 1171376 | 71.9 | 71.83 | | 7vausqch2af27 | 659539 | 126049 | 649712 | 125771 | 80.89 | 80.64 | | 5y37sfvtbgszv | 2855703 | 273674 | 2843744 | 272622 | 90.42 | 90.41 | -----------------------------------------------------------------------------------
  39. 補⾜︓インメモリ最適化算術(18c) インメモリ・パフォーマンス機能の⾃動有効化 Copyright © 2023, Oracle and/or its affiliates 41

    ⾮常に速い数値演算 • NUMBER列の新しいインメモリ最適化フォーマット (Query Low圧縮のみ) • ソフトウェアで実装された可変幅のNUMBERデータ型の 代わり • 新しいパラメータ (inmemory_optimized_arithmetic) を使⽤して有効にする • 最適化されたインメモリ数値形式でのSIMDベクター処 理 • 集計演算と算術演算が最⼤40倍向上 • すべての処理で利⽤できる訳ではないため、 NUMBERデータ型と最適化型の両⽅で格納される • 約15%〜20%程度のオーバーヘッド Price 02 35 1F Price 1.52 4.05 10 45.22 Price 05 06 Price 0B Price 2E 17 15 à 1.52 à 4.05 à 10 à 45.22 Oracle Number (SUM) SUM(Price) Oracle数値処理は⾏ごとで遅い インメモリ数値の⾼速SIMDベクター処理 S I M D S U M SUM(Price) {
  40. 新しいインメモリ・アドバイザ 機能概要 • 新しいデータベース組込み型のインメモリ・アドバイザが提供された • 新しいインメモリ・アドバイザはOracle Databaseのパッケージ (dbms_inmemory_advise) となった •

    2つのツールで構成されている • 適正テスト・ツール (dbms_inmemory_advise.is_inmemory_eligibleプロシージャ) • AWRスナップショット範囲に基づいてデータベースがインメモリに適しているかどうかを素早く判断する • 19c (19.20) にバックポートされた • 新しいインメモリ・アドバイザ • 指定されたワークロード時間枠に基づき、オブジェクトの利点を分析する包括的な分析ツール • ヒートマップに基づく新しいインメモリ推薦エンジンで精度を向上 • ヒートマップはOracle Database EEの⼀部として利⽤可能 (以前はAdvanced Compressionが必要) • 適正テスト・ツールで有⽤でないデータベースのワークロードを特定し、有⽤な候補のワークロードだけを分析する メリット • ダウンロードしてインストールする必要がなく、良い候補のデータベースのみを対象に、より詳細に分析が可能になった Copyright © 2023, Oracle and/or its affiliates 43
  41. In-Memory Advisor(旧バージョン) 新しいインメモリ・アドバイザ Copyright © 2023, Oracle and/or its affiliates

    • データベースにインストールする必要がある スタンドアロン・パッケージ • OTNで無料ダウンロード可能 (11.2.0.3以上 のDBで実⾏可) • AWRとASHリポジトリを介して既存のDBワーク ロードを分析し、IM列ストアにポピュレートされ ると最も有益なオブジェクトのリストを提供 • IMサイズに基づき、全体的な利点、上位の SQL⽂やオブジェクトに対する利点の⾒積もり を含むHTMLレポートを⽣成 Note: Database Tuning Pack のライセンスが必要 44
  42. • 複数のセクションが利⽤可能 - インメモリ・サイズ - 分析に有益なSQL⽂ - 上位の推奨オブジェクト - メモリ・サイズに基づくすべてのオブジェクト

    - 推奨理由 - 実装SQL In-Memory Advisor(旧バージョン) 新しいインメモリ・アドバイザ • インメモリ・サイズが9.141GBで、インメモリ配置で分析処理に有益なSQLと推奨オブジェクト Copyright © 2023, Oracle and/or its affiliates 45
  43. 適正テスト・ツール IS_INMEMORY_ELIGIBLEには3つのワークロードを特定する⼊⼒があり、 適正テストの範囲をどのように定義するかを選択できる • 構⽂1: 今⽇を含む直近n⽇として⼊⼒ • 構⽂2: AWRスナップショット範囲として⼊⼒ •

    構⽂3: 時間間隔 (開始時間と終了時間) として⼊⼒ 新しいインメモリ・アドバイザ Copyright © 2023, Oracle and/or its affiliates 46 DBMS_INMEMORY_ADVISE.IS_INMEMORY_ELIGIBLE ( TIME_WINDOW_DAYS IN NUMBER, INMEM_ELIGIBLE OUT BOOLEAN, ANALYSIS_SUMMARY OUT VARCHAR2, SNAP_DBID IN NUMBER DEFAULT NULL ); DBMS_INMEMORY_ADVISE.IS_INMEMORY_ELIGIBLE ( START_SNAP_ID IN NUMBER, END_SNAP_ID IN NUMBER, INMEM_ELIGIBLE OUT BOOLEAN, ANALYSIS_SUMMARY OUT VARCHAR2, SNAP_DBID IN NUMBER DEFAULT NULL ); DBMS_INMEMORY_ADVISE.IS_INMEMORY_ELIGIBLE ( START_TIME IN TIMESTAMP, END_TIME IN TIMESTAMP, INMEM_ELIGIBLE OUT BOOLEAN, ANALYSIS_SUMMARY OUT VARCHAR2, SNAP_DBID IN NUMBER DEFAULT NULL );
  44. 適正テスト・ツール 今⽇を含む直近1⽇間のワークロードに対する適正テストの例 • 全体のワークロードに対して、分析ワークロードの⽐率がどのくらいかを判断する (⽬標分析ワークロード率を上回るとTRUEとなる) 新しいインメモリ・アドバイザ Copyright © 2023, Oracle

    and/or its affiliates 47 set serverout on; variable analysis_summary VARCHAR2(1000) DECLARE inmem_eligible BOOLEAN; BEGIN dbms_inmemory_advise.is_inmemory_eligible(1, inmem_eligible, :analysis_summary); DBMS_OUTPUT.PUT_LINE(CASE WHEN inmem_eligible = TRUE THEN 'Eligibile for In-Memory' ELSE 'Not Eligible for In-Memory' END); END; / Eligibile for In-Memory PL/SQL procedure successfully completed. SQL> print analysis_summary ANALYSIS_SUMMARY ----------------------------------------------------------------------------------------------------- Observed Analytic Workload Percentage is 40% is greater than target Analytic Workload Percentage 20%
  45. 新しいインメモリ・アドバイザ PL/SQLパッケージDBMS_INMEMORY_ADVISEには、以下のステップのためのAPIが含まれている 1. ヒートマップを有効にする (これはDBMS_INMEMORY_ADVISEを使⽤するために必要) 2. インメモリ・アドバイザ追跡タスクを作成し開始する (タスクIDを取得する) exec dbms_inmemory_advise.start_tracking();

    3. インメモリ・アドバイザ追跡タスクのワークロード統計追跡を停⽌する exec dbms_inmemory_advise.stop_tracking(); 4. アドバイザ追跡のレポートを作成する (アドバイザはワークロードの統計情報を調べ、分析を実⾏し、そしてアドバ イ スを⽣成する) exec dbms_inmemory_advise.generate_advise(); 5. dba_inmemory_advise_recommendationビューに問い合わせて推奨を表⽰する select * from dba_inmemory_advisor_recommendation; 新しいインメモリ・アドバイザ Copyright © 2023, Oracle and/or its affiliates 48
  46. 新しいインメモリ・アドバイザの実⾏例 • シミュレーションされたインメモリ・サイズ (INMEMORY_SIZE列) に推奨されるオブジェクトのリスト 新しいインメモリ・アドバイザ Copyright © 2023, Oracle

    and/or its affiliates 49 SQL> alter system set heat_map=on; SQL> variable taskid NUMBER; SQL> exec dbms_inmemory_advise.start_tracking(:taskid); SQL> print taskid TASKID ---------- 1 SQL> exec dbms_inmemory_advise.stop_tracking; SQL> exec dbms_inmemory_advise.generate_advise; SQL> Select INMEMORY_SIZE/1024/1024 INMEMORY_SIZE_MB, ESTIMATED_DB_TIME_HIGH/60 ESTIMATED_DB_TIME_MINUTES, RECOMMENDED_OBJ_LIST 2 from DBA_INMEMORY_ADVISOR_RECOMMENDATION where task_id = 1; INMEMORY_SIZE_MB ESTIMATED_DB_TIME_MINUTES RECOMMENDED_OBJ_LIST ---------------- ------------------------- -------------------------------------------------------------------------------- 0 8.6197877 74.1 8.27409783 Owner: SCOTT Table: ANA_5 ;Owner: SCOTT Table: ANA_4 ; 296.4 5.57368015 Owner: SCOTT Table: ANA_5 ;Owner: SCOTT Table: ANA_4 ;Owner: SCOTT Table: ANA_1 ...
  47. Copyright © 2023, Oracle and/or its affiliates 50 Database In-Memory

    その他の機能拡張 • 選択しやすいインメモリ列 • インメモリRACレベル・グローバル・ディクショナリ • ハイブリッド Exadata スキャン • Autonomous Database Dedicated のインメモリ
  48. 新しいインメモリ列の包含/除外構⽂ 機能概要 • 23cのワイド・テーブル機能では、1テーブルあたり最⼤4096列まで使⽤できるため、“NO INMEMORY ”構⽂を変更 し、多数の列を持つテーブルを管理しやすくした • 以前は、NO INMEMORYサブ句で列リストを指定することによってのみ、列をポピュレーションから除外することができた

    • 23cでは、すべての列をINMEMORYまたはNO INMEMORYとして指定し、選択的に列を取り込んだり取り込まなかっ たりできるようになった メリット • 列の多いテーブルで少ない列を有効にする場合に、指定しやすくなった (有効にしたい列を指定できる) 選択しやすいインメモリ列 Copyright © 2023, Oracle and/or its affiliates 51 ALTER TABLE tab01 INMEMORY NO INMEMORY(col1, col2); ALTER TABLE tab01 INMEMORY; ALTER TABLE tab01 NO INMEMORY(ALL) INMEMORY(col1, col2); ALTER TABLE <表名> NO INMEMORY(ALL) INMEMORY(col1, col2); ALTER TABLE <表名> INMEMORY(ALL) NO INMEMORY(col1, col2);
  49. 利⽤イメージ • INMEMORY(ALL) NO INMEMORY の例 • NO INMEMORY(ALL) INMEMORY

    の例 選択しやすいインメモリ列 Copyright © 2023, Oracle and/or its affiliates 52 SQL> create table tab01 (c1 number, c2 number, c3 number); SQL> ALTER TABLE tab01 INMEMORY; SQL> ALTER TABLE tab01 NO INMEMORY(ALL) INMEMORY(c1, c2); SQL> select table_name,column_name,inmemory_compression 2 from v$im_column_level; TABLE_NAME COLUMN_NAME INMEMORY_COMPRESSION --------------- --------------- ------------------- TAB01 C1 DEFAULT TAB01 C2 DEFAULT TAB01 C3 NO INMEMORY SQL> SELECT inmemory_compression compress, populate_status status, 2 bytes/1024/1024 "orig_size(MB)", 3 inmemory_size/1024/1024 "inmem_size(MB)", 4 bytes_not_populated not_populate 5 FROM v$im_segments where segment_name = 'TAB01'; COMPRESS STATUS orig_size(MB) inmem_size(MB) NOT_POPULATE ------------- --------- ------------- -------------- ------------ FOR QUERY LOW COMPLETED 18.640625 14.4375 0 SQL> create table tab01 (c1 number, c2 number, c3 number); SQL> ALTER TABLE tab01 INMEMORY; SQL> ALTER TABLE tab01 INMEMORY(ALL) NO INMEMORY(c1, c2); SQL> select table_name,column_name,inmemory_compression 2 from v$im_column_level; TABLE_NAME COLUMN_NAME INMEMORY_COMPRESSION --------------- --------------- ------------------- TAB01 C1 NO INMEMORY TAB01 C2 NO INMEMORY TAB01 C3 DEFAULT SQL> SELECT inmemory_compression compress, populate_status status, 2 bytes/1024/1024 "orig_size(MB)", 3 inmemory_size/1024/1024 "inmem_size(MB)", 4 bytes_not_populated not_populate 5 FROM v$im_segments where segment_name = 'TAB01'; COMPRESS STATUS orig_size(MB) inmem_size(MB) NOT_POPULATE ------------- --------- ------------- -------------- ------------ FOR QUERY LOW COMPLETED 18.640625 4.4375 0
  50. RACで結合グループが可能に 機能概要 • RACデータベース内のノード間で結合される列の共通ディクショナリが共有 (グローバル・ディクショナリがサポート) され、 RACノード間でのDBIM結合グループが可能になった (以前は共通ディクショナリがインスタンス内での共通のみ) • 結合グループは結合列の圧縮ディクショナリを共有する

    (実際のデータではなくディクショナリ値で結合を⾏う) メリット • この機能により、RAC環境で分散ハッシュ結合のDBIMパフォーマンスがさらに向上する • 結合があり、ブルーム・フィルターの効果が少ない (フィルター述語がないなど) 問合せパフォーマンスが向上する インメモリRACレベル・グローバル・ディクショナリ Copyright © 2023, Oracle and/or its affiliates 53 VEHICLE_NAME Sales Vehicles NAMEが 結合列 NAME CREATE INMEMORY JOIN GROUP V_name_jg (VEHICLES(NAME),SALES(VEHICLE_NAME)); select ... from VEHICLES v, SALES s where v.NAME = s.VEHICLE_NAME ;
  51. 結合グループ(12.2) • ハッシュ結合は、ディクショナリ・ コードの単純な配列検索に変更 される インメモリRACレベル・グローバル・ディクショナリ Copyright © 2023, Oracle

    and/or its affiliates 54 圧縮値の配列 圧縮値から個別値の配列を作成 する テーブル・スキャン VEHICLESをスキャンし、⼀致する 結合列の値を圧縮形式で送信 する テーブル・スキャン SALESをスキャンし、クエリ述語に 基づいて⾏をフィルターする ハッシュ結合 配列内の圧縮された値を 検索して結合を完了する ⾏をハッシュ結合に送る ⼀致した⾏を圧縮形式で 結合に送る
  52. ⼀つの表に対するスキャンをIM列ストアとSmart Scanの両⽅にできる 機能概要 • 23cより前のExadataのテーブル・スキャンでは、テーブルの80%未満しかデータがな い場合、IM列ストアにアクセスできなかった • 代わりに Exadata Smart

    Scan が使⽤された • ハイブリッドExadataスキャンではIM列ストアと Smart Scan の両⽅からアクセスが できるようになり、ストレージ層のパフォーマンスを向上させる • 部分的にポピュレートされているテーブルのスキャンでもIM列ストアが使⽤される • ⾮ポピュレート・データは Smart Scans を経由して Cell Memory Columnar Cache からアクセスできる メリット • セグメントのポピュレーション割合が変動する場合でも、カラムナー処理の恩恵を受 けることができる (最適なスキャンが使⽤できる) • これにより、23cの⾃動インメモリ・サイジング機能を使⽤する際、IM列ストア・サ イズが縮⼩された場合にも⼤きなメリットがある ハイブリッド Exadata スキャン Copyright © 2023, Oracle and/or its affiliates 55 In-Memory Columnar scans In-Flash Columnar scans Storage Servers Compute Servers
  53. 機能概要 • Autonomous Database (Dedicated) 上のPDBでインメモリ⽤にプロビジョニングできるようになった • 19.20.0.1.0からの4 OCPU以上で •

    PDBテナントをインメモリ⽤に設定するには︖ • PDBをインメモリでプロビジョニングするかどうかを⽰すチェックボックスが提供された • “Enable”ボタンを押すと、IM列ストアに割り当てるメモリ量を調整できる • ADBごとに利⽤可能なSGAの5〜70%を有効にすることが可能 • PDB内のテーブルを IM列ストアにポピュレートするためには、インメモリを有効にしておく必要がある • ⾃動インメモリ (INMEMORY_AUTOMATIC_LEVEL) はデフォルトでMEDIUMレベルに設定される メリット • Autonomous Databaseのテナントは、今も⾃動的にCell-Memoryの恩恵を受けているが、インメモリはCell- Memoryよりもはるかに⾼速なパフォーマンスの提供が可能になる Autonomous Database Dedicated のインメモリ Copyright © 2023, Oracle and/or its affiliates 56
  54. Copyright © 2023, Oracle and/or its affiliates 59 Fast Ingest

    (Memoptimize for Write) の機能拡張
  55. Memoptimized Rowstore ⾼速収集の機能強化がされた 機能概要 • Memoptimize Rowstore Fast Ingest に以下の機能が強化され、⾼速なデータ取り込みが必要とされるより多くの

    状況において、より簡単に組み込むことが可能になった • 暗号化のサポート (表領域、列、SecureFiles)、圧縮のサポート、LOB (インラインLOBのみ) のサポート • LOBと暗号化のサポートは 19.16 と 21.3 からサポートされている • インターバル・パーティション、⾃動リスト・パーティション、サブ・パーティションのサポート • CREATE TABLE⽂で指定可能に (これまではALTER TABLE⽂でMEMOPTIMIZE FOR WRITEを指定) • ラージプール内のインジェスト・バッファ (Memoptimized Write領域) を明⽰的に割当可能に • 初期化パラメータ MEMOPTIMIZE_WRITE_AREA_SIZE (デフォルトは0で、利⽤可能なメモリに基づいて決定) • MEMOPTIMIZE_WRITEヒントの使⽤を回避できるようになった • 初期化パラメータ MEMOPTIMIZE_WRITES (デフォルトHINT) メリット • この機能により、⾼速なデータ取り込み機能を必要とするアプリケーションに対するサポートが向上する • データの取り込みから処理まで、すべて同じデータベース内で⾏うことができる • これにより、特別なロード環境の必要性が減り、複雑さとデータの冗⻑性が軽減される Fast Ingest (Memoptimize for Write) の機能拡張 Copyright © 2023, Oracle and/or its affiliates 60
  56. 新しいストリーミング収集メカニズム • MEMOPTIMIZE FOR WRITE を表に宣⾔ • クライアントがラージ・プール内のバッファに書込む • 領域はインサートの初回実⾏時に確保される

    • バッファはバックグラウンドによって書込まれる • ⼤量に遅延書込みを⾏うためスループットが⾮常に⾼い • 通常のOracleトランザクションの仕組みはバイパスされる • IoTデバイス (センサーの読取り値など) からのストリーミング・ インサートに最適 パフォーマンス • インサート・スループットを77%⾼速化 • シングルX6-2サーバーで毎秒2,300万インサート Copyright © 2023, Oracle and/or its affiliates ⾼頻度IoT収集の例(19c) IoTクライアント Optimized Write 温度測定値 Periodic Buffer Drain バッファ 追加 バックグランド Drainers In-Memory Ingest Buffer 時間 温度 05:50 52o 05:55 54o 06:00 54o 06:05 55o Insert: <6:05AM, 55o > 例: 温度測定値の書込み 61 Fast Ingest (Memoptimize for Write) の機能拡張
  57. 確認 v$memoptimize_write_area(ラージ・プール内の⾼速収集データ領域) • 初回のインサート時に確保される • TOTAL_SIZE (割り当てられている合計サイズ) • USED_SPACE (現在使⽤されているサイズ)

    • FREE_SPACE (現在空いているサイズ) • NUM_WRITES • まだディスクに書き込まれていない挿⼊操作の数 • NUM_WRITERS • 現在⾼速収集を使⽤しているクライアントの数 セッションレベル統計 • memopt w rows written • ラージ・プール内の領域に遅延挿⼊された⾏数 • memopt w rows flushed • ラージ・プール内の領域からフラッシュされた⾏数 Fast Ingest (Memoptimize for Write) の機能拡張 Copyright © 2023, Oracle and/or its affiliates 62 SQL> select * from v$memoptimize_write_area; TOTAL_SIZE USED_SPACE FREE_SPACE NUM_WRITES NUM_WRITERS CON_ID ---------- ---------- ---------- ---------- ----------- ---------- 0 0 0 0 0 3 SQL> INSERT /*+ MEMOPTIMIZE_WRITE */ INTO test_fast_ingest VALUES (1,'test'); SQL> select * from v$memoptimize_write_area; TOTAL_SIZE USED_SPACE FREE_SPACE NUM_WRITES NUM_WRITERS CON_ID ---------- ---------- ---------- ---------- ----------- ---------- 2167406592 1048576 2166358016 0 1 3 SQL> select n.NAME, s.VALUE, s.CON_ID from V$MYSTAT s, V$STATNAME n 2 WHERE s.STATISTIC#=n.STATISTIC# AND n.NAME LIKE 'memopt w rows%'; NAME VALUE CON_ID ------------------------------ ---------- ---------- memopt w rows written 0 3 memopt w rows flushed 0 3
  58. MEMOPTIMIZE_WRITESパラメータ • MEMOPTIMIZE_WRITEヒントなし Fast Ingest (Memoptimize for Write) の機能拡張 Copyright

    © 2023, Oracle and/or its affiliates 63 SQL> alter session set MEMOPTIMIZE_WRITES=ON ; SQL> CREATE TABLE test_fast_ingest ( 2 id NUMBER(5) PRIMARY KEY, test_col VARCHAR2(15)) 3 SEGMENT CREATION IMMEDIATE 4 MEMOPTIMIZE FOR WRITE; SQL> select table_name, MEMOPTIMIZE_WRITE 2 from user_tables where table_name like 'TEST%'; TABLE_NAME MEMOPTIM -------------------- -------- TEST_FAST_INGEST ENABLED SQL> select n.NAME,s.VALUE,s.CON_ID from V$MYSTAT s, V$STATNAME n 2 where s.STATISTIC#=n.STATISTIC# 3 and n.NAME like 'memopt w rows%’; NAME VALUE CON_ID ------------------------------ ---------- ---------- memopt w rows written 0 3 memopt w rows flushed 0 3 SQL> INSERT INTO test_fast_ingest VALUES (1,'test’); SQL> select n.NAME,s.VALUE,s.CON_ID from V$MYSTAT s, V$STATNAME n 2 where s.STATISTIC#=n.STATISTIC# 3 and n.NAME like 'memopt w rows%’; NAME VALUE CON_ID ------------------------------ ---------- ---------- memopt w rows written 1 3 memopt w rows flushed 0 3
  59. 暗号化 • 暗号化のサポート Fast Ingest (Memoptimize for Write) の機能拡張 Copyright

    © 2023, Oracle and/or its affiliates 64 SQL> select a.name, b.encryptionalg, b.encryptedts 2 from v$tablespace a, v$encrypted_tablespaces b 3 where a.ts#=b.ts#; NAME ENCRYPT ENC ------------------------------ ------- --- SYSTEM AES256 YES SYSAUX AES256 YES UNDOTBS1 AES256 YES TEMP AES256 YES USERS AES256 YES SQL> CREATE TABLE test_fast_ingest 2 (id NUMBER PRIMARY KEY, test_col VARCHAR2(15)) 3 SEGMENT CREATION IMMEDIATE 4 MEMOPTIMIZE FOR WRITE 5 TABLESPACE users; Table created. SQL> select n.NAME,s.VALUE,s.CON_ID from V$MYSTAT s, V$STATNAME n 2 where s.STATISTIC#=n.STATISTIC# 3 and n.NAME like 'memopt w rows%'; NAME VALUE CON_ID ------------------------------ ---------- ---------- memopt w rows written 0 3 memopt w rows flushed 0 3 SQL> INSERT INTO test_fast_ingest VALUES (1,'test'); SQL> select n.NAME,s.VALUE,s.CON_ID from V$MYSTAT s, V$STATNAME n 2 where s.STATISTIC#=n.STATISTIC# 3 and n.NAME like 'memopt w rows%'; NAME VALUE CON_ID ------------------------------ ---------- ---------- memopt w rows written 1 3 memopt w rows flushed 0 3
  60. 圧縮表 • 圧縮表/IM圧縮表 Fast Ingest (Memoptimize for Write) の機能拡張 Copyright

    © 2023, Oracle and/or its affiliates 65 SQL> alter session set MEMOPTIMIZE_WRITES=ON ; SQL> CREATE TABLE test_fast_ingest ( 2 id NUMBER(5) PRIMARY KEY, test_col VARCHAR2(15)) 3 SEGMENT CREATION IMMEDIATE 4 MEMOPTIMIZE FOR WRITE 5 ROW STORE COMPRESS BASIC; SQL> select table_name, COMPRESS_FOR, MEMOPTIMIZE_WRITE 2 from user_tables where table_name like 'TEST%'; TABLE_NAME COMPRESS_FOR MEMOPTIM -------------------- -------------------- -------- TEST_FAST_INGEST BASIC ENABLED SQL> INSERT INTO test_fast_ingest VALUES (1,'test’); SQL> select n.NAME,s.VALUE,s.CON_ID from V$MYSTAT s, V$STATNAME n 2 where s.STATISTIC#=n.STATISTIC# 3 and n.NAME like 'memopt w rows%’; NAME VALUE CON_ID ------------------------------ ---------- ---------- memopt w rows written 1 3 memopt w rows flushed 0 3 SQL> CREATE TABLE test_fast_ingest ( 2 id NUMBER(5) PRIMARY KEY, test_col VARCHAR2(15)) 3 SEGMENT CREATION IMMEDIATE 4 MEMOPTIMIZE FOR WRITE 5 INMEMORY MEMCOMPRESS FOR QUERY LOW; SQL> select table_name,inmemory,INMEMORY_COMPRESSION, 2 MEMOPTIMIZE_WRITE 3 from user_tables where table_name like 'TEST%'; TABLE_NAME INMEMORY INMEMORY_COMPRESS MEMOPTIM -------------------- -------- ----------------- -------- TEST_FAST_INGEST ENABLED FOR QUERY LOW ENABLED SQL> INSERT INTO test_fast_ingest VALUES (1,'test’); SQL> select n.NAME,s.VALUE,s.CON_ID from V$MYSTAT s, V$STATNAME n 2 where s.STATISTIC#=n.STATISTIC# 3 and n.NAME like 'memopt w rows%’; NAME VALUE CON_ID ------------------------------ ---------- ---------- memopt w rows written 1 3 memopt w rows flushed 0 3
  61. LOB • LOB (SecureFilesの暗号化) のサポート Fast Ingest (Memoptimize for Write)

    の機能拡張 Copyright © 2023, Oracle and/or its affiliates 66 SQL> CREATE TABLE test_fast_ingest 2 (id NUMBER PRIMARY KEY, test_col clob) 3 SEGMENT CREATION IMMEDIATE 4 MEMOPTIMIZE FOR WRITE 5 LOB(test_col) STORE AS SECUREFILE( 6 ENABLE STORAGE IN ROW 7 NOCOMPRESS 8 CACHE 9 ENCRYPT USING 'AES256' 9 ); Table created. SQL> select n.NAME,s.VALUE,s.CON_ID from V$MYSTAT s, V$STATNAME n 2 where s.STATISTIC#=n.STATISTIC# 3 and n.NAME like 'memopt w rows%'; NAME VALUE CON_ID ------------------------------ ---------- ---------- memopt w rows written 0 3 memopt w rows flushed 0 3 SQL> INSERT INTO test_fast_ingest VALUES (1,'test'); SQL> select n.NAME,s.VALUE,s.CON_ID from V$MYSTAT s, V$STATNAME n 2 where s.STATISTIC#=n.STATISTIC# 3 and n.NAME like 'memopt w rows%'; NAME VALUE CON_ID ------------------------------ ---------- ---------- memopt w rows written 1 3 memopt w rows flushed 0 3
  62. パーティション化 • パーティション化(インターバル-ハッシュ・パーティション) Fast Ingest (Memoptimize for Write) の機能拡張 Copyright

    © 2023, Oracle and/or its affiliates 67 SQL> CREATE TABLE test_fast_ingest 2 (id NUMBER PRIMARY KEY, create_date DATE, 3 prefecture VARCHAR2(9)) 4 SEGMENT CREATION IMMEDIATE 5 MEMOPTIMIZE FOR WRITE 6 PARTITION BY RANGE (create_date) 7 INTERVAL (NUMTOYMINTERVAL(1,'MONTH')) 8 SUBPARTITION BY HASH(id) SUBPARTITIONS 4 9 (PARTITION part_01 values LESS THAN 10 (TO_DATE(20210101,'YYYYMMDD'))); Table created. SQL> select n.NAME,s.VALUE,s.CON_ID from V$MYSTAT s, V$STATNAME n 2 where s.STATISTIC#=n.STATISTIC# 3 and n.NAME like 'memopt w rows%'; NAME VALUE CON_ID ------------------------------ ---------- ---------- memopt w rows written 0 3 memopt w rows flushed 0 3 SQL> INSERT INTO test_fast_ingest 2 VALUES (1,to_date('20210102','YYYYMMDD'),'test'); SQL> select n.NAME,s.VALUE,s.CON_ID from V$MYSTAT s, V$STATNAME n 2 where s.STATISTIC#=n.STATISTIC# 3 and n.NAME like 'memopt w rows%'; NAME VALUE CON_ID ------------------------------ ---------- ---------- memopt w rows written 1 3 memopt w rows flushed 0 3
  63. まとめ Database In-Memory の技術⾰新 68 Copyright © 2023, Oracle and/or

    its affiliates • Pure In-Memory column format • Scan & Filter on compressed data • Fast joins • Data pruning via storage indexes • SIMD vector processing • In-Memory aggregation 12.1 • Join Groups • In-Memory Expressions • JSON/OSON support • Massive capacity - In-Memory on Exadata flash • Auto population policies • Fast-Start • Active Data Guard 12.2 18c • Automatic In-Memory • In-Memory Dynamic Scans • In-Memory External tables • In-Memory Optimized Arithmetic • Memoptimized Rowstore - Fast Lookup 19c • Performance • External Tables: Hive & HDFS • Memoptimized Rowstore - Fast Ingest 12.2 18c 12.1 19c 23c 21c • Self Managing In-Memory • In-Memory Spatial Analytics • In-Memory Full Text Columns • External Table Enhancements • Hybrid Scans • In-Memory Vectorization - Hash Join • JSON Data Type • Base Level Feature 21c 23c • Auto-Sizing Column Store • Auto-Enabling Features • Hybrid Exadata Scans • RAC support Join Group Aware Hash Join • In-Memory Vectorization - Multi-level Joins and Aggregations • Selective In-Memory Columns • Native In-Memory Advisor • Fast Ingest (Memoptimize for Write) Enhancements