db4o その23(インデクス)

db4oのインデクスに関してはまだ言及していなかった。
db4oは参照クエリの性能向上のために、B-tree構造のインデクスを任意のフィールドに簡単に設定することができる。

PlayerImplクラスの選手名"name"フィールドにインデクスを設定するコードは以下のようになる。

//for Java
Db4o.configure().objectClass(PlayerImpl.class).objectField("name").indexed(true);
//for .NET C#
Db4o.Configure().ObjectClass(typeof(PlayerImpl)).ObjectField("name").Indexed(true);

このコードが実行された後にオープンされたObjectContainerに対してセットされたPlayerImplクラスのインスタンスは、そのnameフィールドに対応したインデクスがデータと共に格納されることになる。

なお、インデクスの指定はJavaではアノテーション、.NET C#ではカスタム属性でクラスに対して宣言的に指定することもできる。

//for Java
public class PlayerImpl implements IPlayer {
    @Indexed
    private String name;
    :
    :
}

//for .NET C#
public class PlayerImpl : IPlayer
{
    [Indexed]
    private String name;
    :
    :
}

アノーテション、又はカスタム属性で設定するお手本のような使い方だが、非常に明示的で解り易い設定方法だ。

肝心のインデクスの効果だが、オブジェクトの構造やデータ件数、項目値の重複の有無などにより変化すると思われるので単純に絶対的な評価を行うことはできないことを前提にした傾向だが、今回のサンプルのような単純なオブジェクト構造とすると、インデクス有りのクエリ性能はインデクス無しに比べてオブジェクトのインスタンス数2万件程度であれば3割増、6万件前後で4割増といった性能差が出ている。
インスタンス数が多くなればもっと差が出ることだろう。