【问题标题】:How do you get Hibernate to update database statistics?如何让 Hibernate 更新数据库统计信息?
【发布时间】:2013-03-11 10:46:54
【问题描述】:

我将很多行放入以前几乎为空的数据库表中,然后我根据该表中的数据创建报告。尽管该表已编入索引,但查询花费的时间太长了,我猜这是因为 Hibernate 每次都对查询进行全表扫描而不是使用索引,因为它认为数据库表只包含几行。

如何使 Hibernate 更新表的数据库统计信息,以便它可以构建合适的查询计划?

【问题讨论】:

  • 我假设您可以创建一个使用 native sql option hibernate 提供的调用的存储过程。
  • @rene 我看不到存储过程的来源,一定是更简单的方法
  • H2 的最新版本会自动更新统计信息,因此您无需手动执行此操作。在许多情况下,问题在于查询不会从任何索引中受益。我建议分析哪些查询真的很慢,然后检查为什么不使用索引(使用explain selectexplain analyze select)。
  • @Thomas Mueller ,好吧,我猜他们确实更新了统计数据,但我确定他们不会在每次查询后都这样做。我知道如何解释 SQL 查询,但是我可以做一个休眠调用来让它显示它在执行休眠查询时使用的查询计划吗?
  • 统计数据不需要很频繁地更新。在我知道的所有情况下,自动更新就足够了。据我所知,Hibernate 不知道 explain select,因此您需要手动调用它(例如使用 H2 控制台)。但是您可以在 Hibernate 上启用更好的日志记录,以便查看执行了哪些 SQL 语句(可能还有哪些语句很慢)。

标签: hibernate h2 table-statistics


【解决方案1】:

Hibernate 可以运行native SQL statements,这样你也可以运行analyze

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

另见native SQL statement execution的官方文档。

【讨论】:

  • 谢谢,但我还是不明白什么时候更新统计信息,hibernate 是否经常调用分析。或者是数据库本身决定有时运行分析。或者除非我按照你的建议明确自己做,否则它永远不会真正运行?
  • Hibernate 不会调用它,但数据库本身会调用它(它为每个表维护一个计数器,如果表中有很多更改,则更新统计信息)。正如我在上面的评论中所写:“最新版本的 H2 会自动更新统计信息,因此您无需手动执行此操作。”
猜你喜欢
  • 2010-10-13
  • 1970-01-01
  • 2023-02-08
  • 2015-11-10
  • 2012-12-15
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多