H2Databaseを追っかけていたりしたブログ

H2 database のリリースノートを読んだりとか。

h2databaseを読む3

データがデータファイルに具体的にどのように書き込まれているかを見てみます。

f:id:ysobj:20140607124441p:plain

PageDataLeafをみると、キーとそのオフセット(キーに該当するデータの位置)がデータファイルの前のほうから、実データはデータファイルの後ろの方から並べています。オフセットからオフセットの間がちょうど1行のデータとなります。

1行のデータはどのようになっているかというと次のような感じになっています。

f:id:ysobj:20140607125733p:plain

まずデータ型で1byte。ここのデータ型はCREATE TABLEで指定するデータ型ではありません。データ型の後、実際のデータが続きますが、ここの長さはデータ型により異なります。NULLやBOOLEAN_TRUE,BOOLEAN_FALSEなど、データ型によってはデータ型だけ存在していて、データの値部分が存在しないものもあります。

ふーん、と思ったのは、数値型についてはvarInt/varLongという可変長のint/longを使っている点です。varIntの場合は1~5バイト使用し、varLongの場合は1~10バイト使用されます。平均的に、そんなに大きい値を使う事はない、ということでトータルでこの方が使用サイズは少なくて済むのかな。なお、varInt/varLongではマイナスの値はそれぞれ5バイト、10バイト使ってしまうので、内部データ型で、INTとINT_NEG、LONGとLONG_NEGというようにそれぞれネガティブ型が用意されていて、格納する場合は正の数として書き込んでいて、値を取得する場合に反転しています。ここらへんは、org.h2.store.Data#readValueあたりに書かれています。

内部データ型としては、NULL型、BOOLEAN_TRUE型、BOOLEAN_FALSE型、INT_NEG型、INT型、LONG_NEG型、LONG型、BYTE型、SHORT型を初めとして、約40数個の内部データ型が存在しています。

データの追加と削除については、ページ分割が発生したり、オーバーフローが発生したりする場合以外は、あんまり面白い事はしていません。byteの配列をSystem.arraycopyで地道に移動したり、0埋めしたり、そんな感じです。