マテリアライズドビューのリフレッシュ時にSELECTするとどうなるか。

ここでは、ORACLEのマテリアライズドビューのリフレッシュを行っているときに、そのマテリアライズドビューに対しSELECT文を実行するとどうなるか紹介します。

結論:エラーにならない

マテリアライズドビューのリフレッシュには、いくつかのオプションがありますが、デフォルトでは、DELETE-INSERTで別のトランザクションとして実行されます

イメージ的には、DELETE-INSERTが正常に完了すると、コミットされデータが反映されるイメージです。

つまり、リフレッシュ実行中にSELECT文で実行されても、エラーにはなりません。参照できるデータは今現在マテリアライズドビューに存在するデータで、変更中のデータが参照されることはありません。

注意が必要

ただし、リフレッシュにはオプションがあり、truncate-insertにすることもできます。この場合は、先ほどとは違って、truncateが実行されている間にデータを参照するとデータが0件で表示されます。

DBMS_MVIEWでrefreshプロシージャでatomic_refreshというオプションで指定されます。これがTUREの場合は、DELETE-INSERT、FALSEの場合は、truncate-insertとなります。マテビューのリフレッシュが気になる際は、ぜひご確認ください。

ちなみに、マテビューのチューニングでお悩みの方は「マテリアライズドビューが遅いときの原因とチューニング方法」をご覧ください。

最後に

最後までお読みいただきありがとうございます。

SQLのチューニングについては、「SELECT文のSQLチューニング方法まとめ」で詳しく解説していますので、ぜひ参考にしてください。