2014-01-22 2 views
4

У меня есть таблица articles с 500 тыс. Строк. В статье есть список авторов. Я пытаюсь создать запрос, чтобы получить последнюю опубликованную статью для списка авторов.Подзапрос из предложения с использованием HQL

Я использовал следующий HQL запрос, который получает меня, что я хочу, но работает довольно медленно (~ 4s)

  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 или другим способом повысить производительность запроса?

+0

Я ответил на очень похожий вопрос пару месяцев назад. Должен вам помочь. http://stackoverflow.com/questions/32486923/how-to-increase-performance-in-sql-query/32487550#32487550 – jswan

ответ

0

В любом случае вы хотите попытаться выделить данные, которые вы используете для сравнения, если они большие. в первом запросе выше, где у вас есть:

in 
      (select author.id, max(article.publishedAt) 
      from Article article join article.authors author 
      where author.id in (authors_list)) 

Попробуйте положить это заявление в временную таблицу, а затем с помощью этого небольшого набора данных для повышения эффективности. Так это будет выглядеть:

select author.id, max(article.publishedAt) into #temp1 
       from Article article join article.authors author 
       where author.id in (authors_list)) 

select author, article 
      from Article article inner join article.authors author 
      where (author.id, article.publishedAt) in 
      (select author.id, article.publishedAt 
      from #temp1) 
      group by author.id 

Поскольку расчеты сделаны, а затем набор данных меньше, это должно повысить производительность.

Смежные вопросы