2013-03-11 3 views
1

Je place beaucoup de lignes dans une table de base de données qui était auparavant presque vide, puis je crée un rapport basé sur les données de cette table. Bien que la table soit indexée, les requêtes prennent beaucoup trop de temps et Im devine que c'est parce que Hibernate effectue une analyse de table complète à chaque fois pour la requête au lieu d'utiliser les index car elle croit que la table de base de données ne contient que quelques lignes. Comment puis-je mettre à jour les statistiques de base de données Hibernate pour la table afin qu'elle puisse ensuite construire un plan de requête approprié?Comment obtenez-vous Hibernate pour mettre à jour les statistiques de la base de données?

+0

Je suppose que vous pouvez créer une procédure stockée que vous appelez en utilisant l'option [native sql] (http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html#d0e13646) Hibernate fournit. – rene

+0

@rene Je ne vois pas où les procédures stockées entrent, doit être une manière plus simple –

+0

La version récente de H2 met automatiquement à jour les statistiques, vous n'avez donc pas besoin de le faire manuellement. Dans de nombreux cas, le problème est que la requête ne bénéficie d'aucun index. Je suggère d'analyser quelles requêtes sont vraiment lentes, puis vérifiez pourquoi l'index n'est pas utilisé pour celles-ci (en utilisant 'explain select' ou' explain analysis select'). –

Répondre

2

Mise en veille prolongée peut fonctionner native SQL statements, de cette façon vous pouvez également exécuter analyze:

Query analyze = session.createSQLQuery("analyze"); 
analyze.executeUpdate(); 

Voir aussi la documentation officielle sur native SQL statement execution.

+0

Merci, mais je ne comprends toujours pas quand les statistiques sont mises à jour, hibernate fait-il un appel à analyser si souvent. Ou est la base de données elle-même qui décide d'exécuter l'analyse parfois. Ou est-ce que ça ne fonctionne jamais à moins que je ne le fasse moi-même comme vous le suggérez? –

+0

Hibernate ne l'appelle pas, mais la base de données elle-même le fait (elle maintient un compteur pour chaque table, et s'il y avait beaucoup de changements dans une table, les statistiques sont mises à jour). Comme je l'ai écrit dans le commentaire ci-dessus: "La version récente de H2 met automatiquement à jour les statistiques, vous n'avez donc pas besoin de le faire manuellement." –

Questions connexes