2010-02-07 22 views
2

J'ai 7000 objets dans ma base de données Db4o.Db4o sélectionnez la performance

Lorsque je récupère tous les objets, il est presque instantané. Lorsque j'ajoute un où constrain ie Name = "Chris" cela prend 6-8 secondes.

Que se passe-t-il?

Également j'ai vu quelques commentaires sur l'utilisation de Lucene pour le type de recherche de requêtes quelqu'un at-il de bons liens pour cela?

+0

fyi cela s'est produit en utilisant une requête native –

Répondre

2

Il y a deux choses à vérifier.

  1. Avez-vous ajouté l'assemblage 'Db4objects.Db4o.NativeQueries'? Sans cet assemblage, un native query cannot be optimized.
  2. Vous avez défini un index on the field qui représente le nom? Un index devrait requête beaucoup plus rapide Indice

    cfg.Common.ObjectClass(typeof(YourObject)).ObjectField("fieldName").Indexed(true); 
    
2

Cette question est un peu vieux, mais peut-être cela est de toute utilisation:

Lorsque vous utilisez les requêtes natives, essayez de définir un point d'arrêt sur l'expression lambda. Si le point d'arrêt est réellement appelé, vous rencontrez des problèmes car l'optimisation a échoué. Pour invoquer le lambda, chacun des objets devra être instancié ce qui est très coûteux.

Si l'optimisation a fonctionné, l'arbre d'expression lambda sera analysé et le code réel ne sera pas nécessaire, ainsi les points d'arrêt ne seront pas déclenchés.

Notez également que les paramètres des index sur les champs doivent être effectués avant d'ouvrir la connexion.

Enfin, j'ai un cas test d'objets simples. Quand j'ai commencé sans optimisation de requête et d'indexation (et pire, en utilisant un serveur qui a été obligé d'utiliser le GenericReflector parce que j'ai échoué à fournir le modèle .dlls), c'est aussi 600s pour une requête à trois critères sur environ 100.000 objets. Maintenant, il faut 6s pour la même requête sur les objets 2.5M donc il y a vraiment un énorme gain.