今やってる業務で、初めてマテリアライズドビューを触りました。
要は、レプリケーションでリンクを張ったマテリアライズドビューに対し、
画面からリフレッシュ指示してサーバ間の同期を取るような
アプリケーションを作成したわけです。
マテリアライズドビューって
「実体を持ったビュー」
くらいの意識しか持っていなかったので、
最初は何でこんな事するのかなぁ?
って感じで作ってました。
…が、PMの以下の言葉で解決。
「マテリアライズドビューって、スナップショットのシノニムなんですよ」
ガーン
そうだったのか!
(たしかに、マニュアルにも記述されてました)
教本(黒本)にはそんなこと一言も書いてなかったけどorz
もやもやしてた所が、なんとなくわかった気がしました。
また、今回のアプリとは関係ないのですが
勉強したときに何か納得行っていなかった
クエリーリライト
についても調べてみました。
クエリーリライトの定義ですが
アプリケーションのSELECT文を内部的に書き換えて
マテリアライズドビューへの問い合わせに置き換える機能
とあります。
例えば、次のマテリアライズドビューを作成します。
create materialized view mv_toritori enable query rewrite
as
SELECT
年月,
sum(おこずかい) 月毎のおこずかい,
avg(おこずかい) 1日のおこずかい平均値
FROM おこずかい帳
GROUP BY 年月;
で、次の問い合わせをすると
オラクルが勝手にmv_toritoriを経由したSQL文に置き換えてくれるというわけです。
SELECT
年月,
sum(おこずかい) 月毎のおこずかい,
avg(おこずかい) 1日のおこずかい平均値
FROM おこずかい帳
GROUP BY 年月;
上記のSQLにWHERE文を加えても、リライトしてくれるようです。
さらに、
SELECT
substr(年月,1,4) 年,
sum(おこずかい) 年毎のおこずかい
FROM おこずかい帳
GROUP BY substr(年月,1,4);
のように、マテリアライズドビューの結果を元に表示できるSQL文の場合でも
きちんとリライトしてくれるらしい!!
カシコイ!!
(*注意 今回のSQL文に限っては、検証までしておりません。机上の空論です)
表の結合やUNIONなど、
どこまでのSQL文でリライトしてくれるかはわかりませんが
ものによってはパフォーマンスの向上にかなり貢献しそうです。
ちなみに、SQL文がリライトされているかどうかは
実行計画を見る方法もありますが、
パッケージを使う方法もあります。
■手順
①DBMS_MVIEW.EXPLAIN_REWRITE( SQL文 );を実行
②rewrite_tableをSELECTして結果を表示
さらに10gであれば
REWRITE_OR_ERRORヒント文でリライトしないとエラーにできますし、
DBMS_ADVISOR.TUNE_MVIEWプロシージャで
「どうして高速リフレッシュ・クエリーリライトができないか」
という問題まで解決してくれるらしいです。
いやー勉強になりました。
ところで今回気づいたのですが、
会話の中で
マテリアライズドビュー
ってすごい言いづらいんですけど…
というわけで、略称を考えてみました。
■マテビュー
スタンダードな感じ?
■リアライズ
なんかかっこいいw
「ちょっとこのリアライズさぁ…」
って会話で言ってみてぇ!
■マー
既に何がなんだか
要は、レプリケーションでリンクを張ったマテリアライズドビューに対し、
画面からリフレッシュ指示してサーバ間の同期を取るような
アプリケーションを作成したわけです。
マテリアライズドビューって
「実体を持ったビュー」
くらいの意識しか持っていなかったので、
最初は何でこんな事するのかなぁ?
って感じで作ってました。
…が、PMの以下の言葉で解決。
「マテリアライズドビューって、スナップショットのシノニムなんですよ」
ガーン
そうだったのか!
(たしかに、マニュアルにも記述されてました)
教本(黒本)にはそんなこと一言も書いてなかったけどorz
もやもやしてた所が、なんとなくわかった気がしました。
また、今回のアプリとは関係ないのですが
勉強したときに何か納得行っていなかった
クエリーリライト
についても調べてみました。
クエリーリライトの定義ですが
アプリケーションのSELECT文を内部的に書き換えて
マテリアライズドビューへの問い合わせに置き換える機能
とあります。
例えば、次のマテリアライズドビューを作成します。
create materialized view mv_toritori enable query rewrite
as
SELECT
年月,
sum(おこずかい) 月毎のおこずかい,
avg(おこずかい) 1日のおこずかい平均値
FROM おこずかい帳
GROUP BY 年月;
で、次の問い合わせをすると
オラクルが勝手にmv_toritoriを経由したSQL文に置き換えてくれるというわけです。
SELECT
年月,
sum(おこずかい) 月毎のおこずかい,
avg(おこずかい) 1日のおこずかい平均値
FROM おこずかい帳
GROUP BY 年月;
上記のSQLにWHERE文を加えても、リライトしてくれるようです。
さらに、
SELECT
substr(年月,1,4) 年,
sum(おこずかい) 年毎のおこずかい
FROM おこずかい帳
GROUP BY substr(年月,1,4);
のように、マテリアライズドビューの結果を元に表示できるSQL文の場合でも
きちんとリライトしてくれるらしい!!
カシコイ!!
(*注意 今回のSQL文に限っては、検証までしておりません。机上の空論です)
表の結合やUNIONなど、
どこまでのSQL文でリライトしてくれるかはわかりませんが
ものによってはパフォーマンスの向上にかなり貢献しそうです。
ちなみに、SQL文がリライトされているかどうかは
実行計画を見る方法もありますが、
パッケージを使う方法もあります。
■手順
①DBMS_MVIEW.EXPLAIN_REWRITE( SQL文 );を実行
②rewrite_tableをSELECTして結果を表示
さらに10gであれば
REWRITE_OR_ERRORヒント文でリライトしないとエラーにできますし、
DBMS_ADVISOR.TUNE_MVIEWプロシージャで
「どうして高速リフレッシュ・クエリーリライトができないか」
という問題まで解決してくれるらしいです。
いやー勉強になりました。
ところで今回気づいたのですが、
会話の中で
マテリアライズドビュー
ってすごい言いづらいんですけど…
というわけで、略称を考えてみました。
■マテビュー
スタンダードな感じ?
■リアライズ
なんかかっこいいw
「ちょっとこのリアライズさぁ…」
って会話で言ってみてぇ!
■マー
既に何がなんだか
マテドビュー ←少しいやらしい(w
マラビュー ←もっとやらしい感じ(w
マラドビュー ←かなりいやらしい。
巨人のエースピッチャーPMに怒られそうです・・・。
それあえて書かなかったのにw
もう、タカったらいけない子!