OceanBaseデータベースでは、マクロブロックを使用してデータを格納します。各テーブルには複数のマクロブロックが含まれる場合があり、各マクロブロックは2MBのスペースを占有します。マクロブロック内には1つまたは複数のマイクロブロックが含まれ、各マイクロブロックには1行または複数行のデータが含まれます。
テーブルの編成形式
OceanBaseデータベースは、インデックス組織テーブルとヒープ組織テーブルの2種類のテーブル編成形式をサポートしています。
インデックス組織テーブル
インデックス組織テーブルでは、データは主キーに従って格納およびソートされます。テーブルに1行のデータを挿入する際、そのデータは主キーの順序でテーブルに挿入されます。この構造では、データとインデックスが一体化しており、主キーはクラスタインデックスとなります。主キーには追加のスペースオーバーヘッドがなく、データへのアクセスもより効率的です。
各行に保存される列の順序は同じです。OceanBaseデータベースは通常、テーブル作成時の列順序でデータを保存し、新しく追加された列は常に最後の列に配置されます。
ヒープ組織テーブル(ヒープテーブル)
ヒープ組織テーブルでは、データは主キーに基づいてソートされずに保存されます。テーブルに1行のデータを挿入する際、データの順序はランダムになります。この構造では、主キーインデックスは実際には2次唯一インデックス、すなわち非クラスタインデックスとなります。データとインデックスが分離されているため、データ書き込み時にソートを考慮する必要がなく、データの書き込みパフォーマンスが向上します。
ヒープ組織テーブルのデータは無秩序です。インデックスはキー値を順序付けることができますが、データ自体には特定の順序はありません。
行ストレージ
行はマイクロブロック内に保存され、通常、行のすべての列は一緒に保存されます。テーブルにBLOB型データが含まれる場合、そのデータが占有するストレージ容量はマクロブロックのサイズを超えることがあります。この場合、BLOB型データは他のマクロブロックにオーバーフローして保存されます。
列ストレージ
列ストレージは、データを列単位で保存するデータベースストレージ方式です。列ストレージモードでは、各列のデータは独立したSSTableとして保存され、すべての列のSSTableが組み合わさって仮想的なSSTableを形成し、ユーザーの列ストレージのベースラインデータとなります。この方法は、クエリパフォーマンスを効果的に向上させ、ストレージ容量の消費を削減することができます。
NULL値の保存
OceanBaseデータベースではNULL値を保存することができます。保存時には、1バイトを使用して列がNULLかどうかを示します。