Je ne suis pas un expert sur ce sujet, et il pourrait être bon de publier sur les forums DB4O à ce sujet, mais je pense que j'ai une solution. Cela implique de ne pas utiliser LINQ et d'utiliser SODA.
C'est ce que j'ai fait. J'ai créé un projet rapide qui remplit la base de données avec 30000 SimpleObject en fonction de la définition de votre message. J'ai alors écrit une requête pour saisir toutes les SimpleObjects de la base de données:
var simpleObjects = db.Query<SimpleObject>(typeof(SimpleObject));
Quand je passai un StopWatch autour d'elle, cette course prend environ 740 millisecondes. J'ai ensuite utilisé votre code pour rechercher 100 nombres aléatoires compris entre 0 et 2999. La réponse était de 772 ms, donc en supposant que ce nombre tire tous les objets hors de la base de données. Je ne suis pas sûr de savoir comment vérifier cela, mais plus tard, je pense que je l'ai prouvé avec performance.
Je suis ensuite allé plus bas. D'après ce que je comprends, le fournisseur LINQ de l'équipe DB4O fait juste une traduction en SODA. Par conséquent j'ai pensé que j'écrirais une requête de SODA pour examiner, et ce que j'ai trouvé était qu'utiliser SODA contre une propriété est mauvais pour la représentation parce qu'il a fallu 19902 ms pour s'exécuter. Voici le code:
private SimpleObject[] GetSimpleObjectUsingSodaAgainstAProperty(int[] matchingIds, IObjectContainer db)
{
SimpleObject[] returnValue = new SimpleObject[matchingIds.Length];
for (int counter = 0; counter < matchingIds.Length; counter++)
{
var query = db.Query();
query.Constrain(typeof(SimpleObject));
query.Descend("Id").Constrain(matchingIds[counter]);
IObjectSet queryResult = query.Execute();
if (queryResult.Count == 1)
returnValue[counter] = (SimpleObject)queryResult[0];
}
return returnValue;
}
penser Alors pourquoi cela serait si mauvais, j'ai décidé de ne pas utiliser une propriété implémentée automatiquement et définir mon auto parce que les propriétés sont en fait des méthodes et non des valeurs:
public class SimpleObject
{
private int _id;
public int Id {
get
{ return _id; }
set
{ _id = value; }
}
}
J'ai ensuite réécrit la requête pour utiliser le champ privé _id à la place de la propriété
La performance était bien meilleure à environ 91 ms. Voici ce code:
private SimpleObject[] GetSimpleObjectUsingSodaAgainstAField(int[] matchingIds, IObjectContainer db)
{
SimpleObject[] returnValue = new SimpleObject[matchingIds.Length];
for (int counter = 0; counter < matchingIds.Length; counter++)
{
var query = db.Query();
query.Constrain(typeof(SimpleObject));
query.Descend("_id").Constrain(matchingIds[counter]);
IObjectSet queryResult = query.Execute();
if (queryResult.Count == 1)
returnValue[counter] = (SimpleObject)queryResult[0];
}
return returnValue;
}
Juste pour vous assurer qu'il est était pas un hasard, j'ai couru la course de test à plusieurs reprises et avons reçu des résultats similaires. J'ai ensuite ajouté un autre 60.000 dossiers pour un total de 90 000, et ce sont les différences de performance:
GetAll: 2450 ms
GetWithOriginalCode: 2694 ms
GetWithSODAandProperty: 75373 ms
GetWithSODAandField: 77 ms
espoir qui aide. Je sais que cela n'explique pas vraiment pourquoi, mais cela pourrait aider avec le comment. De même, le code de la requête de zone SODA ne serait pas difficile à emballer pour être plus générique.
J'ai remarqué que vous avez posté sur les forums db4o: http://developer.db4o.com/forums/57635/ShowThread.aspx. J'ai ajouté un commentaire sur la méthode qu'ils ont recommandée. –