Оптимизация GROUP BY при присоединении

0
SELECT 
 h1.Date AS Date,
 h1.Currency AS Currency1,
 h2.Currency AS Currency2,
 h1.Account AS Account,
 SUM(h1.Size) AS Size1,
 SUM(h2.Size) AS Size2,
 h1.MaturityDate AS MaturityDate
FROM
 htable h1 JOIN htable h2 ON 
 h1.AssetClass = 'FX' AND
 h2.AssetClass = 'FX' AND
 h1.Date = h2.Date AND
 (SUBSTR(h1.Ticker, 7, 3) <> h1.Currency) AND
 (SUBSTR(h2.Ticker, 7, 3) = h2.Currency) AND
 h1.SecID = h2.SecID
GROUP BY h1.Date, h1.Currency, h2.Currency, h1.Account, h1.MaturityDate
HAVING SUM(h1.Size) <> 0 AND SUM(h2.Size) <> 0)

Запрос выше БЕЗ предложения GROUP BY быстро запрашивается для конкретной даты.

Проблема в том, что когда я добавляю GROUP BY, она становится чрезвычайно медленной, даже если я добавляю определенную дату в предложение HAVING.

Я уже добавил индексы для htable для столбцов Date, AssetClass, SecID, Currency, MaturityDate, а также индекс для комбинации (Date, Account, Currency, MaturityDate).

Это делается в MySQL. У вас есть какие-либо советы по ускорению запроса (я планирую использовать запрос для определения представления)? Спасибо!

  • 0
    Вы должны добавить конкретную дату к предложению where , а не к having has. До агрегации, а не после .
  • 0
    Возможно, вы могли бы переместить условия `= 'FX'` в предложение WHERE вместе с условиями substr .
Показать ещё 4 комментария
Теги:

1 ответ

1

Первый индекс, который приходит мне на ум, я вижу, может улучшить производительность вашего запроса:

htable (AssetClass, Date, SecID) -- if Date is more selective than SecID

Или же

htable (AssetClass, SecID, Date) -- if SecId is more selective than Date

Теперь, если вы хотите сделать еще один шаг, вы можете индексировать виртуальный столбец для SUBSTR(h2.Ticker, 7, 3), путем:

alter table htable add ticker_currency varchar(3) 
  generated always as (SUBSTR(h2.Ticker, 7, 3)) virtual;

Затем добавьте индекс:

htable (AssetClass, SecID, Date, ticker_currency)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню