2011-06-15 47 views
1

我有一个数据库表与cca。 327 000个条目。 (SQL Server 2005,Hibernate 3)我必须生成一个查询此表300次的报表。 HQL查询看起来是这样的:Hql查询优化 - 返回索引ID或整个对象

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

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

回答

1

我不认为它会帮助你很多首先检索主键。这只会增加您需要运行的查询数量(以及因此花费的时间)。

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

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

0

还要确保你的关联(例如hist.user,hist.user.somethingElseYetAgain)是懒惰地加载而不是渴望的。否则,您的查询将加入比实际需要更多的实例,而不是实例化对象代理。

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