35
1 Standard Edition 2でも使える Oracle Database 12c Release 2 オススメ新機能 2016年11月17日 Japan Oracle User Group 渡部 亮太

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

Embed Size (px)

Citation preview

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

1

Standard Edition 2でも使えるOracle Database 12c Release 2

オススメ新機能

2016年11月17日 Japan Oracle User Group 渡部 亮太

Page 2: Standard Edition 2でも使えるOracle Database 12c Release 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

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

3

今日の発表について

• リリースとともに華々しく宣伝される新機能の大部分は 大抵有償オプションがないと使用できない・・・ とお感じの皆様! 12.2新機能には、Standard Edition 2でも使用できるものがちゃんとありますよ! というお話です。

• オンプレミス版Oracle Database 12c Release 2のリリース前であるため、機能を使用可能なライセンス(Edition/Option/Pack)に認識違いがある可能性があります。リリース後に、ご自身でチェックいただけますようお願いいたします。

• 今日の内容が、皆さんの今後のご提案のお役にたてば、

また、現場での会話のネタになれば、嬉しいです

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

4

[参考] 2016年11月時点の12c R2リリース状況

• Oracle Cloudにリリース

– オンプレミス版(ダウンロード版)は未リリース

• 英語版マニュアルは公開済 http://docs.oracle.com/database/122/nav/portal_booklist.htm

– 日本語版マニュアルは未公開

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

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

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

6

Long Identifiers

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

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で検証

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

8

UNIFORM_LOG_ TIMESTAMP_FORMAT

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

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)

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

10

Handling Data Errors with SQL

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

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な一部データはエラーロギング表に記録

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

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データは デフォルト値に変換

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

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データを特定

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

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;

フラットファイルなど

型変換

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

15

Approximate Query Processing

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

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()

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

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 を実行するのと同等

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

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;

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

19

ON STATEMENT Refresh for Materialized Views

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

20

ON STATEMENT Refresh for Mviews

コミットを待たずにDML実行でMVIEWをリフレッシュ

• マスタ表へDMLを実行すると、背後でMVIEWも更新されているイメージ

マスタ表 MVIEW マスタ表 MVIEW

ON COMMIT Refresh ON STATEMENT Refresh

UPDATE

INSERT

COMMIT

UPDATE

INSERT

COMMIT UPD+INS分 を反映

COMMIT

COMMIT

UPD分を反映

INS分を反映

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

21

ON STATEMENT Refreshとトランザクション

MVIEW更新も含めて同一のトランザクションにカプセル化されているイメージ

• マスタ表の更新をrollbackすると、MVIEWの更新もrollbackされる

• マスタ表の更新をcommitする前に、他セッションがMVIEWを参照しても、更新前のデータのまま (Read Committed分離性)

– マスタ表の更新するセッションがMVIEWを参照すると、更新されたデータが得られる

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

22

ON STATEMENT Refreshの制約

意外と制約が多いことに注意

• MVIEWは高速リフレッシュできる必要がある

• MVIEWを定義するSELECT文にファクト表のrowidを含める必要がある

• 併用できない機能がいくつか: 非可視列、ANSIジョイン、(MVIEWの観点からみて)複雑なクエリ、インラインビュー、複合主キー、LONG型、LOB型

• ディメンション表を更新すると、ステータスがunusableい

• などなど

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

23

ON STATEMENT Refreshを利用すべき状況

• ON COMMIT高速リフレッシュにおけるMVIEWログのメンテナス負荷が問題になる場合

マスタ表 MVIEW

ON COMMIT高速リフレッシュの内部動作

UPDATE

INSERT

COMMIT MVIEWログから

更新内容を特定し反映

COMMIT

MVIEWログ

更新を記録

更新を記録

• マスタ表の更新中に、そのセッションで更新されたMVIEWを参照したい場合

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

24

Real-time Materialized Views

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

25

Real-time Materialized Views

MVの新鮮さとリフレッシュ負荷のトレードオフ問題を解決

• MVIEWのデータを最新にするには、 MVIEWの頻繁なリフレッシュが必要 → 負荷の増加

モード 動作概要 MVデータの 新鮮さ

マスタ表 更新頻発時のリフレッシュ負荷

ON COMMIT

マスタ表への更新コミット時に毎回リフレッシュ

◎ × 更新都度リフレッシュ

するため

ON DEMAND

自動リフレッシュなし 適宜手動でリフレッシュ

× リフレッシュ

しないと古いまま ◎

定期リフレッシュ

ジョブで定期的にリフレッシュ

? リフレッシュ頻度に依存

△ある程度新しいが最新

ではない

マスタ表 MVIEW

既存リレッシュ機能の整理

更新 リフレッシュ

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

26

Real-time Materialized Viewsの概念

MVをリフレッシュしなくても、最新のデータが得られる

• MVの古いデータ+MVログ → 最新データ

マスタ表 MVIEW

MVIEWログ

マスタ表への更新内容

古いデータ

データの 乖離

参照

最新のデータ

最新のデータ

参照時にリフレッシュ相当の負荷が発生するが、 更新頻度>>参照頻度であれば、トータルの負荷は 軽減できると想定

更新

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

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に直接問合せを発行

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

28

Data-Bound Collation

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

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句

カラム テーブル スキーマ 他

動的・ ユーザー側

静的・ データベース側

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

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 ・・・

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

31

SQL*Plus Command History

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

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

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

33

SQL*Plus CSV Output

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

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"

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

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)を超える文字列でもデータ途中で改行しない

① ②