Hql查询优化 - 返回索引的id或整个对象

时间:2011-06-15 09:26:46

标签: java sql-server hibernate hql

我有一个带cca的数据库表。 327 000个条目。 (SQL Server 2005,Hibernate 3)我必须生成一个查询该表300次的报告。 Hql查询如下所示:

select hist from HistoryTable hist where year(hist.date) = :year and 
        hist.user.userId = :userId and hist.entryType = :created

我需要等待3分钟才能生成报告,那么有没有办法优化此查询以更快地运行? 我虽然返回hist.id(因为这是一个主键,因此它被编入索引,我猜它被查找得更快)而不是整个hist对象,然后检索History对象通过其id?也许Hibernate做同样的事情,这不是必要的,然后就没有什么可做的了。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我认为首先检索主键不会对你有多大帮助。这只会增加您需要运行的查询数量(以及所需的时间)。

我宁愿查看报告,看看是否可以减少查询次数。 此外,如果您正在处理大量对象,我会考虑检索标量值而不是完整对象实例(与从数据库中检索普通值相比,Hibernate带来了开销)。

我还要确保所有表都已正确编入索引(测试查询并查看它们的执行方式)。

答案 1 :(得分:0)

还要确保你的关联(例如hist.user,hist.user.somethingElseYetAgain)懒得加载而不是急切。否则,您的查询将加入比所需更多的实例,并实例化实例而不是Object代理。

这可以在查询或映射级别指示。