Оптимизация GROUP BY при присоединении - PullRequest
0 голосов
/ 25 мая 2018
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 для столбцов Дата , AssetClass , SecID , Валюта , MaturityDate , а также индекс для комбинации ( Дата , Счет , Валюта , MaturityDate ).

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

1 Ответ

0 голосов
/ 25 мая 2018

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

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...