2009-09-15 5 views
2

Dans mon application, je voudrais effacer/vider une table (qui est le seul) dans ma base de données SQLite. Je programme en C#. _session est de type NHibernate.ISession. Voici mon code:NHibernate.ISession.Flush() prend beaucoup de temps après un Delete() - Opération

chaîne queryFmt = "FROM {0}"; chaîne query = String.Format (queryFmt, typeName); _session.Delete (requête);
_session.Flush(); Mon exemple-DB comprend plus de 5000 entrées (le fichier s3db a environ 750 Ko de mémoire). La méthode Flush() - nécessite plus de 6 minutes. (Lorsque j'exécute l'opération de suppression dans l'Administrateur SQLite, cela prend moins d'une seconde.)

Comment puis-je vider la table plus rapidement?

Répondre

2

Utilisez un ExecuteUpdate sur une requête HQL Voici un exemple:

using(var session = sessionFactory.OpenSession()) 
{ 

    String hqlDelete = string.Format("delete {0} t",typename); 
    int deletedEntities = session.CreateQuery(hqlDelete).ExecuteUpdate(); 
    session.Close(); 
} 
+0

un changement mineur : c'est "session.CreateQuery ..." et non "hqlDelete.CreateQuery ..." – toni

+0

C'est vrai que j'ai édité cela. Merci :) – Beatles1692

0

Si vous définissez nhib à show_sql = true dans la configuration, quel est le résultat SQL? Après votre réponse, vous pouvez voir que nhib prend tellement de temps parce que ce n'est pas la suppression en bloc des lignes.

Ayende a un poste expliquant here.

+0

pour _session.Delete (...): NHibernate: sélectionnez logentry0_.Id comme Id22_, logentry0_.Message comme Message22_, logentry0_.Type comme Type22_, logentry0_.Catégorie comme Category22_, logentry0_.DateCreated comme DateCrea5_22_, logentry0_.Level comme Level22_ from Logentry0_ =========== pour _session .Flush(): NHibernate: DELETE FROM Log OERE ID = @ p0; @ p0 = 1 NHibernate: SUPPRIMER À partir de Log OERE ID = @ p0; @ p0 = 2 ... NHibernate: SUPPRIMER À partir de Log OERE ID = @ p0; @ p0 = 99 NHibernate: SUPPRIMER À partir de Log OERE ID = @ p0; @ p0 = 100 – toni

Questions connexes