OracleとEBSとSiebelと駄文と。

Oracle製品ファンとして、見たこと聞いたこと調べたことを綴っています。

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データとして保持されるのは次の情報です。
・INSERT文
INSERTされるROWID情報(INSERT INTO ... SELECT文の場合は、SELECT結果行数だけが該当する)。
・UPDATE文
変更される前の列値(変更される列数に依存)。
・DELETE文
削除されるレコード全体の情報(列値を含む)。

http://jibun.atmarkit.co.jp/lskill01/rensai/sdba17/sdba01.html

だそう。insertの場合ROWID=1レコードあたり10byte?100万件でも1MBいかない計算になっちゃいます。…いや実際これだけじゃなくて、insertだったっていう情報とか、UNDO領域のUNDO情報とかあるのでもっと必要だろうとおもいます。でもこの程度でパンクするシステムってどーなの。

実プロジェクトでは?

1処理ごと計算するんじゃなくて、実際処理してどのくらい必要かをみます。参考:http://ameblo.jp/archive-redo-blog/entry-10042115948.html
個人的にはOracle DB自身がもつ自動管理機能に任せとけばイージャナイ!と思うのです。