Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Standard Edition 2でも使えるOracle Database 12c Release 2オススメ新機能

10,488 views

Published on

JPOUG in 15 minutes #2の発表資料です。

Published in: Internet
  • Be the first to comment

Standard Edition 2でも使えるOracle Database 12c Release 2オススメ新機能

  1. 1. 1 Standard Edition 2でも使える Oracle Database 12c Release 2 オススメ新機能 2016年11月17日 Japan Oracle User Group 渡部 亮太
  2. 2. 2 自己紹介+所属会社紹介 渡部 亮太(わたべ りょうた) – 著書「プロとしてのOracleアーキテクチャ入門 [第2版]」 「プロとしてのOracle運用管理入門」 – 講演実績多数 – ブログ「コーソルDatabaseエンジニアのBlog」 http://cosol.jp/techdb/ – JPOUG 共同創設者、ボードメンバー – Oracle ACE 株式会社コーソル – 「CO-Solutions=共に解決する」の理念のもと、Oracle技術に特化 した事業を展開中。心あるサービスの提供とデータベースエンジニア の育成に注力している – 社員数: 131名 (2016年11月時点) – ORACLE MASTER Platinum 11g 取得者数 45名 ORACLE MASTER Platinum 12c 取得者数 32名 取得者数 日本 No.1 (日本オラクル様Webページより) http://www.oracle.com/jp/education/omdata-171891-ja.html
  3. 3. 3 今日の発表について • リリースとともに華々しく宣伝される新機能の大部分は 大抵有償オプションがないと使用できない・・・ とお感じの皆様! 12.2新機能には、Standard Edition 2でも使用できるも のがちゃんとありますよ! というお話です。 • オンプレミス版Oracle Database 12c Release 2のリ リース前であるため、機能を使用可能なライセンス (Edition/Option/Pack)に認識違いがある可能性がありま す。リリース後に、ご自身でチェックいただけますよう お願いいたします。 • 今日の内容が、皆さんの今後のご提案のお役にたてば、 また、現場での会話のネタになれば、嬉しいです 
  4. 4. 4 [参考] 2016年11月時点の12c R2リリース状況 • Oracle Cloudにリリース – オンプレミス版(ダウンロード版)は未リリース • 英語版マニュアルは公開済 http://docs.oracle.com/database/122/nav/portal_booklist.htm – 日本語版マニュアルは未公開
  5. 5. 5 今回ご紹介する12.2新機能 • Long Identifiers • UNIFORM_LOG_TIMESTAMP_FORMAT • Handling Data Errors with SQL • Approximate Query Processing • ON STATEMENT Refresh for Materialized Views • Real-time Materialized Views • Data-Bound Collation • SQL*Plus Command History • SQL*Plus CSV Output
  6. 6. 6 Long Identifiers
  7. 7. 7 Long Identifiers オブジェクト名の長さ制限を大幅に緩和 • 長い日本語のオブジェクト名が使いやすく version 最大サイズ 最大文字数 (日本語、UTF-8換算) 12.1以前 30バイト 10文字 12.2 128バイト 42文字 SQL> CREATE TABLE T_店別月次商品売上実績 ( store_id number, month date, amount number); CREATE TABLE T_店別月次商品売上実績 ( store_id number, month date, amount number) * 行1でエラーが発生しました。: ORA-00972: 識別子が長すぎます。 12.1 SQL> CREATE TABLE T_店別月次商品売上実績 ( store_id number, month date, amount number); 表が作成されました。 12.2 ※:DBキャラクタセットAL32UTF8で検証
  8. 8. 8 UNIFORM_LOG_ TIMESTAMP_FORMAT
  9. 9. 9 UNIFORM_LOG_TIMESTAMP_FORMAT ログファイルのタイムスタンプ フォーマットを変更する 初期化パラメータ • YYYY-MM-DDThh:mm:ss.??????TZ形式 • デフォルトでtrue!なことに注意 • 影響するログファイル – テキスト形式のアラートログ / トレースファイル – リスナーログの扱いについては調査中 2016-11-07T10:15:27.142353+09:00 Starting ORACLE instance (normal) (OS id: 6640) 2016-11-07T10:15:27.148320+09:00 CLI notifier numLatches:3 maxDescs:519 alert_XXX.log (UNIFORM_LOG_TIMESTAMP_FORMAT=true)
  10. 10. 10 Handling Data Errors with SQL
  11. 11. 11 Handling Data Errors with SQL データ型の変換処理におけるエラーに対応するためのSQL 機能強化 • 変換NGな異常データは通常ごく一部、一部の異常データ のために変換処理全体がロールバックされるのは非効率 • 外部データ(他DB、非構造化データ)を取り込むケースが増加 → 変換エラー発生は避けがたい → 効率的な対処が必要 # 狙い SQL機能強化 1 変換NGな一部データを、 デフォルト値に一律変換する TO_<データ型>ファンクションに デフォルト値を設定可能に 2 変換NGな一部データを、 変換実行前に特定可能に VALIDATE_CONVERSION(<データ> AS <データ型>)ファンクションで変換 OK or NGを判定可能に [参考] DMLエラーロギング (従来機能) • 変換NGな一部データをスキップして、変換OKなデータのみを処理 • 変換NGな一部データはエラーロギング表に記録
  12. 12. 12 TO_<データ型>ファンクションのデフォルト値 id amount (varchar2型) 1 100 2 200 3 XXX 4 400 SQL> INSERT INTO cnv_dst (SELECT id, TO_NUMBER(amount) FROM cnv_src); INSERT INTO cnv_dst (SELECT id, TO_NUMBER(amount) FROM cnv_src) * 行1でエラーが発生しました。: ORA-01722: 数値が無効です。 SQL> INSERT INTO cnv_dst (SELECT id, TO_NUMBER(amount DEFAULT 999 ON CONVERSION ERROR) FROM cnv_src); 4行が作成されました。 id amount (number型) id amount (varchar2型) 1 100 2 200 3 XXX 4 400 id amount (number型) 1 100 2 200 3 999 4 400 変換OKデータを含め 全データ変換されず 変換NGデータは デフォルト値に変換
  13. 13. 13 VALIDATE_CONVERSIONファンクション VALIDATE_CONVERSION(<データ> AS <データ型>) – 変換OK → 戻り値 1 – 変換NG → 戻り値 0 使用例 : 変換処理の事前チェック id amount (varchar2型) 1 100 2 200 3 XXX 4 400 SQL> SELECT id, amount FROM cnv_src 2 WHERE VALIDATE_CONVERSION(amount AS NUMBER) = 0; ID AMOUNT ---------- -------------------- 3 XXX id amount (number型) 変換NGデータを特定
  14. 14. 14 アイディア:外部表を用いたデータロードに活用 • データロードに伴う型変換を含むデータ処理をSQLで – 外部表のORACLE_LOADERアクセスドライバを用いて型変換を実行 しない – 外部表のDDL(≒SQL*Loaderの制御ファイル文法)をシンプルに id amount (number型) id amount (VARCHAR2型) 外部表 表(データロード先) CREATE TABLE "TBL_EXT2" ( "ID" VARCHAR2(255), "AMOUNT" VARCHAR2(255) ) ORGANIZATION external ( … < SQL*Loaderの制御ファ イル文法> … ); INSERT INTO tbl_to SELECT id, TO_NUMBER(amount DEFAULT 0 ON CONVERSION ERROR), FROM TBL_EXT2; フラットファ イルなど 型変換
  15. 15. 15 Approximate Query Processing
  16. 16. 16 Approximate Query Processing • 12.1.0.2で導入されたApproximate Query Processing (近似値を高速に返すSQL処理)を強化 1. Approx系ファンクションの追加 2. 非Approx系ファンクションをApprox処理に自動的に置 換するパラメータの追加 version ファンクション 相当する機能 12.1.0.2 APPROX_COUNT_DISTINCT() COUNT(DISTINCT <列>) 12.2 APPROX_FOR_PERCENTILE() PERCENTILE_CONT() PERCENTILE_DISC() 初期化パラメータ 置換処理 APPROX_FOR_COUNT_DISTINCT COUNT(DISTINCT <列>) → APPROX_COUNT_DISTINCT() APPROX_FOR_PERCENTILE PERCENTILE_CONT() PERCENTILE_DISC() → APPROX_FOR_PERCENTILE()
  17. 17. 17 Approximate Query Processing 3. MVIEWを用いたApprox処理の高速化向け機能拡張 y m d name1 2016 1 1 xx1 2016 1 1 xx2 2016 1 2 xx1 2016 1 2 xx3 2016 1 2 xx2 2016 1 3 xx1 2016 1 3 xx4 2016 1 3 xx1 2016 1 4 xx5 2016 1 4 xx6 y m d apx1 2016 1 1 (BLOB) 2016 1 2 (BLOB) 2016 1 3 (BLOB) 2016 1 4 (BLOB) CREATE MATERIALIZED VIEW mv0_ymd AS SELECT y, m, d, APPROX_COUNT_DISTINCT_DETAIL(name1) apx1 FROM tbl0 GROUP BY y, m, d; SELECT y, m, d, TO_APPROX_COUNT_DISTINCT(apx1) FROM mv0_ymd; MVIEWとして事前 計算し独自BLOB形 式で保持 y m d cnt 2016 1 1 2 2016 1 2 3 2016 1 3 2 2016 1 4 2 SELECT y, m, d, APPROX_COUNT_DISTINCT(name1) cnt FROM tbl0 GROUP BY y, m, d; 問合せ結果 MVIEW 元データの表 元データの表に直接APPROX_COUNT_DISTINCT を実行するのと同等
  18. 18. 18 Approximate Query Processing y m d name1 2016 1 1 xx1 2016 1 1 xx2 2016 1 2 xx1 2016 1 2 xx3 2016 1 2 xx2 2016 1 3 xx1 2016 1 3 xx4 2016 1 3 xx1 2016 1 4 xx5 2016 1 4 xx6 y m d apx1 y m cnt y m d cnt y cnt y m apx1 y apx1 CREATE MATERIALIZED VIEW mv0_ym SELECT y, m, APPROX_COUNT_DISTINCT_AGG(apx1) apx1 FROM mv0_ymd GROUP BY y, m; SELECT y, m, d, TO_APPROX_COUNT_DISTINCT(apx1) FROM mv0_ymd; 元データの表 SELECT y, TO_APPROX_COUNT_DISTINCT(apx1) FROM mv0_y; CREATE MATERIALIZED VIEW mv0_y SELECT y, APPROX_COUNT_DISTINCT_AGG(apx1) apx1 FROM mv0_ym GROUP BY y, m; SELECT y, m, TO_APPROX_COUNT_DISTINCT(apx1) FROM mv0_ym; MVIEW問合せ結果 CREATE MATERIALIZED VIEW mv0_ymd AS SELECT y, m, d, APPROX_COUNT_DISTINCT_DETAIL(name1) apx1 FROM tbl0 GROUP BY y, m, d;
  19. 19. 19 ON STATEMENT Refresh for Materialized Views
  20. 20. 20 ON STATEMENT Refresh for Mviews コミットを待たずにDML実行でMVIEWをリフレッシュ • マスタ表へDMLを実行すると、背後でMVIEWも更新され ているイメージ マスタ表 MVIEW マスタ表 MVIEW ON COMMIT Refresh ON STATEMENT Refresh UPDATE INSERT COMMIT UPDATE INSERT COMMITUPD+INS分 を反映 COMMIT COMMIT UPD分を反映 INS分を反映
  21. 21. 21 ON STATEMENT Refreshとトランザクション MVIEW更新も含めて同一のトランザクションにカプセル化 されているイメージ • マスタ表の更新をrollbackすると、MVIEWの更新も rollbackされる • マスタ表の更新をcommitする前に、他セッションが MVIEWを参照しても、更新前のデータのまま (Read Committed分離性) – マスタ表の更新するセッションがMVIEWを参照すると、更新さ れたデータが得られる
  22. 22. 22 ON STATEMENT Refreshの制約 意外と制約が多いことに注意 • MVIEWは高速リフレッシュできる必要がある • MVIEWを定義するSELECT文にファクト表のrowidを含 める必要がある • 併用できない機能がいくつか: 非可視列、ANSIジョイン、 (MVIEWの観点からみて)複雑なクエリ、インライン ビュー、複合主キー、LONG型、LOB型 • ディメンション表を更新すると、ステータスがunusable い • などなど
  23. 23. 23 ON STATEMENT Refreshを利用すべき状況 • ON COMMIT高速リフレッシュにおけるMVIEWログのメ ンテナス負荷が問題になる場合 マスタ表 MVIEW ON COMMIT高速リフレッシュの内部動作 UPDATE INSERT COMMIT MVIEWログから 更新内容を特定し反映 COMMIT MVIEWログ 更新を記録 更新を記録 • マスタ表の更新中に、そのセッションで更新された MVIEWを参照したい場合
  24. 24. 24 Real-time Materialized Views
  25. 25. 25 Real-time Materialized Views MVの新鮮さとリフレッシュ負荷のトレードオフ問題を解決 • MVIEWのデータを最新にするには、 MVIEWの頻繁なリフレッシュが必要 → 負荷の増加 モード 動作概要 MVデータの 新鮮さ マスタ表 更新頻発時の リフレッシュ負荷 ON COMMIT マスタ表への更新コミット時 に毎回リフレッシュ ◎ × 更新都度リフレッシュ するため ON DEMAND 自動リフレッシュなし 適宜手動でリフレッシュ × リフレッシュ しないと古いまま ◎ 定期リフ レッシュ ジョブで定期的にリフレッ シュ ? リフレッシュ 頻度に依存 △ある程度新しいが最新 ではない マスタ表 MVIEW 既存リレッシュ機能の整理 更新 リフレッシュ
  26. 26. 26 Real-time Materialized Viewsの概念 MVをリフレッシュしなくても、最新のデータが得られる • MVの古いデータ+MVログ → 最新データ マスタ表 MVIEW MVIEWログ マスタ表への 更新内容 古いデータ データの 乖離 参照 最新のデータ 最新のデータ 参照時にリフレッシュ相当の負荷が発生するが、 更新頻度>>参照頻度であれば、トータルの負荷は 軽減できると想定 更新
  27. 27. 27 Real-time Materialized Viewsの使用方法 Real-time Materialized Viewsの構成 • ENABLE ON QUERY COMPUTATION句を指定してMVIEW を作成 • マスタ表にMVIEWログが必要 • 定期リフレッシュと組み合わせで使用するのがオススメ Real-time Materialized Viewsから最新データを得る a. クエリリライト(要EE)を有効にして、マスタ表に問合せ b. /*+ FRESH_MV */ヒントを指定して、MVIEWに直接問合 せを発行
  28. 28. 28 Data-Bound Collation
  29. 29. 29 Data-Bound Collation データベース側でCollationを設定可能に • Collation(照合) ≒ 文字列のソート・文字の等価規則 • 以下の設定が必要なことに注意 – MAX_STRING_SIZE=EXTENDED、COMPATIBILITY>=12.2 • MAX_STRING_SIZE=EXTENDEDは文字列データの最大長を32Kバ イトまで拡張する12.1新パラメータ version 設定方法 設定単位・影響範囲 12.1以前 NLS_SORT 初期化パラメータ セッション(ALTER SESSION) インスタンス(ALTER SYSTEM) 12.2 各種DDLの COLLATION / COLLATE句 カラム テーブル スキーマ 他 動的・ ユーザー側 静的・ データベース側
  30. 30. 30 Data-Bound Collation id str ・・・ A ・・・ a ・・・ A ・・・ 12.1 NLS_COMP=LINGUISTIC NLS_SORT=JAPANESE_M_CI a → a → A → A → b → b → B → B 12.2 Data-Bound Collation NLS_COMP=BINARY NLS_SORT=BINARY A → B → a → b → A → B → a → b SELECT ... ORDER BY ... SELECT ... ORDER BY ... NLS_COMP=<XXX> NLS_SORT=<XXX> a → a → A → A → b → b → B → B SELECT ... ORDER BY ... CREATE TABLE tab1( str VARCHAR2(10) COLLATE JAPANESE_M_CI); ユーザー側で動的に Collationを指定 データベース側で静的に Collationを指定 原則無視される (無視しない設定も可能ではある) id str ・・・ A ・・・ a ・・・ A ・・・
  31. 31. 31 SQL*Plus Command History
  32. 32. 32 SQL*Plus Command History DBA待望!のコマンド履歴機能 • readlineライブラリによる実装で ないのが残念… → 今後もrlwrapのお世話になりそう… • とはいえ、ツール追加ができない カスタマ環境では助かる – 事前にset hist onを実行する必要が ある点に注意! SQL> set hist on SQL> select * from dual; D - X SQL> show user USER is "SYS" SQL> hist 1 select * from dual; 2 show user SQL> hist 1 run D - X
  33. 33. 33 SQL*Plus CSV Output
  34. 34. 34 SQL*Plus CSV Output 問合せ結果をCSV形式で出力 • 診断情報、統計情報をExcelなどで分析するときに便利 SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'; SQL> SELECT * FROM t_csv1; N S D ---------- ---------------------------------------- ------------------- 1 string1 2016-01-01 01:00:00 2 string2 2016-01-01 02:00:00 SQL> set markup csv on delimiter , quote on SQL> SELECT * FROM t_csv1; "N","S","D" 1,"string1","2016-01-01 01:00:00" 2,"string2","2016-01-01 02:00:00"
  35. 35. 35 SQL*Plus CSV Output CSV特有の処理も実装済み! SQL> set markup csv on delimiter , quote on SQL> SELECT * FROM t_csv2; "N","S" 1,"aaa""aaa" 2,"A B" 3,"_______(略 - とても長い文字列)______" ①非数値データのみをクォート ②文字列データ中の"を""として出力 (ダブルクオート文字のエスケープ) ③文字列データ中の改行文字を改行とし て出力 SQL> set colsep ',' SQL> SELECT * FROM t_csv2; N,S ----------,---------------------------------------- 1,aaa"aaa 2,A ,B 3,________________________________________ (略) ,_______________________________________ [参考] 従来の方法(苦肉の策だった…)では上記処理は実現できない ④表示幅(linesize)を超える文字列でも データ途中で改行しない ③ ① ② ④

×