У меня есть база данных с большим количеством сенсорных логов (+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 час.