1
Standard Edition 2でも使えるOracle Database 12c Release 2
オススメ新機能
2016年11月17日 Japan Oracle User Group 渡部 亮太
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
今日の発表について
• リリースとともに華々しく宣伝される新機能の大部分は 大抵有償オプションがないと使用できない・・・ とお感じの皆様! 12.2新機能には、Standard Edition 2でも使用できるものがちゃんとありますよ! というお話です。
• オンプレミス版Oracle Database 12c Release 2のリリース前であるため、機能を使用可能なライセンス(Edition/Option/Pack)に認識違いがある可能性があります。リリース後に、ご自身でチェックいただけますようお願いいたします。
• 今日の内容が、皆さんの今後のご提案のお役にたてば、
また、現場での会話のネタになれば、嬉しいです
4
[参考] 2016年11月時点の12c R2リリース状況
• Oracle Cloudにリリース
– オンプレミス版(ダウンロード版)は未リリース
• 英語版マニュアルは公開済 http://docs.oracle.com/database/122/nav/portal_booklist.htm
– 日本語版マニュアルは未公開
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
Long Identifiers
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
UNIFORM_LOG_ TIMESTAMP_FORMAT
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
Handling Data Errors with SQL
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
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
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
アイディア:外部表を用いたデータロードに活用
• データロードに伴う型変換を含むデータ処理を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
Approximate Query Processing
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
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
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
ON STATEMENT Refresh for Materialized Views
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分を反映
21
ON STATEMENT Refreshとトランザクション
MVIEW更新も含めて同一のトランザクションにカプセル化されているイメージ
• マスタ表の更新をrollbackすると、MVIEWの更新もrollbackされる
• マスタ表の更新をcommitする前に、他セッションがMVIEWを参照しても、更新前のデータのまま (Read Committed分離性)
– マスタ表の更新するセッションがMVIEWを参照すると、更新されたデータが得られる
22
ON STATEMENT Refreshの制約
意外と制約が多いことに注意
• MVIEWは高速リフレッシュできる必要がある
• MVIEWを定義するSELECT文にファクト表のrowidを含める必要がある
• 併用できない機能がいくつか: 非可視列、ANSIジョイン、(MVIEWの観点からみて)複雑なクエリ、インラインビュー、複合主キー、LONG型、LOB型
• ディメンション表を更新すると、ステータスがunusableい
• などなど
23
ON STATEMENT Refreshを利用すべき状況
• ON COMMIT高速リフレッシュにおけるMVIEWログのメンテナス負荷が問題になる場合
マスタ表 MVIEW
ON COMMIT高速リフレッシュの内部動作
UPDATE
INSERT
COMMIT MVIEWログから
更新内容を特定し反映
COMMIT
MVIEWログ
更新を記録
更新を記録
• マスタ表の更新中に、そのセッションで更新されたMVIEWを参照したい場合
24
Real-time Materialized Views
25
Real-time Materialized Views
MVの新鮮さとリフレッシュ負荷のトレードオフ問題を解決
• MVIEWのデータを最新にするには、 MVIEWの頻繁なリフレッシュが必要 → 負荷の増加
モード 動作概要 MVデータの 新鮮さ
マスタ表 更新頻発時のリフレッシュ負荷
ON COMMIT
マスタ表への更新コミット時に毎回リフレッシュ
◎ × 更新都度リフレッシュ
するため
ON DEMAND
自動リフレッシュなし 適宜手動でリフレッシュ
× リフレッシュ
しないと古いまま ◎
定期リフレッシュ
ジョブで定期的にリフレッシュ
? リフレッシュ頻度に依存
△ある程度新しいが最新
ではない
マスタ表 MVIEW
既存リレッシュ機能の整理
更新 リフレッシュ
26
Real-time Materialized Viewsの概念
MVをリフレッシュしなくても、最新のデータが得られる
• MVの古いデータ+MVログ → 最新データ
マスタ表 MVIEW
MVIEWログ
マスタ表への更新内容
古いデータ
データの 乖離
参照
最新のデータ
最新のデータ
参照時にリフレッシュ相当の負荷が発生するが、 更新頻度>>参照頻度であれば、トータルの負荷は 軽減できると想定
更新
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
Data-Bound Collation
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
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
SQL*Plus Command History
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
SQL*Plus CSV Output
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
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)を超える文字列でもデータ途中で改行しない
③
① ②
④
Top Related