【发布时间】:2013-03-11 10:46:54
【问题描述】:
我将很多行放入以前几乎为空的数据库表中,然后我根据该表中的数据创建报告。尽管该表已编入索引,但查询花费的时间太长了,我猜这是因为 Hibernate 每次都对查询进行全表扫描而不是使用索引,因为它认为数据库表只包含几行。
如何使 Hibernate 更新表的数据库统计信息,以便它可以构建合适的查询计划?
【问题讨论】:
-
我假设您可以创建一个使用 native sql option hibernate 提供的调用的存储过程。
-
@rene 我看不到存储过程的来源,一定是更简单的方法
-
H2 的最新版本会自动更新统计信息,因此您无需手动执行此操作。在许多情况下,问题在于查询不会从任何索引中受益。我建议分析哪些查询真的很慢,然后检查为什么不使用索引(使用
explain select或explain analyze select)。 -
@Thomas Mueller ,好吧,我猜他们确实更新了统计数据,但我确定他们不会在每次查询后都这样做。我知道如何解释 SQL 查询,但是我可以做一个休眠调用来让它显示它在执行休眠查询时使用的查询计划吗?
-
统计数据不需要很频繁地更新。在我知道的所有情况下,自动更新就足够了。据我所知,Hibernate 不知道
explain select,因此您需要手动调用它(例如使用 H2 控制台)。但是您可以在 Hibernate 上启用更好的日志记录,以便查看执行了哪些 SQL 语句(可能还有哪些语句很慢)。
标签: hibernate h2 table-statistics