我有一个包含500k行的表articles
。一篇文章包含作者列表。我试图创建一个查询来获取作者列表的最新发布文章。
我使用了下面的HQL查询,它可以得到我想要的结果,但是运行速度非常慢(大约4秒)
select author, article
from Article article inner join article.authors author
where (author.id, article.publishedAt) in
(select author.id, max(article.publishedAt)
from Article article join article.authors author
where author.id in (authors_list))
group by author.id
在普通SQL中,一个可能更好的查询是:
select * from (
select articles.id, author.id
from articles, article_authors, authors
where articles.id = article_authors.article_id and
article_authors.author_id=authors.id
and author.id in (author_list)
order by articles.publishedAt desc
) b
group by authors.id;
但是Hibernate文档中指出,HQL子查询只能出现在select或where子句中。http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-subqueries
有没有一种方法可以使用HQL模拟这种查询,或者有没有其他方法可以增强查询的性能?
1条答案
按热度按时间8e2ybdfx1#
在这两种情况下,如果用于比较的数据很大,您都希望尝试将其隔离。在上面的第一个查询中,您具有:
尝试先将该语句放入临时表中,然后使用该小数据集以提高效率。
因为计算完成后数据集会变小,所以应该可以提高性能。