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. У вас есть какие-либо советы по ускорению запроса (я планирую использовать запрос для определения представления)? Спасибо!
Первый индекс, который приходит мне на ум, я вижу, может улучшить производительность вашего запроса:
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)
where
, а не кhaving
has. До агрегации, а не после .substr
.