Медленный запрос db4o - PullRequest
       5

Медленный запрос db4o

0 голосов
/ 25 февраля 2011

У меня есть база данных с большим количеством сенсорных логов (+10000).Если я ограничу запрос определенным диапазоном даты и времени, он станет ужасно медленным.Как ускорить это?На моей машине разработки это занимает около ~ 150 мс, но на встроенном устройстве это занимает + 20 секунд

Db4objects.Db4o 8.0.160.14822 (.NET)

Query1 (...) медленныйвещь.: - (

public IObjectSet Query1(DateTime begin, DateTime end, Guid[] owners) {
    DateTime startTime = DateTime.Now;

    var query = _db.Query();
    query.Constrain(typeof(LogEntry));
    IConstraint cBegin = query.Descend("Date").Constrain(begin).Greater();
    query.Descend("Date").Constrain(end).Smaller().And(cBegin);

    if (owners != null && owners.Length > 0) {
        IConstraint temp = query.Descend("OwnerGuid").Constrain(owners[0]);
        for (int i = 1; i < owners.Length; i++) {
            temp.Or(query.Descend("OwnerGuid").Constrain(owners[i]));
        }
        cBegin.And(temp);
    }

    System.Diagnostics.Debug.WriteLine(string.Format("DB Query1 QueryBuild: {0}ms", (DateTime.Now - startTime).TotalMilliseconds));
    DateTime startTime2 = DateTime.Now;
    IObjectSet result = query.Execute();

    System.Diagnostics.Debug.WriteLine(string.Format("DB Query1 Execute: {0}ms", (DateTime.Now - startTime2).TotalMilliseconds));
    return result;
}

public IEmbeddedConfiguration ConfigDb() {
    IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
    configuration.Common.ObjectClass(typeof(Owner)).ObjectField("ID").Indexed(true);
    configuration.Common.ObjectClass(typeof(LogEntry)).ObjectField("OwnerGuid").Indexed(true);
    configuration.Common.ObjectClass(typeof(LogEntry)).ObjectField("Date").Indexed(true);

    configuration.File.LockDatabaseFile = false;
    configuration.Common.OptimizeNativeQueries = true;

    return configuration;
}

public class LogEntry {
    public readonly Owner Owner;
    public readonly object Value;
    public readonly DateTime Date;
    public Guid OwnerGuid;

    public LogEntry(DateTime date, Owner owner, object value) {
        Owner = owner;
            OwnerGuid = owner.ID;
        Value = value;
        Date = date;
    }
}

public class Owner {
    public readonly Guid ID;
    public readonly string Name;
    public readonly DataType DataTyp;

    public Owner() { }
    public Owner(ILogable owner) {
        ID = owner.Guid;
        Name = owner.Description;
        DataTyp = owner.DataType;
    }
}

edit: использование ниже

Db4objects.Db4o.IObjectSet queryResult = Manager.Instance.SensorLogger.Query1(begin, end, new Guid[] { iLogable });

int count =  (int)Math.Floor((double)(queryResult.Count / resolution));
if (count == 0) count = 1;
int i = 0;
while (i < queryResult.Count) {
    LogEntry e = queryResult[i] as LogEntry;
    if (e != null) {
        results.Add(e);
    }
    i += count;
}

Или есть способ выбрать только несколько объектов? Скажем, у нас каждые 5 минут снимок в БД, но яснимок нужен раз в 1 час.

...