ここでは、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チューニング方法まとめ」で詳しく解説していますので、ぜひ参考にしてください。