今回はOracleの読取り一貫性について調査しました。
読取り一貫性とは、特定のトランザクションがSELECT文(データ読込み)を開始した時点で確定しているデータを読み込ませる機能です。
いったんOracleのSELECT文(データ読込み)の動きを復習します。
SELECT中に別トランザクションでデータ更新された場合、このUNDOセグメントのデータを使用して、読取り一貫性を実現しています。
では、SELECT中にUNDOセグメントがいっぱいになって読込み開始時点のデータが上書きされてしまった場合、どうなってしまうのでしょうか?
結論から言うと「ORA-01555: スナップショットが古すぎます」が発生します。
読込み開始時点のUNDOデータが上書きされて、読取り一貫性を実現できなくなってしまったためです。
■参考資料
ORACLE MASTER Silver[Silver DBA11g](試験番号:1Z0-052)完全詳解+精選問題集
■おわりに
個人の感想ですが、データベースの運用担当をしていた頃は「ORA-01555」のエラーをよく見ました。
UNDO_RETENTION値を増やせばその分「ORA-01555」エラーが減るケースが多いと思いますが、UNDO表領域が物理的にサイズ不足になると今度は「ORA-30036: string(UNDO表領域'string'内)でセグメントを拡張できません」エラーが発生してしまいます。