Поле db4o проиндексировано, но не используется в запросах - PullRequest
1 голос
/ 04 августа 2010

У меня есть простой объект с полем Guid в качестве public Guid _id, это поле проиндексировано.

config.Common.ObjectClass(typeof(ConfigurableObject))
      .ObjectField("_id").Indexed(true);

Когда я открываю файл базы данных в ObjectManager Enterprise, он показывает, что поле проиндексировано!

Но мои запросы чертовски медленны. Это занимает до 5! секунд, в базе данных всего около 50 объектов.

Вот запрос:

private void FindObject<T>(T toFind) where T : ConfigurableObject {
    var query = HeatingSystem.Instance.GetObjectContainer().Query();
    query.Constrain(typeof(T));
    query.Descend("_id").Constrain(toFind._id);

    IObjectSet result = query.Execute();

    /*IList<T> result = HeatingSystem.Instance.GetObjectContainer().Query<T>(
        delegate(T cobj) {
            return cobj._id == toFind.Guid;
        }
    );*/
}

И нативный, и SODA-запрос работают медленно.

Когда я добавляю

config.Common.Diagnostic.AddListener(
   new Db4objects.Db4o.Diagnostic.DiagnosticToConsole());

Там написано: «Рассмотрите возможность индексирования полей, по которым вы запрашиваете».
и: «Не удалось загрузить набор кандидатов из индекса поля»

Я использую db4o 7.12.132.14217 для Compactframework 2.0

редактирование:
Класс с полем Guid:

public abstract class ConfigurableObject {
    private string _description;
    public Guid _id;
}

Вот полный конфиг

public static IEmbeddedConfiguration ConfigDb4O() { 
    IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
    config.Common.OptimizeNativeQueries = true;

    config.Common.ObjectClass(typeof(ConfigurableObject)).ObjectField("_id").Indexed(true);
    config.Common.ObjectClass(typeof(ConfigurableObject)).StoreTransientFields(false);

    return config;
}

Я создаю / открываю БД со следующими данными:

IObjectContainer db = Db4oEmbedded.OpenFile(ConfigDb4O(), "foo.db4o");
...