Using indexes is always a good idea to improve query performance. The following test illustrates index performance impact:
QueryPerformanceBenchmark.cs: RunIndexTest
private void RunIndexTest()
{
Init();
System.Console.WriteLine("Storing " + _count +
" objects with " + _depth
+ " levels of embedded objects:");
Clean();
System.Console.WriteLine(" - no index");
Open(Configure());
Store();
Close();
Open(Configure());
StartTimer();
IQuery query = objectContainer.Query();
query.Constrain(typeof(Item));
query.Descend("_name").Constrain("level1/2");
IList result = query.Execute();
Item item = (Item)result[0];
StopTimer("Querying object with string field: " + item._name);
Close();
System.Console.WriteLine(" - index on string field");
// Open to create index
Open(ConfigureIndex());
Close();
Open(Configure());
StartTimer();
query = objectContainer.Query();
query.Constrain(typeof(Item));
query.Descend("_name").Constrain("level1/2");
result = query.Execute();
item = (Item)result[0];
StopTimer("Querying object with string field: " + item._name);
Close();
}
QueryPerformanceBenchmark.cs: InitForHardDriveTest
private void InitForHardDriveTest()
{
_count = 10000;
_depth = 3;
_filePath = "performance.db4o";
_isClientServer = false;
}
QueryPerformanceBenchmark.cs: ConfigureRamDrive
private IConfiguration ConfigureRamDrive()
{
IConfiguration config = Db4oFactory.NewConfiguration();
config.FlushFileBuffers(true);
return config;
}
Results from the test machine:
Storing 10000 objects with 3 levels of embedded objects:
- no index
Store 30000 objects: 2228ms
Querying object with String field: level1/2: 461ms
- index on String field
Querying object with String field: level1/2: 460ms
Download example code: