Как ускорить макс (...) запрос - PullRequest
0 голосов
/ 03 октября 2018

У меня медленный запрос, который я пытаюсь ускорить:

 @Query("select max(t.timestamp) from TradeDbo t where t.currencyPair.id = :currencyPairId") 
 Date findMaxTimestamp(@Param("currencyPairId") Long currencyPairId); 

Сущность определяется как:

@Entity()
@Table(name = "Trade",
    indexes =  {  @Index(name = "idx_timestamp_currencypairid", 
      columnList = "timestamp,currency_pair_id")}) 
public class TradeDbo extends Auditable<String> {
  @Id @GeneratedValue   
  @Getter private Long id;

  @Version
  private long version;

  @JoinColumn(name = "currency_pair_id")
  @ManyToOne(fetch=FetchType.EAGER) 
  @Getter private CurrencyPairDbo currencyPair;

  @Column(name = "timestamp")
  @Convert(converter = DateConverter.class)
  @Getter private Date timestamp;
...

и, как вы можете видеть, я имеюопределил индекс для метки времени / currencypairid (см. , как ускорить запрос max () ), который, как я думал, сделал бы max (метка времени) просто чтением последней страницы btree, но это все ещедо добавления индекса.

1 Ответ

0 голосов
/ 03 октября 2018

выполните ваш запрос как

"select max(t.timestamp) from TradeDbo t where t.currencyPair_id = :currencyPairId"

Ваш составной индекс бесполезен для вашей производительности, вы должны изменить последовательность столбцов

columnList = "currency_pair_id,timestamp"

, используя сначала столбец, включенный в условие условия ..

сборка содержимого индекса с использованием столбцов используется для чтения слева направо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...