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

[TechNight #50] Oracle Database 21c 新機能解説 第2回 (...

[TechNight #50] Oracle Database 21c 新機能解説 第2回 (前半パート)

Oracle Database 21c 新機能解説
第2回の前半パートでは、下記について解説しています。

1.オブジェクト管理の自動化関連
2.Database In-Memory関連

oracle4engineer

November 26, 2021
Tweet

More Decks by oracle4engineer

Other Decks in Technology

Transcript

  1. Oracle Database Technology Night #50 Oracle Database 21c 新機能解説2 前半

    オブジェクト管理の⾃動化 Oracle Database In-Memory (DBIM) ⽇本オラクル株式会社 データベース・ソリューション部 2021年11⽉25⽇
  2. Copyright © 2021, Oracle and/or its affiliates 2 Oracle Database

    21c オブジェクト管理の⾃動化に関する新機能
  3. 新機能ガイドより • ⾃動索引付けの拡張 • 表単位で⾃動索引を指定できるように • ⾃動索引最適化 • 索引に対しても⾃動データ最適化(ADO)によるセグメント移動や圧縮といった⾃動管理が可能に •

    ⾃動マテリアライズド・ビュー • マテリアライズド・ビューの作成・メンテナンスを⾃動化 • ⾃動SQLチューニング・セット • SQLチューニング・セットの取得を⾃動化 • ⾃動ゾーン・マップ • ゾーン・マップの作成・メンテナンスを⾃動化 • ⾃動⼀時表領域縮⼩ • 肥⼤化した⼀時表領域の縮⼩を⾃動化 • ⾃動UNDO表領域縮⼩ • 肥⼤化したUNDO表領域の縮⼩を⾃動化 オブジェクト管理の⾃動化に関する21c新機能 Copyright © 2021, Oracle and/or its affiliates 4
  4. ⾃動索引とは • 19cからの新機能 • アプリケーション・ワークロードを監視して、⾃動的に索引の作成や削除などの管理を⾏う • 従来⼿作業で実施していた索引の作成・検証・評価・有効化・削除といったプロセスを機械的に反復実施 これまでは⾃動索引付けの対象をスキーマレベルで指定していたが、表レベルで細かく指定(含める・除外する)できる ようになった •

    引き続きスキーマレベルでの指定も可能 • スキーマレベルと表レベルとで設定に差がある場合は表レベルの設定が優先される (スキーマ単位では⾃動索引は無効にするが、特定の表のみで⾃動索引を有効にするケース等) • 設定⽅法(例) ⾃動索引付けの拡張 Copyright © 2021, Oracle and/or its affiliates 5 21c * Autonomous Database, Exadata, ExaCS, ExaCCにて利⽤可能 (2021/10時点) -- 自動索引の有効化 EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','IMPLEMENT’); -- スキーマ単位で無効化を指定 EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_SCHEMA', 'SH', FALSE); EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_SCHEMA', 'HR', FALSE); -- 表単位で有効化を指定 EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_TABLE','SH.PRODUCTS',TRUE);
  5. マテリアライズド・ビュー(MV)とは • クエリの結果セットを事前に保持し、 検索処理時間の短縮を図るスキーマ・オブジェクト これまで⼿動で実施していたワークロードの監視から、MVおよびMVログの作成、 メンテナンスを⾃動で実施できるように • バックグラウンドタスクにより、ワークロードの特性を監視・分析 • SQLのパフォーマンスを向上させる空のMVの候補をInvisibleで作成

    • 実際のクエリを使ってオプティマイザがバックグランドで評価 • ⼤幅な性能向上が⾒込めるマテリアライズド・ビューのみ適⽤ • 最適なリフレッシュ⽅法を⾃動で判断し切り替え アプリケーションのパフォーマンスを透過的に向上 ⾃動マテリアライズド・ビュー 概要 Copyright © 2021, Oracle and/or its affiliates 6 21c マテリアライズド・ビュー Analyse Verify Implement Refresh * Autonomous Database, Exadata, ExaCS, ExaCCにて利⽤可能 (2021/10時点)
  6. DBMS_AUTO_MV.CONFIGURE プロシージャによる各種設定 ⾃動マテリアライズド・ビュー DBMS_AUTO_MVパッケージ Copyright © 2021, Oracle and/or its

    affiliates 7 21c パラメータ名 概要 AUTO_MV_MODE ⾃動マテリアライズド・ビューを使⽤するかどうかを設定 IMPLEMENT : 有効、OFF: 無効 (デフォルト)、REPORT ONLY: レポートのみ AUTO_MV_MAINT_TASK ⾃動マテリアライズド・ビューの⾃動メンテナンス (リフレッシュ、評価、削除)を実⾏するかどうかを指定 ENABLE : 有効、DISABLE : 無効、CLEANUP_AND_DISABLE:全ての⾃動マテリアライズドビューを削除しタスクを無効化 AUTO_MV_SCHEMA スキーマ単位で有効/無効を指定 AUTO_MV_APP_MODULE アプリケーション・モジュール単位で有効/無効を指定 AUTO_MV_RETENTION ⾃動マテリアライズド・ビューの有効期限。⼀定期間利⽤がない場合、⾃動削除。1⽇から373⽇で指定可能(Default : 373⽇) AUTO_MV_ANALYZE_WORKLOAD_MIN_TIME ⾃動マテリアライズド・ビューの作成対象となるクエリの最⼩時間(秒単位)で、これを下回るクエリは、考慮対象外 0から3600までの任意の整数で指定(Default : 120秒) AUTO_MV_ANALYZE_WORKLOAD_WINDOW ⾃動マテリアライズド・ビューを検証する際の最⼤時間(時間単位)。1から8760の任意の整数で指定(Default : 24時間) AUTO_MV_ANALYZE_REPORT_RETENTION AUTO_MV_VERIFY_REPORT_RETENTION AUTO_MV_MAINT_REPORT_RETENTION 各レポートの保持期間。0から90⽇で指定可能(Default : 31⽇) AUTO_MV_DEFAULT_TABLESPACE ⾃動マテリアライズド・ビューが作成される表領域 (Default : NULL) AUTO_MV_TEMP_TABLESPACE ⾃動マテリアライズド・ビューの作成・リフレッシュ時に利⽤する⼀時表領域 (Default : NULL) AUTO_MV_SPACE_BUDGET ⾃動マテリアライズド・ビューが利⽤する領域のサイズ(%) デフォルト表領域を利⽤時のみ
  7. ゾーン・マップとは • データの格納情報をユーザー・オブジェクトとして保持 • 指定されたカラムデータの最⼩値・最⼤値 • 問合せの述語に基づき、処理に不要なデータ・ブロックに対するRead IOを削減(プルーニング) • アプリケーションに透過的に性能向上を実現

    • Exadata Storage Indexに類似 • 索引、パーティション、SmartScan、Storage Indexといった機能と併⽤可能 • パーティション・オプションが必要 これまでは⼿動で対象列を選択し作成していたが、⾃動で作成、メンテナンスできるようになった • デフォルトは無効 • 単⼀の表に対するゾーンマップが対象 • 1時間毎に⾃動バックグラウンドタスクが実⾏される ⾃動ゾーンマップ 概要 Copyright © 2021, Oracle and/or its affiliates 9 21c * Autonomous Database, Exadata, ExaCS, ExaCCにて利⽤可能 (2021/10時点)
  8. SQLチューニング・セット(SQL Tuning Set : STS)とは • SQLの実⾏計画やパフォーマンス・メトリック、その他関連する統計情報を格納するデータベース・オブジェクト • パフォーマンス・チューニング・アドバイザやSPMに対するインプット情報などに利⽤する これまでは⼿動による取得が必要だったが、定期的に⾃動取得できるようになった

    • DBMS_AUTO_TASK_ADMINプロシージャにて、メンテナンス・タスク(Auto STS Capture Task)の有効化、 無効化を設定 • Auto STS Capture Taskは15分ごとに実⾏される • ステータスの確認 • DBA_AUTOTASK_SCHEDULE_CONTROLビュー、もしくはDBA_AUTOTASK_SETTINGSビュー(21c以降)の TASK_NAME列における’Auto STS Capture Task’で確認 • ⾃動索引利⽤時には必須の機能 • デフォルトで有効 • 19c にバックポート済みで、19.7以降で利⽤可能(デフォルト無効) • Autonomous Database(19c)で利⽤可能(デフォルト有効) ⾃動SQLチューニング・セット Copyright © 2021, Oracle and/or its affiliates 12 21c * Tuning Packオプションが必要
  9. ⾃動データ最適化(ADO)とは • 表/表領域単位でポリシーを設定し、データの圧縮レベルの変更を⾃動化する機能 これまで⾃動データ最適化(ADO)は表/表領域単位での指定だったが、索引も指定できるようになった • ADOポリシーを適⽤することで、別の表領域へのセグメントの移動や圧縮、再構築を⾃動化できるように • アプリケーションの性能を維持しつつ、索引によるストレージ領域の消費を抑制可能 索引の⾃動最適化 Copyright

    © 2021, Oracle and/or its affiliates 13 21c *1 : 表データ・索引の利⽤状況(アクセスパターンや頻度)を⾃動追跡する機能 *2 : ヒートマップに基づき、ADOポリシーに従って⾃動で索引をメンテナンスする ヒートマップ(*1)の 有効化 ADOポリシーの 策定 ADOポリシーを 索引に適⽤ ⾃動実⾏(*2) 図︓最⼩限の設定で⾃動的に最適化 * Advanced Compression Optionが必要 (2021/10時点)
  10. UNDO表領域はトランザクションによっては肥⼤化する可能性がある • ⾃動拡張がONの場合、期限切れでない領域は再利⽤せずにデータファイルを拡張する • 通常そこまでの領域は利⽤しないと⾔った場合、その領域は無駄になってしまう • もしくは、 UNDO表領域にサイズ上限を設け、UNDOデータの有効期限を設定(UNDO_RETAINTION) • ⼤規模なトランザクションを実⾏すると、UNDO領域の不⾜によるエラーが⽣じる場合あり

    これまでは肥⼤化したUNDO表領域をリサイズするか再作成していた 期限切れのUNDOデータをバックグランドで⾃動削除し、可能であればデータファイルを⾃動縮⼩するように • UNDO表領域の肥⼤化による領域の無駄を抑制 • より⼤規模なトランザクションを実⾏できる可能性 UNDO表領域の⾃動縮⼩ Copyright © 2021, Oracle and/or its affiliates 15 21c * Enterprise Edition以上で利⽤可能。ただし認定クラウド環境では利⽤不可 (2021/10時点)
  11. ポイントとなる新機能(基本機能) • ⾃動インメモリの拡張 • IM列ストアの格納(ポピュレート、削除、圧縮)が⾃動管理になった • すべてのデータがインメモリ化できない(IMデータを特定できない)システムでも簡単に使⽤できる • インメモリ・ハイブリッド・スキャン •

    ⼀つの表に対するスキャンをIM列ストアと⾏ストアの両⽅にアクセスできる • 表すべてをIM列ストアに格納できない場⾯(頻繁にアクセスしない列を除外できる) • インメモリ外部表の拡張 • インメモリ外部表のパーティション化(ハイブリッド・パーティション化)が可能になった • ⼤規模な外部表を必要とするシステムで⾼速化したい • インメモリ・ディープ・ベクトル化 (インメモリ・ベクター結合) • SIMDベクター命令を使⽤した⾼速IM結合が可能になった • 結合⾏が多い(ブルーム・フィルタであまり削減されない)SQLでも⾼速に処理したい場⾯ Oracle Database 21c における Oracle DBIM強化 Copyright © 2021, Oracle and/or its affiliates. 17
  12. ポイントとなる新機能(新しいデータ型) • インメモリ・フル・テキスト列 • DBIMでTEXT分析がサポートされた • TEXT分析を⾼速に処理するような場⾯ • インメモリのSpatialサポート •

    DBIMで空間分析がサポートされた • 空間分析を⾼速に処理するような場⾯ • JSONデータ型のサポート • JSONのIMフル・テキスト検索 (JSON_TEXTCONTAINS演算⼦) が可能になった • JSONを⾼速に検索処理するような場⾯ Oracle Database 21c における Oracle DBIM強化 Copyright © 2021, Oracle and/or its affiliates. 18
  13. ポイントとなる新機能(有効レベル) • Database In-Memoryベース・レベル (INMEMORY_FORCE=BASE_LEVEL) • DBIMライセンスを購⼊しなくても試すことができるようになった • 事前にDBIMの効果を調べたいような場⾯ •

    CellMemoryレベル(INMEMORY_FORCE=CELLMEMORY_LEVEL) • IM列ストアを有効にしなくてもCellMemory機能が使⽤できるようになった • ExadataでDBIMを使⽤するような場⾯ この機能は19c Release Update (19.8) にもバックポートされている Oracle Database 21c における Oracle DBIM強化 Copyright © 2021, Oracle and/or its affiliates. 19
  14. IM列ストアの格納(ポピュレート、削除、圧縮)が⾃動管理になった メリット • 今までインメモリ化するデータの選択が必要だったが、⾃動インメモリが強化され、 ⾃⼰管理のIM列ストアが可能になりました 機能概要 • 使⽤パターンを追跡し、⾃動的にオブジェクトのポピュレート、退避、列の圧縮 を⾏う(ヒートマップに似ているがONにする必要はない) •

    外部表とハイブリッド・パーティション表はサポートしていない 利⽤イメージ • 初期化パラメータINMEMORY_AUTOMATIC_LEVELをHIGHにすることで、 IM列ストア内のオブジェクトを⾃動的に管理する(PDBレベルで可能) • 表にINMEMORY句を指定する必要はない • ⾃動的に INMEMORY MEMCOMPRESS AUTO に設定される • INMEMORY句が設置されている場合はそれが保持される • NO INMEMORYを⼿動で INMEMORY MEMCOMPRESS AUTO に設定可能 • INMEMORY_AUTOMATIC_LEVEL=HIGHでないとエラー ⾃動インメモリの拡張 Copyright © 2021, Oracle and/or its affiliates. 20 インメモリ列ストア アクティブ・セグメントは⾃動的に 列ストアにポピュレートします ⾮アクティブ・セグメン トは列ストアから削 除されます 利⽤頻度の低い列データは ⾃動的に圧縮されます
  15. 設定 初期化パラメータINMEMORY_AUTOMATIC_LEVEL • OFF(デフォルト) • ⾃動インメモリは無効、12cR2 (12.2.0.1) と同じ動作(ADOインメモリポリシーにて⾃動的なインメモリ化/インメモリ退去が可能) • LOW(18cから)

    • ポピュレートでメモリ不⾜の場合に、IM列ストアからコールドセグメントを削除した上で新規セグメントをポピュレートする(インメモリ PRIORITYがNONEのセグメントのみ⾃動削除の対象となるが、ADOインメモリポリシー条件が有効なセグメントは削除対象外) • MEDIUM(18cから) • LOWの動作に加え、以前にメモリ不⾜でポピュレート未完了だったホットセグメントが先にポピュレートされるよう最適化される • HIGH(21cから) • MEDIUMの動作に加え、INMEMORY句が未設定のセグメントをINMEMORY MEMCOMPRESS AUTOに設定して、コールド 列に対しての圧縮制御(より⾼い圧縮レベルへの変更など)を⾏う • テストでは最初の圧縮レベルが常にQUERY LOWであった PRIORITYがNONE (デフォルト) のセグメントが⾃動メモリ管理の対象になる(NONE以外のセグメントは⾃動削除の対 象外なのでポピュレートする領域を確保できない) • NONE以外 (CRITICAL, HIGH, MEDIUM, LOW) のポピュレートは、オブジェクト・アクセスとは関係ない(優先順位でキューに 格納され、起動後に領域があればNONEより前にポピュレートする) ⾃動インメモリの拡張 Copyright © 2021, Oracle and/or its affiliates. 21
  16. 設定 ⾃動インメモリのチェック間隔の制御 • DBMS_INMEMORY_ADMIN.AIM_SET_PARAMETERプロシージャで使⽤状況統計のチェック間隔を設定する • 統計ウィンドウ(AIM_STATWINDOW_DAYS定数)を7⽇間に設定する場合 (デフォルトは1⽇) • DBMS_INMEMORY_ADMIN.AIM_GET_PARAMETERプロシージャで間隔を確認する ⾃動インメモリの拡張

    Copyright © 2021, Oracle and/or its affiliates. 22 EXEC DBMS_INMEMORY_ADMIN.AIM_SET_PARAMETER(DBMS_INMEMORY_ADMIN.AIM_STATWINDOW_DAYS, 7); SQL> VARIABLE w_interval NUMBER SQL> EXEC DBMS_INMEMORY_ADMIN.AIM_GET_PARAMETER(DBMS_INMEMORY_ADMIN.AIM_STATWINDOW_DAYS, :w_interval); SQL> PRINT w_interval W_INTERVAL ----------------------------- 1
  17. 関連ビュー DBA_INMEMORY_AIMTASKSビュー (⾃動インメモリ・タスクによる決定を追跡) • タスクを作成⽇順に表⽰する DBA_INMEMORY_AIMTASKDETAILSビュー(タスクに関連する詳細) • Task_id=1のタスクに関する詳細を確認する ⾃動インメモリの拡張 Copyright

    © 2021, Oracle and/or its affiliates. 23 SQL> SELECT task_id, TO_CHAR(creation_time,'DD-MON-YY hh24:mi:ss') AS create_time, state FROM DBA_INMEMORY_AIMTASKS ORDER BY create_time; TASK_ID CREATE_TIME STATE ---------- --------------------------- ---------- 1 11-JUN-19 12:11:09 DONE 2 11-JUN-19 12:15:12 DONE 3 11-JUN-19 12:17:12 DONE 4 11-JUN-19 12:19:12 DONE ... SQL> SELECT * FROM DBA_INMEMORY_AIMTASKDETAILS WHERE object_owner = 'SH' and task_id = 1; TASK_ID OBJECT_ OBJECT_NAME SUBOBJECT_NAM ACTION STATE ---------- ------- ------------------ ------------- ------------- –-------- 1 SH CAL_MONTH_SALES_MV EVICT DONE 1 SH CHANNELS EVICT DONE 1 SH COSTS COSTS_Q1_1998 POPULATE SCHEDULED 1 SH COSTS COSTS_Q1_1999 POPULATE SCHEDULED ...
  18. 動作例(INMEMORY_AUTOMATIC_LEVEL=HIGH設定時) ⾃動インメモリの拡張 SQL> SELECT TABLE_NAME, PARTITIONED, INMEMORY, INMEMORY_COMPRESSION INMEMORY_PRIORITY FROM

    DBA_TABLES WHERE TABLE_NAME LIKE‘TAB%’; TABLE_NAME PAR INMEMORY INMEMORY_COMPRESS INMEMORY -------------------------- --- -------- ----------------- -------- TAB1 NO ENABLED FOR QUERY LOW HIGH TAB2 NO DISABLED TAB3 NO DISABLED SQL> ALTER SYSTEM SET INMEMORY_AUTOMATIC_LEVEL = HIGH; System altered. SQL> SELECT TABLE_NAME, PARTITIONED, INMEMORY, INMEMORY_COMPRESSION INMEMORY_PRIORITY FROM DBA_TABLES WHERE TABLE_NAME LIKE 'TAB%'; TABLE_NAME PAR INMEMORY INMEMORY_COMPRESS INMEMORY -------------------------- --- -------- ----------------- -------- TAB1 NO ENABLED FOR QUERY LOW HIGH TAB2 NO ENABLED AUTO TAB3 NO ENABLED AUTO Copyright © 2021, Oracle and/or its affiliates. 24
  19. 動作例(⾃動削除&ポピュレーションの実⾏時) ⾃動インメモリの拡張 Copyright © 2021, Oracle and/or its affiliates. 25

    SQL> select segment_name,partition_name,bytes_not_populated,populate_status from v$im_segments; SEGMENT_NAME PARTITION_NAME BYTES_NOT_POPULATED POPULATE_STAT ------------------------------ ------------------------------ ------------------- ------------- NUM_PART PARTITION03 259031040 OUT OF MEMORY NUM_PART PARTITION02 0 COMPLETED NUM_PART PARTITION01 0 COMPLETED SQL> alter system set INMEMORY_AUTOMATIC_LEVEL=HIGH scope=memory; System altered. SQL> select count(*) from num_part partition(partition04); COUNT(*) ---------- 85196850 SQL> select segment_name,partition_name,bytes_not_populated,populate_status from v$im_segments; SEGMENT_NAME PARTITION_NAME BYTES_NOT_POPULATED POPULATE_STAT ------------------------------ ------------------------------ ------------------- ------------- NUM_PART PARTITION04 0 COMPLETED NUM_PART PARTITION01 0 COMPLETED 3つ⽬のパーティションがメモリ不⾜により 全てインメモリ化できず(4つ⽬以降の パーティションもインメモリ化されない) ⾃動管理を有効にしたところ、メモリ不⾜ とならず既存の(アクセス頻度の低い) パーティションを追い出してインメモリ化
  20. SELECT Invoice FROM Sales WHERE Price > 1000; ⼀つの表に対するスキャンをIM列ストアと⾏ストアの両⽅にできる メリット

    • 今までIMスキャンするには、問合せの列すべてがIM列ストアに格納する 必要があったが、めったにアクセスしない⼤きな列は除外することが可能 になった(例えば、画像、ドキュメントなど) 機能概要 • 問合せを論理的に分割 (IM列ストアに対する部分、⾏ストアに対する 部分) して⾏うことで、インメモリ分析によるコスト効率の⾼いアプローチ を提供する (10倍以上のパフォーマンス向上) • IM列ストアを使⽤した⾼速なスキャン&フィルタ • 述語にはINMEMORY列のみを指定する必要がある • フィルタ後に⾏ストアから必要な列値を取得 利⽤イメージ • IMスキャンで使⽤する述語フィルタの列はIM列ストアに格納し、 頻繁にアクセスしない列 (選択リスト列) は⾏ストアに格納する インメモリ・ハイブリッド・スキャン Copyright © 2021, Oracle and/or its affiliates. 26 ID Item Price Invoice 5 Camera $200 6 Laptop $2000 7 Phone $500 8 LED TV $3000 ⾏ストア (バッファ・キャッシュ) SALES表 ID 5 6 7 8 インメモリ列ストア SALES表 Invoice列を除外 Item Camera Laptop Phone LED TV Price $200 $2000 $500 $3000 1. Priceの列ストアを 使⽤したスキャンとフィルタ <JS ON> 2. Invoiceを ⾏ストアからフェッチ
  21. Min 1 Max 3 Min 4 Max 7 Min 8

    Max 12 Min 13 Max 15 なぜインメモリ・スキャンが⾼速なのか? インメモリ・ハイブリッド・スキャン Copyright © 2021, Oracle and/or its affiliates. 27 C1 C2 C4 C5 C6 C3 ポイント1: 集計に必要なカラムのみアクセス+ 効果的な圧縮技術により圧縮した状 態で検索が可能 (ディクショナリ圧縮) ポイント3: 最新のプロセッサで搭載されている SIMDにより高速スキャン ポイント2: インメモリ・ストレージ索引により 最小限のIMCUのみスキャン 例) where storeid > 8 ベクター・レジスタ 複数の データを ロード 一度の命令で 全ての値を ベクター演算 CPU CA CA CA CA NAME ID AUDI 0 BMW 1 CADILLAC 2 PORSCHE 3 TESLA 4 VW 5 where NAME = ‘BMW’ where NAME = 1 共通ディクショナリ
  22. 実⾏計画 インメモリ・ハイブリッド・スキャンは実⾏計画で確認する • TABLE ACCESS INMEMORY FULL (HYBRID) と出⼒される •

    列col1がIM列ストアに格納されていない場合 インメモリ・ハイブリッド・スキャン Copyright © 2021, Oracle and/or its affiliates. 28 SQL> ALTER TABLE t4 INMEMORY NO INMEMORY (col1); -- 列の除外 SQL> select TABLE_NAME,COLUMN_NAME,INMEMORY_COMPRESSION from V$IM_COLUMN_LEVEL where TABLE_NAME='T4'; TABLE_NAME COLUMN_NAME INMEMORY_COMPRESSION -------------------- -------------------- -------------------------- T4 ID DEFAULT T4 COL1 NO INMEMORY T4 COL2 DEFAULT SQL> SELECT SUM(col1) FROM t4 WHERE id < 1000; ----------------------------------------------------- | Id | Operation | Name | ----------------------------------------------------- | 0 | SELECT STATEMENT | | | 1 | SORT AGGREGATE | | |* 2 | TABLE ACCESS INMEMORY FULL (HYBRID)| T4 | ----------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter("ID"<1000) SQL> SELECT SUM(id) FROM t4 WHERE col1 < 2; ----------------------------------- | Id | Operation | Name | ----------------------------------- | 0 | SELECT STATEMENT | | | 1 | SORT AGGREGATE | | |* 2 | TABLE ACCESS FULL| T4 | ----------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter("COL1"<2)
  23. インメモリ外部表のパーティション化が可能になった メリット • ⾏ストアに格納したくない分析データをパーティション化することができるように なった 機能概要 • パーティション外部表やハイブリッド・パーティション表に対するINMEMORY句 が、表レベルとパーティション・レベルの両⽅でサポートされた •

    IM外部表の問合せには初期化パラメータQUERY_REWRITE_INTEGRITYを stale_toleratedに設定する必要がある (外部表アクセスになる) • インメモリ外部表では以下がサポートされない • column句、distribute句、priority句などの ⼀部のINMEMORY副字句 • 結合グループ(圧縮状態で結合可能) • IM式(計算結果を格納した仮想列) • IM算術最適化(ネイティブ・バイナリのNUMBERデータ) • Active Data GuardインスタンスのDISTRIBUTE ... FOR SERVICE句 インメモリ外部表の拡張 Copyright © 2021, Oracle and/or its affiliates. 29 インメモリ列ストア
  24. 利⽤イメージ • 外部表作成時にINMEMORY句を指定する • 対象セグメントをポピュレートする (19cから全表スキャンで 可能に) • インメモリ外部表を問い合せるセッションでは、 初期化パラメータQUERY_REWRITE_INTEGRITYを

    stale_toleratedに設定する インメモリ外部表の拡張 30 SQL> CREATE TABLE ex_tab1 2 (col1 VARCHAR2(100), col2 VARCHAR2(100)) 3 ORGANIZATION EXTERNAL (中略) -- 通常の外部表定義と同じ 18 INMEMORY; Table created. SQL> SELECT COUNT(*) FROM ex_tab1; -- ポピュレート SQL> SELECT SUM(col1) FROM ex_tab1; Execution Plan ------------------------------------------------------- | Id | Operation | Name | Rows | ------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 1 | SORT AGGREGATE | | 1 | | 2 | EXTERNAL TABLE ACCESS FULL| EX_TAB1 | 1180 | -------------------------------------------------------- SQL> alter session set query_rewrite_integrity=stale_tolerated; Session altered. SQL> SELECT SUM(col1) FROM ex_tab1; Execution Plan ---------------------------------------------------------------- | Id | Operation | Name | Rows | ---------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 1 | SORT AGGREGATE | | 1 | | 2 | EXTERNAL TABLE ACCESS INMEMORY FULL| EX_TAB1 | 1180 | ---------------------------------------------------------------- Copyright © 2021, Oracle and/or its affiliates.
  25. 関連ビュー 次のビューに列 (INMEMORY、INMEMORY_COMPRESSION) が追加され指定内容が確認できる • USER_XTERNAL_PART_TABLES(パーティション化外部表のオブジェクト・レベルの情報) • 表レベルでのINMEMORY句指定(ALL/DBA_XTERNAL_PART_TABLESには含まれない) • INMEMORY列(ENABLED:使⽤可能,

    DISABLED:使⽤禁⽌, NONE:未指定) • INMEMORY_COMPRESSION列(圧縮レベル) • USER/ALL/DBA_XTERNAL_TAB_PARTITIONS(パーティション化外部表のパーティション・レベルの情報) • パーティション・レベルでのINMEMORY句指定(表レベル指定も反映される) • INMEMORY列(ENABLED:使⽤可能, DISABLED:使⽤禁⽌) • INMEMORY_COMPRESSION列(圧縮レベル) インメモリ外部表の拡張 31 SQL> ALTER TABLE ex_tab1 INMEMORY; SQL> select TABLE_NAME, INMEMORY, INMEMORY_COMPRESSION 2 from USER_XTERNAL_PART_TABLES where TABLE_NAME = 'EX_TAB1'; TABLE_NAME INMEMORY INMEMORY_COMPRESS -------------------- -------- ----------------- EX_TAB1 ENABLED FOR QUERY LOW Copyright © 2021, Oracle and/or its affiliates. SQL> select PARTITION_NAME, INMEMORY, INMEMORY_COMPRESSION 2 from USER_XTERNAL_TAB_PARTITIONS where TABLE_NAME = 'EX_TAB1'; PARTITION_NAME INMEMORY INMEMORY_COMPRESS -------------------- -------- ----------------- P1 ENABLED FOR QUERY LOW P2 ENABLED FOR QUERY LOW
  26. SIMDベクター命令を使⽤した⾼速IM結合が可能になった メリット • 今まで結合はスキャンとブルーム・フィルタだけがSIMDベクター命令を使⽤してい たが、ハッシュ結合の⼀致処理もできるようになり、⾼速化できるSQLが増えた (インメモリ結合処理が5〜10倍⾼速化) 機能概要 • インメモリ・ディープ・ベクトル化は複雑なSQL操作を最適化するSIMDベースのフ レームワーク(これを活⽤してハッシュ結合を⾼速化したのがインメモリ・ベクター

    結合) • 1つのSIMDベクター命令で表スキャンと結合⼀致処理を複数⾏で⾏う • 結合処理(Build/Probe)をIM列形式で評価するためにスキャン操作にプッシュ・ダウンする • 次のインメモリ機能の使⽤を妨げるものではない(同時に利⽤できる) • ブルーム・フィルタ、結合グループ、インメモリ列圧縮、 IM動的スキャン (軽量スレッドを使⽤したパラレル・スキャン)、 Aggregationプッシュダウン (集計をプッシュ・ダウンしてスキャン操作でベクトル化) など • 初期化パラメータINMEMORY_DEEP_VECTORIZATIONをFALSEで無効化 できる(デフォルト有効) インメモリ・ディープ・ベクトル化 (インメモリ・ベクター結合) Copyright © 2021, Oracle and/or its affiliates. 32 # SIMD最適化 ブルーム・フィルタ SIMD最適化ハッシュ表 (ベクター処理単位に ロードされたハッシュ表) Build インメモリ列ストア 表スキャンと⼀致処理 をベクター単位で⾏う Probe データのスキャン とフィルタ
  27. ブルーム・フィルタ (ジョイン・フィルタ) とは LINEORDER 例︓ クリスマス・イブの売上合計を集計 DATE_DIM D_date=‘2013-12-24’ Datekey 合計値

    (結合完了後に) ジョイン・フィルタ インメモリ固有の機能ではないが インメモリ・スキャンで⾮常に効果的 Datekey is 20131224 Datekey Amount D_date インメモリ・ディープ・ベクトル化 (インメモリ・ベクター結合) Copyright © 2021, Oracle and/or its affiliates. 33 対象⾏数を結合前 (スキャン時) に削減することで ハッシュ結合処理を⾼速化する 1. ジョイン・フィルタと呼ばれるフィルタを列スキャン を使⽤して作成 Ø DATE_DIM表のD_DATE=‘2013-12-24’ に該当 するDatekey(結合列) をリスト(BitVector) 2. 作成したジョイン・フィルタの条件に合う売上表 のAMOUNTの合計値を計算 Ø ジョイン・フィルタ(BitVector)を追加のフィルタとし てLINEORDER表の列スキャンを⾏う Ø 結合を完了してからAMOUNT列の合計値を算 出 SELECT SUM(amount) FROM lineorder lo ,date_dim d WHERE lo.datekey = d.datekey AND d.d_date='2013-12-24';
  28. 利⽤イメージ インメモリ・ディープ・ベクトル化 (インメモリ・ベクター結合) Copyright © 2021, Oracle and/or its affiliates.

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

    DeepVec Hash Join Flagsはディープ・ベクトル化でどのような最適化を ⾏ったかを⽰す内部統計 確認⽅法(SQL監視) インメモリ・ディープ・ベクトル化 (インメモリ・ベクター結合) Copyright © 2021, Oracle and/or its affiliates. 35
  30. 同様の情報をSQLでも取得可能 • SQL監視の他の表⽰情報も同じように取得可能 確認⽅法(SQLで取得) インメモリ・ディープ・ベクトル化 (インメモリ・ベクター結合) Copyright © 2021, Oracle

    and/or its affiliates. 36 VARIABLE B_SQLID VARCHAR2(13); BEGIN SELECT PREV_SQL_ID INTO :B_SQLID FROM V$SESSION WHERE SID=USERENV('SID'); END; / SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR_XML(sql_id=>:B_SQLID). EXTRACT(q'#//operation[@name='HASH JOIN']/rwsstats/stat[@id='11']#'). GETCLOBVAL(2,2) "DeepVec_Hash_Join" FROM DUAL; DeepVec_Hash_Join -------------------------------------------------- <stat id="11">1</stat>
  31. DBIMでテキスト分析がサポートされた メリット • リレーショナル+テキストの問合せがインメモリのみで実⾏できるようになっ た (3倍⾼速) 機能概要 • テキスト列にインメモリ上のテキスト索引 (転置インデックス:$I表)

    を追加 し、CONTAINS演算⼦ (通常のテキスト検索) を使⽤したテキストの⾼ 速インメモリ検索を可能にする • ディスク上のテキスト索引 (CONTEXT索引) を置き換える • テキスト索引が存在すると索引アクセスになる • MEMCOMPRESS句は無効です • JSONデータ型のJSON_TEXTCONTAINS演算⼦も可能に 利⽤イメージ • テキスト列にINMEMORY TEXT句を設定する • MAX_STRING_SIZE=EXTENDEDが必要 (最⼤32,767バイト) • INMEMORY_VIRTUAL_COLUMNS=ENABLE (明⽰的にINMEMORYを 指定していないユーザ定義の仮想列もポピュレートされる) インメモリ・フル・テキスト列 37 インメモリ列ストア 名前 John Ram Emily Sara テキスト 索引 履歴書 (Text) 「PhD(博士号)」の学位を持ち履歴書に 「database」の記載がある求職者を探す Words .. .. .. .. database .. .. 学位 PhD BS MS MS Copyright © 2021, Oracle and/or its affiliates.
  32. 単語がどの⽂章に出現するかをまとめたマッピング情報 • 従来の索引(Bツリーなど)とは異なり、以下の表と索引 から構成される索引セット (これをドメイン索引という) • $I表 (トークンとその出現位置、出現数などが格納される メインとなる表) •

    $X索引 ($I表のTOKEN_TEXT, TOKEN_FIRST, TOKEN_TYPE列に対する複合Bツリー索引) • $R表 (DOCIDからROWIDへのマッピング表) • $K表 (ROWIDとDOCIDの対応表) • $N表 (⾏が削除された場合、そのDOCIDが格納される) • PARAMETERS句で索引付けプリファレンスを指定する Oracle TextのCONTAINS演算⼦(CONTEXT索引の構造) インメモリ・フル・テキスト列 ▪$X索引 $I表の複合索引 (Bツリー索引) ▪$R表 DOCID è ROWID ▪$K表 ROWID è DOCID ▪$N表 DELETEされた DOCID ▪元表 テキスト列 çè ROWID ▪$I(トークン表) トークン çè DOCID ID TEXT 1 Oracle Database 2 Linux 3 Oracle Text トークン 出現位置 Oracle 1-1 3-1 Database 1-2 Linux 2-1 Text 3-2 Copyright © 2021, Oracle and/or its affiliates. 38 CREATE INDEX … INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS(<プリファレンス>); プリファレンス・クラス 説明 DATASTORE データの格納場所を指定 FILTER プレーン・テキストを抽出する⽅法を指定 SECTION GROUP セクション問合せを使⽤可能にする LEXER テキストの⾔語を指定 STOPLIST 含めない語句 (theなど) を指定 WORDLIST ステミング問合せおよびファジー問合せの拡張⽅法 STORAGE 索引表のstorage句を指定
  33. Oracle TextのCONTAINS演算⼦ Oracle TextのCONTAINS演算⼦を使⽤して単純な語句を問合せることができる • サンプルSQL (求職者テーブルから履歴書テキストに「database」がある「PhD(博⼠号)」の学位を持つものを検索する) • インメモリ・フル・テキスト検索が有効の場合 •

    テキスト列の検索式では、次のCONTAINS検索演算⼦のみがサポートされている • AND (&)、OR (|)、NOT (~)、NEAR (;) • CONTAINS(“履歴書”, ‘database & jave’, 10) > 0 • JSON列の問合せ(JSON_TEXTCONTAINS演算⼦)では、次のCONTAINS検索演算⼦もサポートされている • HASPATH、INPATH インメモリ・フル・テキスト列 Copyright © 2021, Oracle and/or its affiliates. 39 CONTAINS(<IMテキスト列>, <検索式> [,<スコアラベル>]) > 0 ※ 戻り値スコア(全文検索条件が含まれる割合)は0~100の範囲の整数値(0はその行に一致する検索結果がない) ※ <スコアラベル>は、生成されたスコアを識別するために使用する(SELECTリスト、ORDER BY、GROUP BYで SCORE演算子を使用していない場合は不要) SELECT …, SCORE(10) FROM "求職者" WHERE "学位" = 'PhD' AND CONTAINS("履歴書", 'database', 10) > 0 ;
  34. 利⽤イメージ (INMEMORY TEXT句) INMEMORY TEXT句にはテキスト列とそれに対するポリシーを指定する • ポリシー • カスタム索引付けポリシーを指定する(省略するとデフォルト・ポリシーが使⽤される) •

    テキスト内容をどのように解釈するかを指定(プリファレンス・クラスの⼀部) • カスタム索引付けポリシー • CTX_DDL.CREATE_POLICYプロシージャで作成する • filterパラメータとwordlistパラメータはサポートされない • section_groupパラメータはNULL_SECTION_GROUP(デフォルト)またはPATH_SECTION_GROUP(JSON_ENABLEがTRUE)のみサポート • lexerパラメータはBASIC_LEXER(デフォルト)のみサポート(⽇本語対応レクサーは使⽤できない) • BASIC_LEXERは空⽩で区切られた単語を使⽤する⾔語から⽤語を抽出するためのレクサー • ポリシーを変更するには⼀度無効にしてから再び有効にする必要がある インメモリ・フル・テキスト列 Copyright © 2021, Oracle and/or its affiliates. 40 INMEMORY TEXT (<テキスト列> [USING <ポリシー>], …) SQL> ALTER TABLE t3 NO INMEMORY TEXT (col2); SQL> EXEC CTX_DDL.CREATE_POLICY('test_policy', … ); SQL> ALTER TABLE t3 INMEMORY TEXT (col2 USING 'test_policy');
  35. 利⽤イメージ (CONTAINS演算⼦でインメモリ・スキャン) インメモリ・フル・テキスト列 Copyright © 2021, Oracle and/or its affiliates.

    41 SQL> CREATE TABLE t3 (id NUMBER, col1 NUMBER, col2 VARCHAR2(1000)) ; … SQL> ALTER TABLE t3 INMEMORY; SQL> ALTER TABLE t3 INMEMORY TEXT (col2); SQL> SELECT COUNT(*) FROM t3; -- ポピュレート SQL> SELECT column_name, sql_expression FROM v$im_imecol_cu i, dba_objects o WHERE i.objd = o.data_object_id AND o.object_name = 'T3'; COLUMN_NAME SQL_EXPRESSION --------------------------------------------- --------------------------------------------- SYS_IME_IVDX_9F2A608837694FE5BF4C21835934EE49 SYS_CTX_MKIVIDX("COL2" RETURNING RAW(32767)) SQL> SELECT id FROM t3 WHERE CONTAINS(col2, 'Oracle') > 0; --------------------------------------------------- | Id | Operation | Name | Rows | --------------------------------------------------- | 0 | SELECT STATEMENT | | 100 | |* 1 | TABLE ACCESS INMEMORY FULL| T3 | 100 | --------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - inmemory(SYS_CTX_CONTAINS2("COL2" , 'Oracle' , "T3"."SYS_IME_IVDX_9F2A608837694FE5BF4C21835934EE49")>0) filter(SYS_CTX_CONTAINS2("COL2" , 'Oracle' , "T3"."SYS_IME_IVDX_9F2A608837694FE5BF4C21835934EE49")>0) IM仮想列 (テキスト索引)
  36. DBIMで空間分析がサポートされた メリット • 空間索引 (Rツリー索引) を使⽤しない空間問合せが 可能に (最⼤10倍⾼速) • 分析Rツリー索引のメンテナンスは不要

    機能概要 • 空間列に対するインメモリ上のSpatialサマリー仮想列 (ジ オメトリの近似値) を追加し、SDO_FILTER演算⼦ (空間 フィルタ操作) などを使⽤した⾼速インメモリ空間検索を可 能にする • SIMDベクター・スキャンを使⽤して⾼速にフィルタリング • 空間分析のための空間索引の置き換え 利⽤イメージ • 空間列にINMEMORY SPATIAL句を指定する インメモリのSpatialサポート Copyright © 2021, Oracle and/or its affiliates. 42 追加のIM列 インメモリ列ストア 区画 番号 095040390 095040310 095040250 095040260 Spatial Summary Spatial Details ユーティリティ・バルブ はどの区画にありま すか︖ California 区画 アドレス 300 Oracle Pkwy 400 Oracle Pkwy 500 Oracle Pkwy 600 Oracle Pkwy ⽶国の⼟地区画 140ミリオンを検索
  37. 空間演算⼦(⼀部) 説明 SDO_FILTER 2つの空間データの重なりをMBRで簡易判定 (⼀次フィルタ) ⼤量の空間データを絞り込むのに有⽤ SDO_NN 与えた空間データと最も近い空間データの⾏を順に返す SDO_NN_DISTANCE 上記で得られるジオメトリとの距離を返す(SDO_NNと併せて使う補助演算⼦)

    SDO_WITHIN_DISTANCE 2つのジオメトリの距離が指定範囲内かを判定 SDO_JOIN 空間結合⽤の演算⼦ SDO_RELATE 2つのジオメトリの位相関係を判定する汎⽤の演算⼦ この演算⼦ではパラメータで位相関係を与えて判定するが、位相関係ごとの専⽤ 演算⼦SDO_ANNYCONNECT, SDO_CONTAINSなども⽤意されている 空間検索処理と空間索引 (2段階フィルタ処理によるクエリ処理) 空間索引とはRツリーのドメイン索引 • ジオメトリを囲む最⼩の矩形(MBR)をツリー構造で管理 • これによりジオメトリの関係性の判定時に対象を絞り込める • 最⼤4次元まで対応 (デフォルトは2次元) インメモリのSpatialサポート 43 2次元のジオメトリ (空間データ) MBR(最⼩境界矩形) ・MAX(x,y) MIN(x,y)・ 8 9 7 6 5 4 3 2 1 a b c d R S root a b c d ジオメトリへのポイント R S Rツリー root 実体は以下で構成される ・ MDRT_XXXX$ という表 ・ MDRS_XXXX$ というシーケンス (索引内のID採番に使⽤される) 索引名とのマッピングはUSER_SDO_INDEX_METADATAビューで確認可能 Copyright © 2021, Oracle and/or its affiliates. 空間データ 1次 フィルタ 空間データ 2次 フィルタ 空間索引の利⽤ 結果データ コストの⾼い厳密な空間 判定演算の範囲をMBRを ベースとした空間索引で ⾼速に絞り込む CREATE INDEX … (<空間列>) INDEXTYPE IS MDSYS.SPATIAL_INDEX [PARAMETERS(…)]; 1 9
  38. 利⽤イメージ (空間表に対する空間問合せ) • 19cまで(空間索引を作成して検索する) • 21c(INMEMORY SPATIAL句を指定するのみ) • 各次元の最⼤値と最⼩値の仮想列を⾃動的に作成 インメモリのSpatialサポート

    Copyright © 2021, Oracle and/or its affiliates. 44 INSERT INTO user_sdo_geom_metadata … ALTER TABLE cola_markets INMEMORY INMEMORY SPATIAL(shape); SELECT * FROM cola_markets WHERE sdo_filter(shape, :x) = 'TRUE'; CREATE TABLE cola_markets (…, shape SDO_GEOMETRY); … INSERT INTO user_sdo_geom_metadata VALUES ('cola_markets’, 'shap', SDO_DIM_ARRAY( SDO_DIM_ELEMENT('X', 0, 20, 0.005), SDO_DIM_ELEMENT('Y', 0, 20, 0.005)), NULL); -- ジオメトリのメタデータを定義 COMMIT; CREATE INDEX cola_spatial_idx ON cola_markets(shape) INDEXTYPE IS MDSYS.SPATIAL_INDEX; SELECT * FROM cola_markets WHERE sdo_filter(shape, :x) = 'TRUE'; ------------------------------------------------------------ | Id | Operation | Name | ------------------------------------------------------------ | 0 | SELECT STATEMENT | | | 1 | TABLE ACCESS BY INDEX ROWID | COLA_MARKETS | |* 2 | DOMAIN INDEX (SEL: 0.000000 %)| COLA_SPATIAL_IDX | ------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 2 – access("MDSYS"."SDO_FILTER"("C"."SHAPE","MDSYS"."SDO_GEOMETRY"(2003, NULL,NULL,"SDO_ELEM_INFO_ARRAY"(1,1003,3),"SDO_ORDINATE_ARRAY" (4,6,8,8)))='TRUE') 各次元の名前、上限値、 下限値、許容差
  39. 利⽤イメージ (SDO_FILTER演算⼦でインメモリ・スキャン) インメモリのSpatialサポート Copyright © 2021, Oracle and/or its affiliates.

    46 SQL> CREATE TABLE cola_markets (mkt_id NUMBER PRIMARY KEY, name VARCHAR2(32), shape SDO_GEOMETRY); … SQL> INSERT INTO user_sdo_geom_metadata VALUES('cola_markets', 'shape', SDO_DIM_ARRAY(SDO_DIM_ELEMENT('X', 0, 20, 0.005), 2 SDO_DIM_ELEMENT('Y', 0, 20, 0.005)), NULL); SQL> COMMIT; SQL> ALTER TABLE cola_markets INMEMORY; SQL> ALTER TABLE cola_markets INMEMORY SPATIAL(shape); SQL> SELECT COUNT(*) FROM cola_markets; -- ポピュレート SQL> SELECT column_name,sql_expression FROM v$im_imecol_cu i,dba_objects o WHERE i.objd = o.data_object_id AND o.object_name = 'COLA_MARKETS'; COLUMN_NAME SQL_EXPRESSION --------------------------------------------- --------------------------------------------- SYS_IME_SDO_D05103A9F2124F55BF9C3C15A4512E87 SDO_GEOM_MIN_X(SYS_OP_NOEXPAND("SHAPE")) SYS_IME_SDO_6D2C60D2D8644FA8BF3D4E22D76C48E7 SDO_GEOM_MAX_X(SYS_OP_NOEXPAND("SHAPE")) SYS_IME_SDO_BF1884A56A084FF9BF49D38285AD73A3 SDO_GEOM_MIN_Y(SYS_OP_NOEXPAND("SHAPE")) SYS_IME_SDO_B996119FE7284F98BFFB307399EF6AE0 SDO_GEOM_MAX_Y(SYS_OP_NOEXPAND("SHAPE")) SYS_IME_SDO_9B572C8911B64F54BFF5260BF00B7B6E SDO_GEOM_MIN_Z(SYS_OP_NOEXPAND("SHAPE")) SYS_IME_SDO_00A3472BC3454F8DBF911F6AA8333CAF SDO_GEOM_MAX_Z(SYS_OP_NOEXPAND("SHAPE")) IM仮想列 (Spatial)
  40. 利⽤イメージ (SDO_FILTER演算⼦でインメモリ・スキャン) • 問合せウィンドウ(左下の座標が(4,6)、右上の座標が(8,8)の矩形)と相互作⽤するジオメトリを選択する インメモリのSpatialサポート Copyright © 2021, Oracle and/or

    its affiliates. 47 SQL> SELECT c.mkt_id, c.name FROM cola_markets c 2 WHERE SDO_FILTER(c.shape, SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), SDO_ORDINATE_ARRAY(4,6, 8,8))) = 'TRUE’; ----------------------------------------------------------- | Id | Operation | Name | Rows | ----------------------------------------------------------- | 0 | SELECT STATEMENT | | 200 | |* 1 | TABLE ACCESS INMEMORY FULL| COLA_MARKETS | 200 | ----------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("C"."SYS_IME_SDO_6D2C60D2D8644FA8BF3D4E22D76C48E7">=SDO_GEOM_MIN_X("M DSYS"."SDO_GEOMETRY"(2003,NULL,NULL,"SDO_ELEM_INFO_ARRAY"(1,1003,3),"SDO_ORDINATE_A RRAY"(4,6,8,8)))-5.0000000050000005E-003D AND "C"."SYS_IME_SDO_D05103A9F2124F55BF9C3C15A4512E87"<=SDO_GEOM_MAX_X("MDSYS"."SDO_GEO METRY"(2003,NULL,NULL,"SDO_ELEM_INFO_ARRAY"(1,1003,3),"SDO_ORDINATE_ARRAY"(4,6,8,8) ))+5.0000000050000005E-003D AND "C"."SYS_IME_SDO_B996119FE7284F98BFFB307399EF6AE0"> =SDO_GEOM_MIN_Y("MDSYS"."SDO_GEOMETRY"(2003,NULL,NULL,"SDO_ELEM_INFO_ARRAY"(1,1003, 3),"SDO_ORDINATE_ARRAY"(4,6,8,8)))-5.0000000050000005E-003D AND "C"."SYS_IME_SDO_BF1884A56A084FF9BF49D38285AD73A3"<=SDO_GEOM_MAX_Y("MDSYS"."SDO_GEO METRY"(2003,NULL,NULL,"SDO_ELEM_INFO_ARRAY"(1,1003,3),"SDO_ORDINATE_ARRAY"(4,6,8,8) ))+5.0000000050000005E-003D)
  41. JSONのIMフル・テキスト検索が可能になった メリット • JSON検索索引 (実態はテキスト索引) を使⽤しない ⾮定型問合せやフル・テキスト問合せが可能に 機能概要 • 最適化されたバイナリJSON形式(OSON)を⽤いた最⼤8K

    のインラインで格納された新しいJSONデータ型列 • JSONコンテンツへの問合せでは⾃動的にOSON形式が使わ れる (例. movie.nameに“Rogue”を含む映画を検索) • JSONパス式を解析せずに評価でき、SIMD命令処理が可能 (索引を使⽤せずに⾼速検索が可能) • 仮想列や関数ベースの索引に対するIM式 (事前処理結果) もIM列ストアに格納できる • JSONコンテンツへのIM問合せでJSON_TEXTCONTAINS がサポート • JSON_TEXTCONTAINSはTEXTキーワードが必要 • JSON検索索引が存在すると索引アクセスになる JSONデータ型のサポート Copyright © 2021, Oracle and/or its affiliates. 51 リレーショナル インメモリ仮想列 OSON形式 インメモリ列ストア { "Theater":"AMC 15", "Movie":”Rogue One", "Time“:2017-01-09 18:45", "Tickets":{ "Adults":2 } } Relational Virtual JSON
  42. データ型の⽐較 VARCHAR2、CLOB、BLOBデータ型 • 最⼤32,767バイトのJSONドキュメント全体を仮想列と してOSON形式でポピュレート可能 • JSONパス式を解析せずに評価でき、SIMD処理が可能 • "IS JSON"チェック制約が該当カラムに必要

    • MAX_STRING_SIZE=EXTENDEDが必要 • インメモリ問合せはJSON_TABLE, JSON_QUERY, JSON_VALUE, JSON_EXISTSをサポート • 仮想列や関数ベースの索引に対するIM式 (事前処理 結果) もIM列ストアに格納できる • INMEMORY_VIRTUAL_COLUMNS=ENABLE (明⽰的に INMEMORYを指定していない仮想列もポピュレートされる) • JSON_TEXTCONTAINSはJSON検索索引がないと 使⽤できない JSONデータ型 • 最⼤8Kバイトのインライン格納されたOSON形式をそ のままIM列ストアにポピュレートされる • SIMD命令で⾼速問合せ可能 (インラインLOBでないと IM列ストアに格納されない) • MAX_STRING_SIZEや"IS JSON" 制約が不要 • 最⼤32,767バイトのJSONドキュメント全体を仮想列 のOSON形式でもポピュレート可能 • MAX_STRING_SIZE=EXTENDEDが必要 • これまでの関数以外に、JSON_TEXTCONTAINSを 使⽤したフル・テキスト検索をサポート (インメモリ・フル・ テキスト列を使⽤) • MAX_STRING_SIZE=EXTENDEDが必要 JSONデータ型のサポート Copyright © 2021, Oracle and/or its affiliates. 52
  43. • VARCHAR2データ型(IM仮想列でのフィルタ) SQL> CREATE TABLE t1 (id NUMBER, col1 NUMBER,

    col2 VARCHAR2(2000) 2 CHECK (col2 IS JSON)) ; … SQL> SELECT column_name, sql_expression FROM v$im_imecol_cu i, dba_objects o 2 WHERE i.objd = o.data_object_id AND o.object_name = 'T1'; COLUMN_NAME SQL_EXPRESSION --------------------------------------------- ------------------------------- SYS_IME_OSON_95A9B02CBCB64F3FBFDE8DD6E79B7309 OSON("COL2" FORMAT JSON , 'ime' RETURNING RAW(32767) NULL ON ERROR) SQL> SELECT col2 FROM t1 WHERE JSON_VALUE(col2, …) = 1600; --------------------------------------------------- | Id | Operation | Name | Rows | --------------------------------------------------- | 0 | SELECT STATEMENT | | 20 | |* 1 | TABLE ACCESS INMEMORY FULL| T1 | 20 | --------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - inmemory(JSON_VALUE("COL2" FORMAT JSON , '$.PONumber' RETURNING NUMBER NULL ON ERROR , "T1". "SYS_IME_OSON_95A9B02CBCB64F3FBFDE8DD6E79B7309")=1600) filter(JSON_VALUE("COL2" FORMAT JSON , '$.PONumber' RETURNING NUMBER NULL ON ERROR , "T1". "SYS_IME_OSON_95A9B02CBCB64F3FBFDE8DD6E79B7309")=1600) 利⽤イメージ(JSONデータの問合せ) パス式”PONumber”が1600のものを選択する • JSONデータ型(IM列でのフィルタ) • JSONデータからパス式“PONumber”が1600のものを選択 JSONデータ型のサポート Copyright © 2021, Oracle and/or its affiliates. 54 SQL> CREATE TABLE t2 (id NUMBER, col1 NUMBER, col2 JSON) ; … SQL> SELECT col2 FROM t2 2 WHERE JSON_VALUE(col2,'$.PONumber' RETURNING NUMBER) = 1600; --------------------------------------------------- | Id | Operation | Name | Rows | --------------------------------------------------- | 0 | SELECT STATEMENT | | 20 | |* 1 | TABLE ACCESS INMEMORY FULL| T2 | 20 | ---------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - inmemory(JSON_VALUE("COL2" /*+ LOB_BY_VALUE */ FORMAT OSON , '$.PONumber' RETURNING NUMBER NULL ON ERROR)=1600) filter(JSON_VALUE("COL2" /*+ LOB_BY_VALUE */ FORMAT OSON , '$.PONumber' RETURNING NUMBER NULL ON ERROR)=1600)
  44. パス式”LineItem.Part.Description”に‘Magic’が含まれる発注書を検索する SQL> CREATE TABLE t2 (id NUMBER, col1 NUMBER, col2

    JSON) ; … SQL> ALTER TABLE t2 INMEMORY; SQL> ALTER TABLE t2 INMEMORY TEXT (col2); SQL> SELECT COUNT(*) FROM t2; -- ポピュレート SQL> SELECT column_name, sql_expression FROM v$im_imecol_cu i, dba_objects o WHERE i.objd = o.data_object_id AND o.object_name = 'T2'; COLUMN_NAME SQL_EXPRESSION --------------------------------------------- ------------------------------------------------------------------- SYS_IME_OSON_0C5E4CB28BF04FCEBFCADB991EF4A9C7 OSON("COL2" FORMAT OSON , 'ime' RETURNING RAW(32767) NULL ON ERROR) <- OSONデータ SYS_IME_IVDX_5E57CC8A68684FE7BF86B26C9C507A13 SYS_CTX_MKIVIDX(“COL2” RETURNING RAW(32767)) <- テキスト索引 SQL> SELECT col2 FROM t2 WHERE JSON_TEXTCONTAINS(col2, '$.LineItems.Part.Description', 'Magic'); --------------------------------------------------- | Id | Operation | Name | Rows | --------------------------------------------------- | 0 | SELECT STATEMENT | | 100 | |* 1 | TABLE ACCESS INMEMORY FULL| T2 | 100 | --------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - inmemory(SYS_CTX_CONTAINS2("T2"."COL2" /*+ LOB_BY_VALUE */ , '(Magic) INPATH (/LineItems/Part/Description)' , "T2"."SYS_IME_IVDX_5E57CC8A68684FE7BF86B26C9C507A13")>0) filter(SYS_CTX_CONTAINS2("T2"."COL2" /*+ LOB_BY_VALUE */ , '(Magic) INPATH (/LineItems/Part/Description)' , "T2"."SYS_IME_IVDX_5E57CC8A68684FE7BF86B26C9C507A13")>0) 利⽤イメージ(フル・テキスト検索) JSONデータ型のサポート Copyright © 2021, Oracle and/or its affiliates. 55
  45. DBIMライセンスを購⼊しなくても試すことができるようになった(19c RU(19.8) にもバックポート) メリット • DBIMライセンスを購⼊しなくてもDBIMの価値を確認できるよう になった 機能概要/利⽤イメージ • 初期化パラメータINMEMORY_FORCEをBASE_LEVELにす

    ることで、インメモリ機能を以下の範囲で試すことができる • INMEMORY_SIZEが16GB以内 (1インスタンスあたり、CDBレベル で設定する必要がある)、QUERY LOWの圧縮レベル • 以下は利⽤できない • ⾃動インメモリ、列の除外(表の全ての列がポピュレートされる)、 CELLMEMORY • Authorized Cloud Environments (認定クラウド環境) では 利⽤できない Database In-Memoryベース・レベル Copyright © 2021, Oracle and/or its affiliates. 57 System Global Area (SGA) Large Pool Log Buffer Shared Pool In-Memory Area (Max 16GB) Other Buffer Cache
  46. IM列ストアを有効にしなくてもCellMemoryが使⽤できるようになった(19c RU(19.8) にもバックポート) メリット • オーバーヘッドを発⽣させることなくCellMemory機能を使⽤できるようになった 機能概要/利⽤イメージ • インメモリ列ストアを有効にすることなくCellMemory機能を利⽤可能に (すべてのDBIMデータ型がExadata

    Flash Cache上で利⽤可能に) • INMEMORY_FORCE=CELLMEMORY_LEVEL • INMEMORY_SIZE=0 • 0より⼤きいとINMEMORY_FORCE=DEFAULと同じ動作になる • オンプレミスExadataシステムのみ有効 • Smart Scan時にFlash Cache上にDBIM形式でポピュレートする CellMemoryレベル Copyright © 2021, Oracle and/or its affiliates. 58 In-Memory Columnar scans In-Flash Columnar scans Up to 25.6 TB Flash per Server
  47. 次のインメモリ機能はOracle Database Enterprise Editionで利⽤可能に変更された (Non-Exadataでも利⽤可能に) • ⾃動インメモリ • インメモリ外部表 •

    Memoptimized Rowstore ライセンスの変更 Copyright © 2021, Oracle and/or its affiliates. 59 18c 19c 21c EE EE-ES DBCS EE-EP ExaCS /CC EE EE-ES DBCS EE-EP ExaCS /CC EE EE-ES DBCS EE-EP ExaCS /CC ⾃動インメモリ N Y Y Y Y Y Y Y Y Y Y Y インメモリ外部表 N Y N Y N Y N Y Y Y Y Y Memoptimized Rowstore N Y N Y N Y N Y Y Y Y Y EE︓Oracle Database Enterprise Edition EE-ES︓Engineered Systems (Oracle Database Appliance以外) DBCS EE-EP︓DBCS EE-Extreme Performance ExaCS/CS︓Exadata CS/CC