RDBデータ圧縮におけるメタデータの保存場所

IT Leaders 2009年11月号の特集「Oracle 11gR2 その実力を解剖する」のPart01で、データ圧縮について「Oracle では圧縮データの展開に必要なメタデータをブロック内に配置している(ので高速)。他のDBは一般的に圧縮メタデータをブロック外に持ち追加I/Oが発生する(ので低速化の可能性あり)」という意味の記述がありました。SQL Server のデータ圧縮は同一ページ内にメタデータを置くような記憶があるので違和感を感じ、ここで言う「他のDB」は何を指しているのか気になったので調べてみました。


まず、SQL Server 2008 ではどうでしょう。
http://technet.microsoft.com/ja-jp/library/cc280464.aspx
プレフィックスの圧縮では

各列のプレフィックス値を表す行が作成され、ページ ヘッダーの直後にある圧縮情報 (CI) 構造体に格納されます。

ディクショナリの圧縮では

ページ上の任意の場所で繰り返される値を検索し、それらの値を CI 領域に格納します。

ということで、ページヘッダー直後のCI領域、すなわち同一ページ内(同一I/O単位内)に配置しているようです。追加I/Oは発生しません。


DB2はどうでしょう。
http://www-06.ibm.com/jp/domino01/mkt/dminfo.nsf/doc/004D44E6
の、「データ圧縮.pdf」の33ページの表で、辞書の持ち方の説明

各々の表が各々の辞書を持つ

1つの表スペースに1つの辞書

ということで、ブロック外に所持しているようです。こちらの方が圧縮効率は高いですが追加I/Oが発生します。※メタデータをメモリに張り付かせて参照の効率化を図っている可能性がありますが、そのあたりの仕組みは分かりません。


MySQLInnoDB Plugin はどうでしょう。
http://www.innodb.com/doc/innodb_plugin-1.0/innodb-compression.html#innodb-compression-internals-algorithms

The algorithm is “lossless”, so that the original uncompressed data can always be reconstructed from the compressed form.

「可逆」の圧縮形式ということなので、別途のメタデータは必要ありません。同一I/O単位にふくまれており追加I/Oは発生しません。

素晴らしい日本語記事があったのでリンクしておきます。
http://d.hatena.ne.jp/sh2/20090628
http://d.hatena.ne.jp/sh2/20090705


以上のように、Oracle以外のデータベースが一般的に「圧縮メタデータをブロック外に持ち追加I/Oが発生する」わけではありません。記事ではきっとDB2を指しているのでしょう。


メモとして Oracle ホワイトペーパー「Oracle Advanced Compression」のリンクしておきます。
http://otndnld.oracle.co.jp/products/database/oracle11g/pdf/ACO_11gR1_twp_V2.pdf