OceanBaseデータベースでは、ユーザーテーブルの各パーティションにおいてデータを管理する基本単位はSSTableです。MemTableのサイズが特定のしきい値に達すると、OceanBaseデータベースはMemTableをフリーズし、そのデータをディスクに転送します。この転送後の構造は、Mini SSTableまたはMinor SSTableと呼ばれます。クラスタでグローバルマージが発生すると、各ユーザーテーブルパーティションのすべてのMinor SSTableは、マージのスナップショットポイントに基づいてMajor Compactionに参加し、最終的にMajor SSTableが生成されます。各SSTableの構成方法は似ており、自身のメタデータ情報と一連のデータマクロブロックで構成されています。各データマクロブロック内部はさらに複数のマイクロブロックに分割でき、ユーザーテーブルのスキーマ定義に応じて、マイクロブロックはプラン方式またはエンコード方式でデータ行を組織することが選択できます。
マクロブロック
OceanBaseデータベースは、ディスクを2MBの固定長データブロックに分割し、これをマクロブロック(Macro Block)と呼びます。マクロブロックはデータファイル書き込みI/Oの基本単位であり、各SSTableは複数のマクロブロックで構成されています。マクロブロックの2MBという固定サイズは変更できず、その後のダンプ、マージでのマクロブロックの再利用、およびレプリケーション移行などのタスクもすべてマクロブロックを最小粒度として行われます。
マイクロブロック
マクロブロック内部では、データは約16KBの可変長データブロックに組織され、これをマイクロブロック(Micro Block)と呼びます。マイクロブロックには複数のデータ行(Row)が含まれており、マイクロブロックはデータファイル読み取りI/Oの最小単位です。各データマイクロブロックは作成時にユーザーが指定した圧縮アルゴリズムで圧縮されるため、マクロブロックに格納されているのは実際には圧縮済みのデータマイクロブロックです。データマイクロブロックがディスクから読み取られると、バックグラウンドで解凍され、解凍後のデータはデータブロックキャッシュに格納されます。各データマイクロブロックのサイズはユーザーがテーブル作成時に指定でき、デフォルトは16KBです。ユーザーはステートメントでマイクロブロックの長さを指定できますが、マクロブロックのサイズを超えることはできません。ステートメントは以下のとおりです。
ALTER TABLE mytest SET block_size = 131072;一般的に、マイクロブロックの長さが長いほどデータの圧縮率は高くなりますが、それに伴い1回のI/O読み取りのコストも高くなります。マイクロブロックの長さが短いほど、データの圧縮率は相対的に低下しますが、それに伴い1回のランダムI/O読み取りのコストは低くなります。また、ユーザーテーブルのスキーマによっては、各マイクロブロックは作成時にプラン方式(Flat)またはエンコード方式(Encoding)で別々に構築される場合があります。現在のバージョンでは、エンコード方式でマイクロブロックを組織することを指定できるのはベースラインデータのみであり、ダンプデータはすべてデフォルトでプラン方式でデータが組織されます。