UNDO領域に必要な容量
仕事で「100万件insertしたらUNDO領域がパンクするか」を考える機会があったのでメモ。
そもそも、UNDO領域とは?
Oracleでは、データベースに対して行われた変更を無効にするための情報が維持されます。この種の情報はトランザクションのアクションのレコードで構成され、総称的にUNDOと呼ばれます。総称的にUNDOと呼ばれます。UNDOは次の目的で使用されます。
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19215-02/logical.htm#1097861
若干わかりにくいんですが・・・データを変更したときに、変更前のデータをとっとくための領域。と理解しました。
どんな情報が記録されるのか?
@ITの記事によると
DMLに該当する文の中で、UNDOデータとして保持されるのは次の情報です。
http://jibun.atmarkit.co.jp/lskill01/rensai/sdba17/sdba01.html
・INSERT文
INSERTされるROWID情報(INSERT INTO ... SELECT文の場合は、SELECT結果行数だけが該当する)。
・UPDATE文
変更される前の列値(変更される列数に依存)。
・DELETE文
削除されるレコード全体の情報(列値を含む)。
だそう。insertの場合ROWID=1レコードあたり10byte?100万件でも1MBいかない計算になっちゃいます。…いや実際これだけじゃなくて、insertだったっていう情報とか、UNDO領域のUNDO情報とかあるのでもっと必要だろうとおもいます。でもこの程度でパンクするシステムってどーなの。
実プロジェクトでは?
1処理ごと計算するんじゃなくて、実際処理してどのくらい必要かをみます。参考:http://ameblo.jp/archive-redo-blog/entry-10042115948.html
個人的にはOracle DB自身がもつ自動管理機能に任せとけばイージャナイ!と思うのです。