Photo credit: Håkan Dahlström via Visual hunt / CC BY
Oracleにおいて、あるテーブルからスナップショット(マテリアライズドビュー)を取得しようとした際、2箇所から高速リフレッシュ(差分リフレッシュ)を実行することができるかということを疑問に思った。
高速リフレッシュは、マテビュー取得元テーブルの脇にログテーブルを用意しておき、元テーブルに更新がかかればログテーブルに発行されたSQLを蓄積、高速リフレッシュ時にそのSQLをマテビュー側に流し込んで更新・レプリケーションするというもの。
スナップショット(マテビュー)の実験
同一テーブルに対して複数のマテビューが存在する場合、それぞれのマテビューは正しく更新できるのか?ログテーブルは一つと思われるのに、リフレッシュタイミングが違うそれぞれのマテビューが正常に機能するのか?
色々調べてみると、マテビュー単位にログテーブルが存在し、それぞれのマテビューが自身専用のログテーブルを見に行くようになっている。
実際、ログテーブルは複数存在しているように見えた(Osqleditで見た場合)。
但し、ObjectBrowserではログテーブルは1つしか見えない。アプリケーションの仕様の問題だろうか。ということで、複数のマテリアライズドビューから同一テーブルに対し、違うタイミングで高速リフレッシュしても問題なくレプリケーションができるということがわかった。
ただ、あまりにマテリアライズドビューを増やすと、取得先のマテビューがどこまで更新しているのかを計算しながらそれぞれのログテーブルを更新しなければならないようになると思われるし、管理がややこしくなるため、あまり数を増やさない方が良いと思われる。
コメント