goo blog サービス終了のお知らせ 

へたれエンジニア日記(旧跡地)

こちらへ引っ越しました。http://d.hatena.ne.jp/toritori0318/

マテリアライズドビュー

2006-03-26 11:15:12 | ORACLE・MSDE・Postgres
今やってる業務で、初めてマテリアライズドビューを触りました。

要は、レプリケーションでリンクを張ったマテリアライズドビューに対し、
画面からリフレッシュ指示してサーバ間の同期を取るような
アプリケーションを作成したわけです。

マテリアライズドビューって
実体を持ったビュー
くらいの意識しか持っていなかったので、
最初は何でこんな事するのかなぁ?
って感じで作ってました。

…が、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
「ちょっとこのリアライズさぁ…」
って会話で言ってみてぇ!

■マー
既に何がなんだか


最新の画像もっと見る

2 コメント

コメント日が  古い順  |   新しい順
略すなら・・・ (おらおらごくう)
2006-03-29 00:16:34
マテリアビュー ←FFみたいだ



マテドビュー  ←少しいやらしい(w



マラビュー   ←もっとやらしい感じ(w



マラドビュー  ←かなりいやらしい。



巨人のエースピッチャーPMに怒られそうです・・・。

返信する
Unknown (toritori)
2006-04-01 00:26:57


それあえて書かなかったのにw



もう、タカったらいけない子!

返信する