ablog

不器用で落着きのない技術者のメモ

Oracleのデータブロックの空き領域管理

「Oracle脱ビギナー宣言 第3回 Oracleの動作に欠かせない領域の数々」のまとめ - ablog の補足。
自動セグメント領域管理(ASSM)にしてPCTFREEだけ適切に設定すればよいみたいだけど、ASSM以前からの経緯をまとめてみる(かなり仮説)。

  • ASSMが登場する以前は、PCTFREE、PCTUSED、INITRANS、MAXTRANS、FREELISTSを設定する必要があった。
  • PCTFREE(デフォルト10)
    • insertの際にブロックを全部使わない。
    • PCTFREEで指定された分ゆとりをもつ。
    • updateの際にサイズが大きくなって行移行するのを防ぐため。
  • PCTUSED(デフォルト40)
    • 「100 - PCTFREE」分の領域が使用されたブロックは使用済みとされ、データは追加されない。
    • 使用済みになったブロックのデータが削除され、PCTUSED分の空きができると再利用される。
    • PCTUSED分の空きができるまでブロックを再利用しないことで、行連鎖を防ぐ。
  • INITRANS(デフォルト 表:1、索引:2)
    • トランザクションエントリ(ITL)を格納するブロック。
    • ITLはマルチバージョン管理に使用されているらしい。
    • ITLがあるブロックはデータが変更されているから、UNDO表領域からCRブロックを読んで読取一貫性制御を行っているんじゃないかと思う。
  • MAXTRANS(デフォルト255)
    • ブロックに空きがあればMAXTRANS(255)まで使うことができる。
    • PCTFREEを設定しているので基本的に空きはあるはず。
    • 10g以降は255以外に変更不可。
  • FREELISTS
    • どのブロックが空いているか管理しているリスト。
    • 同時に参照できない。
    • 増やしすぎるとメモリ消費量が増えるので、増やせばよいというものでもなくチューニングが面倒。
    • そこで登場したのが自動セグメント領域管理(ASSM)。
  • 自動セグメント領域管理(ASSM)
    • ブロック単位で使用率をビットマップで管理するしくみ。
    • FREELISTS のようにリスト全体をロックする必要がなく、ブロック単位でロックすれば良い。
    • たぶん、FREELISTSは表ロック、ASSMは行ロックみたいなイメージ。並行処理ができるようになった。
    • ASSMの場合、PCTUSEDを設定する必要がないらしいが、じゃあどうやって再利用するかどうか判断するんだろう?